Loading...Loading...
35

Escolhendo as tecnologias de um projeto de Software (Porque escolhemos o Flutter)

By Olympus

Last update 3 months ago

Introdução

Uma das etapas mais importantes - e emocionantes - da etapa que precede o desenvolvimento de um projeto de software é a escolha das tecnologias envolvidas. Muita das vezes essa decisão é sub-julgada, e preferências pessoais ou da equipe são utilizadas sem nem mesmo fazer uma análise do contexto da aplicação.
Muitos desenvolvedores aderem à famosa zona de conforto, e se sentem ameaçados ao sair dela. Porque aprender uma linguagem diferente como Dart se conseguimos atingir praticamente todas plataformas utilizando o bom e velho Javascript?
Qual o seu objetivo ao escolher uma tecnologia? É fazer sua plataforma acessível aos usuários ou criar a melhor experiência possível para o contexto da aplicação? A escolha da tecnologia impacta diretamente na resposta dessa pergunta. Hoje em dia, com a diversidade de frameworks que existem, é possível desenvolver quase qualquer aplicação utilizando HTML+CSS e exportar para qualquer plataforma. Mas será que essa é a melhor solução?
Nesse artigo vamos discutir sobre alguns dos tópicos que nos fizeram escolher o Flutter para o desenvolvimento do projeto do Memo - um projeto open-source de um aplicativo mobile de repetição espaçada focado no tema de programação cujo desenvolvimento está sendo gravado em uma série de videos no canal Lucas Montano.

Suporte da comunidade

Um dos fatores que não é exclusividade do Flutter porém chama a atenção é a sua rápida adoção pela comunidade Open-Source. No dia em que este artigo está sendo escrito, o repositório oficial do Flutter no Github já possui mais de 118 mil estrelas, mais de 8700 issues e 180 Pull Requests abertos, estando posicionado como o 15 repositório mais estrelado do Github.
Estes números mostram o engajamento da comunidade com o framework. Embora não seja uma exclusividade do Flutter, o engajamento impressiona também pelo fato dele ser o irmão mais novo dos frameworks de desenvolvimento híbrido mais famosos, tendo sua primeira release estável feita em Abril de 2018.
Além disso, o Stack Overflow Trends mostra uma crescente de buscas relacionadas à tag Flutter, que na data de escrita desse artigo representam cerca de 2,4% de todas as perguntas feitas na comunidade no mês atual (Abril/2021). Esse é um número muito relevante, principalmente por se tratar de um framework específico, e se torna ainda mais quando comparado aos seus concorrentes no mesmo segmento.

Patrocinado pela Google

Outro ponto de discussão relevante sobre o projeto do Flutter é que ele é um projeto criado e mantido pela Google, assim como o React Native é mantido pelo Facebook. Essa é uma questão que pode pesar tanto positivamente quanto negativamente para o sucesso a longo prazo do projeto.
Um dos pontos positivos é claramente o tamanho e a quantidade de recursos que a Google pode investir no projeto, afinal de contas não é qualquer empresa. Porém um dos pontos negativos é justamente este ser um projeto da Google, a qual tem um histórico de projetos "assassinados" considerável. Sim, é verdade que o Flutter é um projeto de código aberto e poderia ser continuado pela comunidade, porém não é tão simples assim. Se a Google por qualquer motivo que seja decida parar de dar suporte ao desenvolvimento do Framework, muito provavelmente levaria um bom tempo até o projeto ser adotado por outros responsáveis da comunidade do Flutter hoje, visto que os principais contribuidores são funcionários da própria Google.

Empresas adotando o Flutter

Outro ponto importante a cerca da comunidade do Flutter, é o fato de grandes empresas estarem adotando o Flutter como framework principal dos seus produtos. É importante um projeto possuir um bom engajamento na comunidade, porém quando grandes empresas começam a adotar essas ferramentas, começamos olhar estas com outros olhos.
Hoje já temos empresas de renome utilizando as ferramentas do Flutter, tais como
Dentre diversas outras que podem ser vistas neste link
Chamamos a atenção em especial para o caso do Nubank, pois além de adotar o Flutter, os mesmos escreveram um artigo descrevendo a pesquisa que a empresa fez comparando os frameworks React Native, Kotlin Native e Flutter em diversos aspectos como: Estabilidade das APIs, documentação, manutenibilidade do projeto pela comunidade, dentro outros. Recomendamos bastante a leitura do caso de uso deles.

Estrutura similar à outros frameworks híbridos

Para quem está habituado com o React Native, a transição para o contexto do Flutter é muito mais tranquila, pois ambos frameworks utilizam uma estrutura de declaração de UI muito similar - a UI declarativa. O ciclo de vida dos componentes (Widgets no Flutter) também é muito similar. Esse tipo de paradigma de estrutura de interface está se tornando cada vez mais popular, ainda mais com a adoção da Apple pela proposta do Swift UI em 2019 e com o Jetpack da Google.
O Flutter dispõe na sua documentação artigos específicos para desenvolvedores que querem entender mais sobre o framework e possuem backgrounds nas mais diferentes plataformas de desenvolvimento:

Frameworks Híbridos vs Nativos

Outro ponto importante de discussão são as diferenças entre os frameworks híbridos vs os nativos de plataforma. Ambas abordagens tem pontos prós e contras. Alguns que podemos citar são:
  • Custo de desenvolvimento: O desenvolvimento nativo usualmente custa mais do que o desenvolvimento híbrido - tanto em tempo como em dinheiro -, pois é necessário desenvolver as features para cada plataforma específica;
  • Performance: A performance no código nativo vai ser naturalmente superior. Não que os frameworks híbridos não consigam performances boas, mas em geral elas serão piores comparadas ao desenvolvimento nativo para tarefas complexas. O Flutter por exemplo busca entregar pelo menos 60fps de performance, porém entregando até 120fps para devices que suportam telas de 120Hz.
  • Limitações específicas de plataforma: Funcionalidades específicas de plataforma podem não estar disponíveis de forma nativa para o Framework escolhido, visto que não teriam alternativas para outras plataformas que não possuem determinada funcionalidade. O Flutter possui algumas vantagens nesse aspecto porque ele renderiza de forma nativa alguns componentes específicos de plataforma. O Action Sheet do iOS é um exemplo disso, pois o Flutter consegue "portar" essa funcionalidade para o Android também. Algumas funcionalidades muito específicas de contexto, com o Siri Shortcuts no iOS por exemplo, muito dificilmente terão uma solução híbrida, visto que é uma funcionalidade que nem existe no Android. Porém esse é um workaround que teria que ser feito no desenvolvimento nativo de qualquer maneira.
Mas o ponto principal sobre frameworks híbridos vs desenvolvimento nativo não é sobre ficar olhando pontos positivos e negativos apenas. A pergunta sempre que se deve ser feita é: "Qual o contexto da minha aplicação?".
Se o objetivo da aplicação é ser uma calculadora simples com animações não tão complexas, talvez faça mais sentido adotar um framework híbrido. No outro espectro, aplicações que utilizam muito de bibliotecas de realidade aumentada, pode ser que seja mais benéfico recorrer à um desenvolvimento nativo ou a um híbrido que seja focado nesse tipo de experiência (como a Unity). Tudo depende do contexto da aplicação que está sendo desenvolvida.
Uma solução híbrida dificilmente vai se limitar apenas ao ambiente híbrido. Funcionalidades mais complexas precisam recorrer a especificidades da plataforma em questão. Por exemplo, para um leitor de epubs, o iOS disponibiliza uma animação customizada de virada de página, que não existe na plataforma Android de maneira nativa. Esse é um caso onde pode ser necessário recorrer à implementações nativas para obter um resultado similar.
No caso do Memo, fizemos a avaliação que não teríamos, em primeiro instância, nenhum tipo de interação com funcionalidades que sejam específicas de plataforma, tampouco precisaremos utilizar recursos que também dependam de plataforma. O nosso é um dos contextos onde uma aplicação híbrida se encaixa perfeitamente.

Ferramentas auxiliares de desenvolvimento

Uma das grandes vantagens dos frameworks híbridos em relação ao desenvolvimento nativo - especialmente o desenvolvimento nativo de iOS - é a parte de ferramentas de desenvolvimento. Por mais que isso já exista no universo do desenvolvimento Android, para quem vem do meio de desenvolvimento do iOS, algumas questões como Hot Reload, Interceptador de requisições HTTP e outras ferramentas que ajudam muito o processo de desenvolvimento simplesmente não existem. Você apenas trocou a cor de um botão? Na realidade do iOS é necessário fazer uma nova build do projeto para ver essa pequena mudança. Sim, existem algumas maneiras de fazer alguns workarounds para facilitar esse processo, como por exemplo utilizando o debugger LLDB do XCode, porém não existe nenhuma solução nativa e fácil de se utilizar.
A maior parte dos frameworks híbridos (se não todos) possuem essas ferramentas auxiliares que aceleram muito o processo de desenvolvimento. No Flutter por exemplo, temos o Hot Reload, Interceptador de Requisições HTTP, etc.

Flutter vs outros híbridos

Mas porque Flutter? Dada a diversidade de outros frameworks - alguns até mais antigos e de certa forma "maduros" do que o Flutter -, quais os motivos para escolhermos o Flutter em específico?

Cross-Platform

Um dos motivos é que o Flutter é mais do que um Framework híbrido para plataformas mobile. Ele é um framework cross-platform, ou seja, ele gera código nativo para Web, Desktop (macOS & Windows) e Mobile (iOS & Android) a partir de uma única codebase. Na data na qual este artigo está sendo escrito, o Flutter 2 acaba de ser lançado, incluindo suporte para compilação Web.
Isso não significa que vamos lançar o Memo para todas as plataformas para as quais o Flutter gera um binário, porém temos este ponto à nosso favor, onde caso desejemos, podemos utilizar a mesma codebase com alguns pequenos ajustes para lançar a mesma aplicação em outra plataforma além da Mobile.
É importante ressaltar que, na data de escrita desse artigo, a compilação para Web do Flutter acabou de ser lançada na branch stable, porém ela ainda possui diversos pontos que precisam ser melhorados em questões de performance e maturidade. Além disso, a compilação para Desktop ainda está em beta, então por mais que quiséssemos exportar o Memo para Desktop hoje, provavelmente encontraríamos algumas dores de cabeça pelo caminho.

Familiaridade

Por mais que nós acreditemos que a familiaridade com uma tecnologia em específico não possa ditar a escolha da mesma para um projeto, esta serve como um ponto de desempate. Por mais que a familiaridade possa trazer malefícios no mundo de desenvolvimento, como por exemplo trancar o desenvolvedor em uma mesma tecnologia por anos simplesmente pela zona de conforto, ela é benéfica no ponto de vista que acelera bastante o fluxo de desenvolvimento. Muitas das dores de cabeça básicas de tecnologias novas já serão conhecidas, como por exemplo:
  • Serialização / De-serialização de objetos;
  • É uma linguagem tipada? Como são tratados os tipos?;
  • Qual o principal paradigma da linguagem? Orientada a objetos? Estrutural? Funcional?;
  • Facilidade com características específicas da linguagem, como por exemplo protocolos em Swift, extensões em Swift, Typescript e outras linguagens, tipos opcionais em Swift, Dart, Typescript e outras linguagens também, etc.
Então dizer que a familiaridade com alguma tecnologia não ajuda é mentira, no entanto, isso não pode e não deve ser fundamental na escolha da mesma.

Drawbacks (Desvantagens)

Como tudo no mundo de desenvolvimento, é evidente que tanto os frameworks híbridos como os nativos tem pontos positivos e negativos. É muito importante saber na hora de escolher uma ferramenta, não só seus pontos positivos e o que ela vai trazer de benefício para o projeto, mas os negativos também. Alguns pontos que nossa equipe já levantou em relação especificamente ao Flutter nas experiências passadas que tivemos foram:

Demora no lançamento de novas versões do sistema

Naturalmente quando a Apple lança uma atualização do sistema iOS ou a Google uma atualização do Android, é necessário um período de adaptação para que os contribuidores do projeto consigam adaptar o Framework para essa nova versão do sistema. Se até mesmo aplicações em código nativo podem quebrar por causa de bibliotecas nativas que tenham sido alternadas, imagine um Framework da complexidade do Flutter que é construído com base nessas bibliotecas e outras ferramentas que não temos a menor ideia.
Isso que dizer que em uma atualização major dos sistemas - que costuma ocorrer de ano em ano - é necessário aguardar até que o Framework esteja estabilizado para aproveitar das novas funcionalidades lançadas. Isso significa que se o time de desenvolvimento planeja fazer um lançamento de uma novidade junto com o lançamento do sistema, provavelmente vai enfrentar um pouco de dor de cabeça nesse caminho.

Problemas específicos relacionados às plataformas

Outro problema relacionado aos Frameworks híbridos são problemas específicos ao se adaptar as especificidades das plataformas nativas. Para dar um exemplo mais concreto, no contexto do Flutter por exemplo, temos um problema relacionado a integrações com as bibliotecas gráficas dos sistemas operacionais. Recentemente tivemos que lidar com um problema relacionado à otimização gráfica em dispositivos iOS, que mesmo sendo de difícil profiling, é um ponto que precisa ser melhorado no Flutter.
Para problemas mais simples, podemos simplesmente recorrer à uma implementação nativa e fazer a ponte com o Flutter, porém, problemas mais complexos como o citado no exemplo acima, o buraco é um pouco mais embaixo, e a solução pode ser muito mais complexa do que recorrer à implementação nativa.

Conclusão

O objetivo desse artigo é gerar uma discussão sobre a escolha de tecnologias em projetos de software. Vale ressaltar que não existe uma resposta certa para este tipo de decisão, é sempre importante avaliar o contexto da aplicação e da equipe também. Buscamos discutir aqui a adoção em específico do framework do Flutter, trazendo algumas informações e comparativos gerais, sem adentrarmos muito em detalhes específicos das ferramentas.
Mas e vocês? Já utilizaram o Flutter? Preferem algum outro Framework? Conta para para a gente lá no Discord do Lucas Montano!

Tem alguma dúvida?

Caso tenha alguma pergunta, feedback ou proposta, fala com a gente pelo [email protected].