(с)


Обратная совместимость применительно к аппаратным или программным системам означает способность успешно использовать интерфейсы и данные из более ранних версий системы. Этот принцип распространяется не только на программы, которые работают с файлами, созданными в более ранних версиях этих же программ, но и касается ситуаций работы со схожими алгоритмами. Например, Perl поддерживает обратную совместимость с другим языком — Awk, — который Perl был предназначен заменить.


Обратную совместимость легче выполнять, если предыдущие версии системы были разработаны с поддержкой встроенных функций, таких как хуки, плагины или API, которые позволяют добавлять новые возможности вашему софту, однако все из области backward compatibility (c упором на back) может стать головной болью для разработчиков.


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


Разработчик каждый раз принимает трудное решение: должен ли продукт быть обратно совместимым. «Объективно правильного» решения здесь просто нет — в мире достаточно примеров успешной обратной совместимости и отказов от нее. Возможно, чей-то опыт поможет сделать вам правильный выбор прямо сейчас.


Давайте снова поменяем стандарт



Один из самых ярких примеров, когда об обратной совместимости решили забыть, это появление разъема USB 3.1 Type C (USB-C). Многие годы мы не ведали проблем: любой гаджет с разъемом micro- или miniUSB можно было воткнуть в любой соответствующий USB-порт. Но консорциум USB-IF создал разъем Type C, совершенно несовместимый механически ни с одним из сотен миллионов, а то и миллиардов смартфонов, кабелей, зарядных устройств и прочих гаджетов.


Еще одна проблема заключается в том, что не каждый USB-C кабель, порт, устройство и питание совместимы между собой: некоторые кабели с USB-C на обоих концах могут передавать лишь 5 Гбит/с, другие совместимы с 10 Гбит/с, а есть и те, что нельзя использовать для питания.



Ситуация привычная для тех, кто когда-то собирал себе компьютеры самостоятельно или занимался их апгрейдом. За последние 20–30 лет на наших глазах сменилось множество поколений шин и портов, почти каждое из которых не было обратно совместимо с предыдущими. Поменялись буквально все разъемы на материнской плате, и не по одному разу: сокеты процессоров, шины видеокарт и оперативной памяти, разъемы для подключения накопителей и периферии.



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


Универсальный разъем, предназначенный для передачи данных и питания, способен стать единственным портом на устройстве — и в этом несомненный плюс USB Type-C. Можно смириться с отсутствием обратной совместимости в гаджетах, и даже отметить для себя плюсы (более высокую скорость передачи данных и иные параметры электропитания), но в сфере ПО болезненнее воспринимается несовместимость новых версий со старыми. Особенно это касается корпоративных продуктов, стоимость которых и влияние на бизнес-процессы слишком велики.


Геймдев


В экосистеме ПК игры обратно совместимы в течение десятилетий. Такие утилиты как DOSBox позволяют нам играть даже в самые ранние ПК-релизы. Фактор совместимости, при которой переход на новую версию системы с большой вероятностью не влечет за собой проблем, похоже, сыграл роль в текущем доминировании Windows. Да, в результате 32-битные версии Windows поддерживали запуск 16-битного программного обеспечения Windows и некоторый софт MS-DOS (а в 64-битных версиях, соответственно, работают 32-битные программы), но Microsoft получили огромную тяжелую платформу, в которой есть совместимость даже с ошибками.


А как дела у приставок?



Отчет Ars Technica показал, как пользователи Xbox One и Xbox 360 используют свои устройства. Интересно, что данные из отчета по приставке Microsoft совпадают с мнением корпорации Sony, которая не рассматривает обратную совместимость в PlayStation 4 как нечто важное. По мнению руководителя Sony Interactive Entertainment Europe Джима Райана, об этой функции больше говорят, чем реально пользуются. Хотя Sony действительно предоставила возможность скачать игры для PS1 и PS2 на PS4.


Некоторые сайты проводили свои собственные опросы в преддверии выхода Xbox One и PS4 — тогда было отмечено, что многие игроки заявляли о желании обратной совместимости. Microsoft привлекла большое внимание к обратной совместимости с Xbox One. Функция была в целом хорошо реализована, но сейчас не особо привлекает геймеров.


В линейках Nintendo DS и Wii также есть много примеров обратной совместимости.
Геймдевелоперы усилия компаний встретили более воодушевленно — больше не требуется изучать архитектуру с нуля, чтобы воспользоваться преимуществами нового консольного оборудования. Обратная совместимость позволяет относительно просто поддерживать релизы для всех устройств, созданных на основе общей архитектуры.


Обратная совместимость в языках



(с)


Каждый популярный язык программирования имеет ясную эволюцию, большую часть его жизни обозначенную версией: у вас есть Java 5, 6, 7 и т. д., PHP 5.1, 5.2, 5.3 и т. д. Каждая новая версия исправляет ошибки и добавляет функции, но если язык (или платформа) имеет фундаментальные изъяны, то разработчики либо избегают их (если могут), либо учатся жить с ними.


Разработчики языков получают много отзывов от программистов, использующих тот или иной язык программирования в своей работе. Кажется, что однажды выйдет версия языка, в которой все проблемы исчезнут. Но этого не происходит. Почему так? Один из вариантов — обратная совместимость.


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


Учитывая эти проблемы, понятен мотив тех, кто не хочет переходить на новую версию PHP, даже если она лучше, понятнее и безопаснее и т. д. Вы скажете, что это гипотетический пример. Возможно… Но в мире еще есть программисты, которые до сих пор работают на COBOL! Язык появился в 1958 году. К 1997 году активно использовалось около 240 миллиардов строк кода на COBOL, кодом на этом языке обрабатывалось около 90% финансовых транзакций в мире и 75% коммерческих транзакций. Самое интересное — это потрясающая совместимость языка: тот COBOL, который использовался в 60-х, может работать и на современном оборудовании.


Есть продукты, которые в принципе не могут поломать обратную совместимость, потому что это поставит на них крест. Например, Java: основная сфера применения этого языка — бизнес-приложения, по всему миру написано астрономическое количество строк кода, в том числе в огромных корпоративных кодовых базах. Код, написанный 20 лет назад, до сих пор работает. И если завтра выйдет версия Java, в которой разработчики накрутят фантастические фичи, но без обратной совместимости, то никто больше не станет инвестировать очень большие деньги в разработку серьезных — и дорогих — приложений. Так что Oracle придется либо всю жизнь тянуть за собой груз старых версий, либо открывать дорогу нововведениям, но при этом теряя большую долю клиентов. На третий вариант — поддерживать одновременно две ветки Java, с полноценным сопровождением и развитием — не согласится сама корпорация.


В свое время разработчики Python нарушили обратную совместимость, тем самым разозлив кучу пользователей. Большинство программистов не считало язык Python 2.x «ошибочным» или содержащим «фундаментальные изъяны». У них не было таких жалоб, какие появляются у разработчиков на PHP.


Сегодня сообщество языка разделено на два лагеря, при этом масса готовых библиотек под вторую версию не дает многим мигрировать на третью, хотя та и привнесла в язык ряд сильных улучшений. В результате закрепилось мнение, что «Python 3 — это худшее, что могло случиться с сообществом Python».


У проблемы есть и обратная сторона — Python 3 был выпущен в декабре 2008 года, но поддержка языка во фреймворке Django появилась только спустя пять лет.


Хотя нет 100% совместимости между C и C ++, но даже в C ++ есть обратная совместимость с очень ранними функциями языка (включая некоторые функции, унаследованные непосредственно от C).


Накопление технического долга


Иногда проблема возникает потому, что мы просто не в силах предсказать будущее. В 1981 году «Интернета» хватало всем и каждому — была описана первая широко используемая версия протокола IPv4, использующая 32-битные адреса, ограничивающие адресное пространство 4 294 967 296 возможными уникальными адресами.


4,3 миллиарда адресов IPv4 выглядели более чем достаточно для ARPANet. IPv6 появился в 1998 году (описан в RFC2460), но популярности протокол не снискал. Потребовалось более десяти лет, чтобы на проблему ограниченного количества адресов обратили внимание. И вот тогда стало понятно, что гигантская база разработанного и установленного программного и аппаратного обеспечения IPv4 требует сохранения обратной совместимости IPv6 с IPv4.


«Внезапно» выяснили, что IPv6 был разработан без полноценной совместимости с предыдущей версией — узел с поддержкой только IPv6 не может подключиться к узлу, работающему только по IPv4. Переход от IPv4 к IPv6 требовал «двухстековой» фазы, во время которой хост-компьютер взаимодействовал бы с обоими стеками протоколов одновременно, используя стек протокола IPv6 для взаимодействия с другими хост-компьютерами IPv6, а стек протокола IPv4 для взаимодействия с другими хост-компьютерами IPv4.


Некоторые коммутаторы, маршрутизаторы и устройства безопасности также оказались не совместимы с IPv6. Таким образом процесс перехода на IPv6 столкнулся со множеством проблем, решать которые предлагается разными способами. Ни одно из существующих решений нельзя назвать идеальным, но каждое из них найдет свое применение.


Философия обратной совместимости в ПО



Когда задумался, нужно ли в новой версии поддерживать совместимость (с)


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


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


Например, новая версия Skype больше не может устанавливать голосовые и видеосоединения с версиями под Windows XP. И, конечно, некоторые пользователи хотят проигнорировать новый релиз, предпочтя остаться на старом, но таком привычном.


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


Мы сами периодически сталкиваемся со схожими вопросами. При написании облачного решения «горячего» хранения данных Hotbox можно было все полностью создать с «нуля» или использовать существующие наработки в Почте и Облаке Mail.Ru. Написание с нуля позволяет разом избавиться от всего накопившегося технического долга, однако это долго. Минус использования текущих наработок в том, что мы остаемся на языке Perl, для которого сложно находить новых разработчиков в связи с его не самой большой популярностью. Но плюсы этого решения существенно перевешивают: в этом языке у нас огромная экспертиза и наработанные годами инструменты. Так как было критично выпустить продукт в срок — мы решили остановиться на использовании Perl.


В результате получился продукт, который на данный момент нас полностью устраивает. В этом случае «обратная совместимость» вышла за пределы одного лишь сервиса — мы сделали совместимость не только с наработками в других проектах, но и с нашим собственным опытом. Осознание этого факта приводит к простой мысли: не всегда новый язык, новая версия программы или новый гаджет является универсальным решением поставленной перед вами задачи.

Комментарии (12)


  1. vassabi
    16.03.2018 11:34

    Так много букв, чтобы сказать:

    мы решили остановиться на использовании Perl.

    Кстати, а какой Перл — пятый или шестой?


  1. peleron
    16.03.2018 12:29

    Имхо, проблемы «Поддерживать или нет обратную совместимость» по моему нет. Есть проблема — как долго поддерживать обратную совместимость и каким образом. Нп. решение с dosbox мне нравится — создание промежуточного слоя, который транслирует старый API в новый. Но это только для тех приложений, которые уже не развиваются.


  1. IronHead
    16.03.2018 13:13

    Статья про обратную совместимость от мэйлру звучит как издевка.
    А вся проблема в приложении мэйла для андроид, которое обновляется постоянно, при этом старое приложение не может подключится к ящику и проверить почту.
    Вот так обновил все приложения на телефоне, уехал в глуш где ловит только 2G а приложение мэйл тебе и говорит: невозможно войти в аккаунт…
    Обновляешь кое как приложение (часа за два по EDGE) — и о чудо, все начинает работать.
    Хотя бы в сообщении об ошибке пишите что ошибка подключения из за устаревшей версии приложения.


    1. stalinets
      17.03.2018 00:47

      Можно ведь настроить почту дедовским способом (вбить порты, протоколы, логин и пароль) в самом андроиде. Даже java-телефоны часто имели или встроенный почтовый клиент, или лёгкий мидлет для почты.


      1. IronHead
        17.03.2018 10:01

        Конечно можно.
        А еще можно в 2018 году пользоваться ICQ, выпускать жигули и на протонах в космос летать.


        1. NeuroHunter
          17.03.2018 10:44
          +1

          Сарказм не понятен. Электронная почта — универсальный стандарт. За исключением отдельных решений для особых параноиков, с любым почтовым сервером можно использовать любой почтовый клиент. Или вы считаете, что если у меня 5 почтовых ящиков от 5 разных провайдеров — то и почтовых клиентов должно быть 5, по одному от провайдера?


          1. IronHead
            18.03.2018 23:07

            Ниже darkdaskin ответил раньше меня


      1. darkdaskin
        18.03.2018 01:08

        Mail.ru до сих пор не осилили полноценную поддержку IMAP. Например, поиск на стороне сервера не работает, можно только скачать все письма за определённый период и искать по ним локально. А несколько лет назад были периоды, когда IMAP и вовсе не работал, доступ был возможен только через web-интерфейс.


  1. redmanmale
    16.03.2018 17:02

    в этом языке у нас огромная экспертиза

    Экспертиза, блин.
    Как же это надоело, сил нет. Ладно в переводном тексте, но на русском-то зачем так писать?


    Экспертиза это процесс, исследование и т.п. А то, что есть у вас, это не экспертиза, а опыт. Опыт.


    1. KvanTTT
      18.03.2018 00:18

      Может хотели написать экспериенс?


  1. CAJAX
    16.03.2018 20:03

    Многие годы мы не ведали проблем: любой гаджет с разъемом micro- или miniUSB можно было воткнуть в любой соответствующий USB-порт. Но консорциум USB-IF создал разъем Type C, совершенно несовместимый механически ни с одним из сотен миллионов, а то и миллиардов смартфонов, кабелей, зарядных устройств и прочих гаджетов.

    Дааа. Вот же злодеи. Было у нас с десяток разных разъемов и кабелей под них и мы горя не знали, а теперь всего один. Ну бедаа.


  1. zenkz
    16.03.2018 20:25

    Вечная проблема: Бизнес хочет быстрее, а программисты хотят чтобы было хорошо и удобно.
    Чаще всего побеждает бизнес, и в результате получается нечно кривое и с кучей костылей и технического долга — в результате страдают программисты. Умный бизнес в какой-то момент сделает паузу в гонке и позволит закрыть хотя бы самый критичный технический долг, но большинство бизнесов так и продолжит навешивать новый функционал, пока этот монстр не похоронит его (так как стоимость добавления нового функционала будет постоянно расти и в результате через 3-5 лет добавление нового поля в таблицу будет стоить не пару часов, а десятки и сотни).

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