Uma das coisas que mais gosto no navegador da Web Chrome do Google é que o a frequência com que ele é atualizado. Mas agora que o Chrome se tornou um sucesso onze versões em dois anos e meioEm um período de dois anos, a emoção de ver o número da versão aumentar já passou. Parece que, a essa altura, eles já colheram todos os frutos mais fáceis e estão apenas polindo. Os destaques do Versão 11, a versão atual do Chrome?
API de entrada de fala HTML5. Ícone atualizado.
Emocionante, não é? Embora não tenha havido falta de preocupação com o novo ícone, é claro.
O número da versão do Chrome tem mudado tão rapidamente ultimamente que, toda vez que alguém abre um bug do Chrome em um site do Stack Exchange, tenho que comparar a minha versão com a deles para ter certeza de que ainda estamos falando do mesmo software. E uma vez – eu juro que não estou inventando isso – o senhor não pode fazer isso. a versão aumentou enquanto eu estava verificando a versão.
Foi nesse dia que parei oficialmente de me preocupar com a versão do Chrome. Quero dizer, eu me importo no sentido de que às vezes preciso verificar suas dogtags na batalhamas, como usuário regular do Chrome, não me considero mais um usuário do uma versão específica do Chrome, eu simplesmente… uso o Chrome. Qualquer que seja a versão mais recente, eu a tenho automaticamente.
Há muito tempo, os navegadores da Web são fortemente associados a versões específicas. A simples menção do Internet Explorer 6 ou do Netscape 4.77 deve causar um arrepio na espinha de qualquer nerd que se preze. E por um bom motivo! Quem pode esquecer o grande sucesso do Firefox 3 ou as épocas que o Internet Explorer 7, 8 e 9 representam na história da Microsoft. Mas o Chrome? O Chrome é tão fluido que transcendeu completamente o controle de versão do software.
Essa fluidez é difícil de obter em um software cliente que é executado em milhões de PCs, Macs e outros dispositivos. O Google dedicou um esforço extremo de engenharia para fazer com que o processo de atualização automática do Chrome “simplesmente funcionasse”. Eles otimizaram ao máximo o processo de atualização.
Em vez de enviar uma atualização totalmente nova de 10 MB [for each version], enviamos um diff que pega a versão anterior do Google Chrome e gera a nova versão. Experimentamos vários algoritmos de comparação binária e, até agora, usamos o bsdiff. Somos grandes fãs do bsdiff – ele é pequeno e funcionou melhor do que qualquer outra coisa que tentamos.
Mas o bsdiff ainda estava produzindo diferenças maiores do que achávamos necessário. Por isso, escrevemos um novo algoritmo de diff que sabe mais sobre o tipo de dados que estamos enviando – arquivos grandes contendo executáveis compilados. Aqui estão os tamanhos da recente atualização 190.1 -> 190.4 no canal do desenvolvedor:
- Atualização completa: 10 megabytes
- Atualização do bsdiff: 704 kilobytes
- Atualização do Courgette: 78 kilobytes
O tamanho pequeno, combinado com a atualização silenciosa do Google Chrome, significa que podemos atualizar com a frequência necessária para manter os usuários seguros.
Google’s Abobrinha — (a palavra francesa para abobrinha, por incrível que pareça) é uma incrível otimização de software, capaz de produzir diferenças incrivelmente pequenas de executáveis binários. Para conseguir isso, ele precisa conhecer detalhes íntimos sobre o código-fonte:
O problema com os aplicativos compilados é que mesmo uma pequena alteração no código-fonte causa um número desproporcional de alterações no nível do byte. Quando o senhor adiciona algumas linhas de código, por exemplo, uma verificação de intervalo para evitar um buffer overrun, todo o código subsequente é movido para abrir espaço para as novas instruções. O código compilado está repleto de referências internas em que alguma instrução ou dado contém o endereço (ou deslocamento) de outra instrução ou dado. São necessárias apenas algumas alterações no código-fonte para que quase todos esses ponteiros internos tenham um valor diferente, e há muitos deles – cerca de meio milhão em um programa do tamanho do chrome.dll.
O código-fonte não tem esse problema porque todas as entidades no código-fonte são simbólicas. As funções não são atribuídas a um endereço específico até muito tarde no processo de compilação, durante a montagem ou a vinculação. Se pudéssemos retroceder um pouco e tornar os ponteiros internos simbólicos novamente, poderíamos obter atualizações menores?
Como as atualizações de versão são relativamente pequenas, elas podem ser baixadas em segundo plano. Mas nem mesmo o Google descobriu como instalar uma atualização enquanto o navegador está em execução. Sim, há pequenos ícones de alerta para avisar que o navegador está desatualizado e, eventualmente, o usuário é avisado se estiver muito atrasado, mas atualização sempre requer que o navegador seja reiniciado.
Os aplicativos da Web têm muito mais facilidade, mas também têm problemas de entrega de versões. Considere o WordPress, um dos maiores e mais populares aplicativos da Web do planeta. Executamos o WordPress em vários blogs e temos até mesmo nossa própria comunidade do WordPress. O WordPress não se atualiza automaticamente para cada nova versão, mas faz isso da forma mais simples que já vi em um aplicativo da Web. Clique no link de atualização no painel de controle e o WordPress (e seus complementos) se atualiza sozinho para a versão mais recente. Pode haver uma breve interrupção no serviço para os visitantes do seu site WordPress, mas depois o senhor volta a trabalhar com a atualização mais recente.
O WordPress precisa que todos atualizem regularmente para as versões mais recentes pelos mesmos motivos que o Google Chrome: segurança, desempenho e estabilidade. Uma Internet repleta de instalações antigas e sem patches do WordPress ou do Chrome não é menos perigosa do que uma Internet repleta de máquinas antigas e sem patches do Windows XP.
Esses dois processos de atualização são relativamente simples. Mas eles não são nem de longe tão perfeitos quanto os da deveriam ser. Atualizações com um clique que exigem notificação e reinicialização não são suficientes. Para obter a versão infinita, nós, engenheiros de software, temos que ir muito mais fundo.
De alguma forma, temos que ser capazes de atualizar automaticamente o software enquanto ele está em execução, sem interromper o usuário. Não se — mas quando — a versão infinita chegar, nossos usuários provavelmente nem saberão. Ou se importarão. E é assim que saberemos que atingimos nosso objetivo.