Um dos aplicativos mais recentes do Facebook, o Moments, está utilizando C++ para compartilhar sua lógica de negócios em iOS e Android. Os engenheiros do Facebook Ashwin Bharambe, Zack Gomez e Will Ruben explicam quais fatores influenciaram essa escolha e quais os resultados.
Inicialmente, os engenheiros do Facebook decidiram mover a lógica do servidor para a aplicação cliente, com o objetivo de focar exclusivamente na aplicação cliente e fazer o ciclo de desenvolvimento-execução-teste o mais curto possível. A desvantagem desta escolha foi o crescimento do código necessário para as duas plataformas inicialmente escolhidas: iOS e Android.
Dentre as muitas alternativas disponíveis para compartilhar código entre as plataformas, os engenheiros do Facebook decidiram escrever o código de interface gráfica (UI) na plataforma específica, e a lógica de negócios em código compartilhado usando C++. A linguagem C++ possibilita escrever aplicações de alto desempenho, embora não tenha abstrações de alto nível, e permite que o programador trate o gerenciamento de memória. Ainda assim, os programadores do Facebook foram capazes de implementar rapidamente código memory-safe com alto desempenho, usando as funcionalidades modernas do C++, tal como: std::shared_ptr, lambdas e auto declarations.
Os engenheiros do Facebook se esforçaram para manter a camada da API C++ simples através de algumas decisões fundamentais:
- Codificação no estilo funcional, o que resulta na conversão de objetos de dados raw em view models imutáveis por padrão;
- Fluxo de dados em uma única direção, métodos para realizar as transformações necessárias de view models exigidas por específicas views;
- Camada de cache, quando o profilling mostrou que era apropriado, para evitar calcular mais uma vez resultados intermediários inalterados.
Na plataforma Android, há a questão adicional de geração de bindings para código específico da plataforma. Para isso, os engenheiros usaram Djinni do Dropbox para converter view models de C++ para Java. Também foi reescrito o gerador de código Djinni para atender melhor a abordagem funcional que foi escolhida para o projeto, e para otimizar o garbage collector. Já na plataforma iOS, o Objective-C++ pode ser utilizado para integrar perfeitamente com código C++.
Esta abordagem tornou possível compartilhar a maior parte de regras de negócios do aplicativo Moments entre iOS e Android, o que representa cerca de um terço da base de código em cada plataforma. E, por fim, os engenheiros do Facebook notaram que graças a esta abordagem "tem sido possível criar novas características com muito menos trabalho e menos bugs". Podendo "calcular de forma mais flexível o tempo de engenharia entre as duas plataformas, o que permite realizar releases simultâneos em ambas as plataformas".