can3p (can3p) wrote,
can3p
can3p

Совместимость

В мире нет ничего лучше обратной совместимости и нет ничего хуже, когда эту совместимость ломают. Электрический штепсель, например, почти не меняется. Дедушкино радио можно по-прежнему воткнуть в разетку, и оно будет играть. А вот монитор к ноутбуку подключить вполне может не получиться, как и старый юсб девайс, как и не такие уж и старые проводные наушники. Можно сколько угодно объяснять, что новый разъем даст лучше картинку или звук, но теперь я не могу использовать мой монитор в принципе. Но здесь хотя бы обратная совместимость меняется явно, ее можно увидеть и пощупать, и это не так уж плохо. Можно было бы из розетки подать не 220 переменного, а 440. Звучит абсурдно, но именно так происходит сплошь и рядом при разработке ПО.

Если у вас есть проект, и у проекта есть внешние зависимости, то самое последнее, чего хочется - это обновлять зависимости. Почему? Потому что это совершенно неопределенный риск, который может отнять 20 минут, а может отнять пару месяцев или пару лет. Причем Джанго еще известен своим крайне осторожным отношением к обратной совместимости. Некоторые особенно просвещенные разработчики могут что-то ломать в каждом релизе. Можно говорить, что корпорации любят java потому что проще нанять разработчиков, что правда, но еще больше они ее любят, потому что в джава сообществе не принятно ломать вещи ради красоты, и поэтому не надо тратить неделю в месяц на обновление чего-то.

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

Представим себе псевдо язык и предикат в публичном апи.

function isBla(a: FancyClass) -> boolean {  
  return your ? logic : there  
} 

Все же понятно если в новой версии возвращает булево значение, то ошибки не будет, все скомпилируется на ура.

А что, если автор ловил какой-то баг и временно пофиксил так?

function isBla(a: FancyClass) -> boolean {  
  if (Math.random() < 0.001) {  
    return false;  
  }  
 
  return your ? logic : there  
} 

Можно заменить случайное число на редкую комбинацию параметров, которую в ни за что не воспроизведете на локальной машине, но которая будет вам портить пользовательские данные на боевой инсталляции.

Иногда для таких поломок есть веская причина, но порой она не настолько весома, как кажется разработчикам, после чего бывает по разному, вплоть до смерти проекта. Особенно это болезненно, если старая версия просто работает и позволяет решать людям те задачи, которые их наняли решать. Из пары такие примеров - быстрая и незаметная миграция с Python 2 на Python 3, разные версии Angular JS, разные версии Ext.JS/Sencha.

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

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

Одна из причин, почему поломки все же происходит - это фундаментализм разработчиков. Код, написанный год назад уже не выглядит таким же красивым сегодня, и его хочется как следует переписать. К тому же поддерживать легаси - это не самое веселое занятие в мире (можно почитать охи и вздохи разработчиков Microsoft Windows, которая, несмотря на всю критику, впечатляюще относится к обратной совместимости). А еще, при разработке ПО не видно реальных пользователей и сложно представить масштаб проблемы.

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

Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments