
c )
Compatibilidade com versões anteriores para sistemas de hardware ou software significa a capacidade de usar com êxito interfaces e dados de versões anteriores do sistema. Esse princípio se aplica não apenas a programas que funcionam com arquivos criados em versões anteriores dos mesmos programas, mas também a situações com algoritmos semelhantes. Por exemplo, o Perl suporta compatibilidade com versões anteriores com outro idioma, Awk , que o Perl deveria substituir.
A compatibilidade com versões anteriores é mais fácil se as versões anteriores do sistema foram desenvolvidas com suporte para funções integradas, como ganchos, plug-ins ou APIs que permitem adicionar novos recursos ao software, no entanto, tudo, desde a área de compatibilidade com versões anteriores (com foco nas costas ), pode ser uma dor de cabeça para os desenvolvedores .
Recuse-o completamente - os usuários de versões anteriores de sistemas e produtos ficarão chateados, perdendo subitamente toda a frota de gadgets ou programas acumulados. Garanta total compatibilidade com versões anteriores - você se tornará refém de decisões anteriores, tornando seu produto pesado, lento ou até incapaz do aumento desejado no desempenho.
Cada vez que o desenvolvedor toma uma decisão difícil: o produto deve ser compatível com versões anteriores. Simplesmente não há solução “objetivamente correta” aqui - no mundo há exemplos suficientes de compatibilidade com versões anteriores bem-sucedidas e falhas. Talvez a experiência de alguém o ajude a fazer a escolha certa no momento.
Vamos mudar o padrão novamente

Um dos exemplos mais impressionantes quando eles decidiram esquecer a compatibilidade com versões anteriores é a aparência do conector USB 3.1 Tipo C (USB-C). Por muitos anos, não conhecíamos os problemas: qualquer dispositivo com um conector micro ou miniUSB poderia ser conectado a qualquer porta USB correspondente. Mas o consórcio USB-IF criou um conector Tipo C, completamente incompatível mecanicamente com centenas de milhões ou até bilhões de smartphones, cabos, carregadores e outros aparelhos.
Outro problema é que nem todos os cabos, portas, dispositivos e fontes de alimentação USB-C são compatíveis: alguns cabos USB-C nas duas extremidades podem transferir apenas 5 Gb / s, outros são compatíveis com 10 Gb / s e existem aqueles que não podem ser usados para comida.

A situação é familiar para aqueles que montaram computadores por conta própria ou os atualizaram. Nos últimos 20 a 30 anos, muitas gerações de ônibus e portos mudaram diante de nossos olhos, quase cada uma das quais não era compatível com as anteriores. Literalmente, todos os conectores da placa-mãe foram alterados e mais de uma vez: soquetes de processador, placas de vídeo e barramentos de RAM, conectores para conectar unidades e periféricos.

Um salto insalubre no mundo dos processadores continua até hoje: um modelo bem animado que você pode dirigir e dirigir depois de alguns anos não pode mais ser colocado em novas placas-mãe. É difícil para os fabricantes resistirem à tentação de fazer regularmente reservas inúteis de ferro entre os usuários, forçando-os a carregar dinheiro para novos modelos. A falta de compatibilidade com versões anteriores não aquece a alma quando um processador comprado há três anos precisa ser substituído por quase o mesmo, porque a placa-mãe morreu.
Um conector universal projetado para dados e energia pode se tornar a única porta do dispositivo - e essa é uma vantagem definitiva do USB tipo C. Você pode chegar a um acordo com a falta de compatibilidade com versões anteriores em gadgets e até observar as vantagens (maior velocidade de transferência de dados e outras configurações de energia), mas na indústria de software a incompatibilidade de novas versões com as mais antigas é mais dolorosa. Isso é especialmente verdadeiro para produtos corporativos, cujo custo e o impacto nos processos de negócios são grandes demais.
Gamedev
No ecossistema de PCs, os jogos são compatíveis com versões anteriores há décadas. Utilitários como o DOSBox nos permitem reproduzir até os primeiros lançamentos para PC. O fator de compatibilidade, no qual a transição para uma nova versão do sistema com alta probabilidade não acarreta problemas, parece ter desempenhado um papel no atual domínio do Windows. Sim, como resultado, as versões de 32 bits do Windows suportaram o lançamento do software Windows de 16 bits e alguns softwares MS-DOS (e as versões de 64 bits, respectivamente, executam programas de 32 bits), mas a Microsoft possui uma enorme plataforma pesada que possui compatibilidade mesmo com erros.
E os consoles?

Um relatório da Ars Technica mostrou como os usuários do Xbox One e Xbox 360 usam seus dispositivos. Curiosamente, os dados do relatório sobre o prefixo da Microsoft coincidem com a opinião da Sony Corporation, que não considera a compatibilidade com versões anteriores no PlayStation 4 como algo importante. Segundo o chefe da Sony Interactive Entertainment Europe Jim Ryan, esse recurso é mais comentado do que realmente usado. Embora a Sony realmente tenha proporcionado a oportunidade de baixar jogos para PS1 e PS2 no PS4.
Alguns sites realizaram suas próprias pesquisas em antecipação ao lançamento do Xbox One e PS4 - então foi observado que muitos jogadores declararam seu desejo de compatibilidade com versões anteriores. A Microsoft chamou muita atenção para a compatibilidade com versões anteriores do Xbox One. A função foi geralmente bem implementada, mas agora não é realmente atraente para os jogadores.
As linhas de produtos Nintendo DS e Wii também têm muitos exemplos de compatibilidade com versões anteriores.
Os desenvolvedores de jogos receberam com mais entusiasmo os esforços das empresas - não é mais necessário estudar a arquitetura do zero para aproveitar o novo equipamento de console. A compatibilidade com versões anteriores torna relativamente fácil manter as liberações para todos os dispositivos com base em uma arquitetura comum.
Compatibilidade com versões anteriores em idiomas

c )
Cada linguagem de programação popular tem uma evolução clara, a maior parte de sua vida é indicada por uma versão: você tem Java 5, 6, 7, etc., PHP 5.1, 5.2, 5.3, etc. Cada nova versão corrige erros e adiciona funções. mas se a linguagem (ou plataforma) tiver falhas fundamentais, os desenvolvedores as evitarão (se puderem) ou aprenderão a conviver com elas.
Os desenvolvedores de idiomas recebem muitos comentários de programadores que usam uma ou outra linguagem de programação em seus trabalhos. Parece que um dia uma versão do idioma será lançada na qual todos os problemas desaparecem. Mas isso não acontece. Porque Uma opção é a compatibilidade com versões anteriores.
O PHP popular tem suas desvantagens, e aqueles que trabalham com ele há muito tempo sabem muito bem como contornar todas as armadilhas e poços da linguagem. Agora, suponha que na nova versão do idioma todos os negativos foram corrigidos, mas eles perderam compatibilidade com versões anteriores. Como resultado, o desenvolvedor gasta tempo atualizando o código para a versão atual do PHP. O mesmo tempo que ele poderia gastar no atendimento de solicitações de clientes ou na introdução de novos recursos.
Tendo em vista esses problemas, é compreensível o motivo daqueles que não desejam mudar para a nova versão do PHP, mesmo que seja melhor, mais clara e segura, etc. Você dirá que este é um exemplo hipotético. Talvez ... Mas ainda existem programadores no mundo que ainda trabalham no COBOL ! A linguagem apareceu em 1958. Em 1997, cerca de 240 bilhões de linhas de código COBOL eram usadas ativamente , o código nesse idioma processava cerca de 90% das transações financeiras no mundo e 75% das transações comerciais. O mais interessante é a incrível compatibilidade de idiomas: o COBOL, usado nos anos 60, pode funcionar em equipamentos modernos.
Existem produtos que, em princípio, não podem quebrar a compatibilidade com versões anteriores, porque isso acabará com eles. Por exemplo, Java: o principal campo de aplicação dessa linguagem são as aplicações de negócios, um número astronômico de linhas de código foi escrito em todo o mundo, inclusive em grandes bases de códigos corporativos. O código escrito há 20 anos ainda funciona. E se amanhã houver uma versão do Java em que os desenvolvedores adicionem recursos fantásticos, mas sem compatibilidade com versões anteriores, ninguém investirá muito dinheiro no desenvolvimento de aplicativos sérios - e caros. Portanto, a Oracle terá que arrastar uma carga de versões antigas por toda a vida ou abrir o caminho para inovações, mas ao mesmo tempo perdendo uma grande parcela de clientes. A terceira opção - oferecer suporte a duas ramificações Java simultaneamente, com suporte e desenvolvimento completos - a própria empresa não concorda.
Ao mesmo tempo, os desenvolvedores de Python violaram a compatibilidade com versões anteriores, irritando muitos usuários. A maioria dos programadores não considerou o Python 2.x “errôneo” ou contendo “falhas fundamentais”. Eles não tiveram as mesmas reclamações que os desenvolvedores de PHP.
Hoje, a comunidade de idiomas é dividida em dois campos, enquanto a massa de bibliotecas prontas para a segunda versão não permite que muitos migrem para a terceira, embora tenha trazido várias melhorias fortes no idioma. Como resultado, a opinião foi firmemente estabelecida de que " Python 3 é a pior coisa que poderia acontecer à comunidade Python ".
O problema tem uma desvantagem - o Python 3 foi lançado em dezembro de 2008, mas o suporte ao idioma no framework Django apareceu apenas cinco anos depois.
Embora não haja 100% de compatibilidade entre C e C ++, mesmo em C ++, há compatibilidade com funções de linguagem muito antigas (incluindo algumas funções herdadas diretamente de C).
Acumulação de dívida técnica
Às vezes, surge um problema porque simplesmente não podemos prever o futuro. Em 1981, a Internet era suficiente para todo mundo - a primeira versão amplamente usada do protocolo IPv4 foi descrita, usando endereços de 32 bits, limitando o espaço de endereço de 4.294.967.296 para possíveis endereços únicos.
4,3 bilhões de endereços IPv4 pareciam mais que suficientes para o ARPANet. O IPv6 apareceu em 1998 (descrito na RFC2460 ), mas o protocolo não ganhou popularidade. Foram necessários mais de dez anos para prestar atenção ao problema de um número limitado de endereços. E então ficou claro que a gigantesca base de software e hardware IPv4 desenvolvido e instalado requer manutenção da compatibilidade com versões anteriores do IPv6 com o IPv4.
“De repente” descobriu que o IPv6 foi desenvolvido sem compatibilidade total com a versão anterior - um host que suporta apenas IPv6 não pode se conectar a um host que funciona apenas com IPv4. A transição do IPv4 para o IPv6 exigiu uma fase de duas pilhas, durante a qual o computador host interagia com as duas pilhas de protocolos simultaneamente, usando a pilha de protocolos IPv6 para interagir com outros computadores host IPv6 e a pilha de protocolos IPv4 para interagir com outros computadores host IPv4 .
Alguns comutadores, roteadores e dispositivos de segurança também não eram compatíveis com o IPv6. Assim, o processo de transição para o IPv6 enfrentou muitos problemas, propostos de várias maneiras . Nenhuma das soluções existentes pode ser considerada ideal, mas cada uma delas encontrará sua aplicação.
Filosofia de compatibilidade com versões anteriores de software

Quando pensei sobre se é necessário manter a compatibilidade nas novas versões
Em software, a compatibilidade com versões anteriores, via de regra, implica um forte aumento no tamanho dos arquivos e de todo o aplicativo, mas o mais importante não é isso. A compatibilidade com versões anteriores geralmente exige o transporte de bagagem histórica, que em idiomas interpretados geralmente leva a perdas de desempenho perceptíveis.
Com compatibilidade com versões anteriores, a base de código é inflada, a arquitetura do aplicativo é complicada e a atualização dos aplicativos é complicada. Há um desejo de rejeitar o antigo e escrever um código compacto e leve que use os desenvolvimentos mais modernos.
Por exemplo, a nova versão do Skype não pode mais estabelecer conexões de voz e vídeo com versões no Windows XP. E, é claro, alguns usuários querem ignorar o novo lançamento, preferindo permanecer no antigo, mas tão familiar.
Sim, hoje a compatibilidade com versões anteriores é considerada uma das condições mais importantes no desenvolvimento de produtos de software. Ele permite aos usuários o menos indolor - e, portanto, confortável - mudar para novos produtos. Para os fabricantes de consoles de jogos, por exemplo, é importante garantir a compatibilidade com versões anteriores de novos jogos com gadgets antigos, a fim de maximizar a audiência de potenciais compradores. Mas, ao mesmo tempo, é mais difícil para os desenvolvedores implementar um novo nível de gráficos e física realistas, que, ironicamente, podem reduzir a atratividade do sistema para os jogadores.
Ocasionalmente, nós mesmos encontramos problemas semelhantes. Ao escrever uma solução de armazenamento em nuvem Hotbox , você pode criar completamente tudo do zero ou usar os desenvolvimentos existentes no Mail e Mail.Ru Cloud. Escrever do zero permite que você se livre de toda a dívida técnica acumulada de uma só vez, mas leva muito tempo. A desvantagem de usar os desenvolvimentos atuais é que permanecemos na linguagem Perl, para a qual é difícil encontrar novos desenvolvedores devido à sua pouca popularidade. Mas as vantagens desta solução superam em muito: neste idioma, temos uma enorme experiência e ferramentas desenvolvidas ao longo dos anos. Como era essencial lançar o produto no prazo, decidimos nos concentrar no uso do Perl.
O resultado é um produto que atualmente nos convém completamente. Nesse caso, a “compatibilidade com versões anteriores” foi além do escopo de apenas um serviço - fizemos compatibilidade não apenas com desenvolvimentos em outros projetos, mas também com nossa própria experiência. A conscientização desse fato leva a um pensamento simples: nem sempre um novo idioma, uma nova versão de um programa ou um novo gadget é uma solução universal para sua tarefa.