Даже если мы верим «пиши один раз, беги куда угодно», это не совсем то же самое, что вечная обратная совместимость. Прагматично, вы должны ожидать, что будущие версии фреймворков изменят некоторые вещи. Иногда это будет удаление того, что раньше было гарантированным поведением (худшее изменение), в других случаях ошибки в вашем коде будут оставаться незамеченными, пока в какой-то будущей версии библиотеки не обнаружится, что вы полагались на детали реализации, которые не были гарантировано. Реже ваш старый код обнаружит новую ошибку в последней версии.
В идеальном мире мы бы написали код, который полагается только на гарантированное поведение, и гарантии никогда не будут удалены, и, следовательно, действительный код будет продолжать работать вечно. Наоборот, трудно доказать, что ваша программа полностью правильная, и разработчики языка / фреймворка / библиотеки принимают решение о том, смогут ли они добавить улучшения, которые они хотят, при сохранении идеальной совместимости.
Для совместимости, чтобы победить в споре, исходный API должен быть достаточно сильным и достаточно стабильным, чтобы выжить без разрушительных изменений. Если это не так, то будут внесены несовместимые изменения, иначе API будет полностью отменен. В любом случае, ваша программа больше не будет работать, если у вас не спрятана старая версия, чтобы запустить ее.
Вы спрашиваете, как сделать трюк - в первую очередь требуется либо действительно хороший и несколько удачный дизайн интерфейса, чтобы позволить все расширения, которые вы придумали позже, либо же твердое обязательство и «бизнес-кейс» (или не - бизнес-мотив) поддерживать «старую» версию на неопределенный срок. Например, Python 3 не совместим с Python 2, но Python 2 по-прежнему активно поддерживается обновлениями, поэтому старый код Python по-прежнему работает. C99 удаляет только некоторые функции C89, и если ничего не помогает, компиляторы C89 по-прежнему активно поддерживаются. Браузеры поддерживают тысячу и одну старую версию и нестандартные особенности HTML. Я не знаю, как JSF и richfaces сравниваются с ними, или сколько они выводят страниц, которые полагаются на поддержку «старого» (или странного) поведения HTML / CSS / Javascript от клиента.
Так что это может произойти, по крайней мере, на некоторое время. Но есть функции IE6, которые больше не доступны ни в одном браузере, которые можно безопасно выпускать в Интернете (я думаю, вы можете запустить IE6 в изолированной виртуальной машине или на машине, которая вас не волнует), так что это вопрос от чего вы зависели в первую очередь. Могло ли быть предсказано, что проприетарные расширения браузера будут отброшены как камень в будущих версиях? Возможно, но могли ли те разработчики приложений IE6 достичь того, чего хотели, используя надлежащие стандарты, доступные в то время? Не всегда. Даже для тех, кто не связывался с IE6, если ваше приложение попадает в подобную ловушку, вам не повезло.