Por que Laravel?
Por que escolher o Laravel para construir este projeto?
Observação: este é um post técnico.
Depois de lançar o Monica no Hacker News, recebi muitas perguntas sobre por que escolhi escrever a ferramenta em PHP e, em particular, com Laravel. Fiquei surpreso com tantas perguntas sobre o assunto, porque considero que a linguagem não importa: só conta o que você faz com ela.
Neste post vou contar por que escolhi PHP e Laravel e quais dificuldades precisei superar para construir a primeira versão do produto. O texto não pretende começar uma guerra entre linguagens.
O PHP tem uma história interessante. Muitos ótimos desenvolvedores web, que provavelmente não usam mais PHP, aprenderam com ele as bases da programação. Era simples de usar e de começar e, embora não fosse uma linguagem elegante, abriu caminho para carreiras no desenvolvimento web. Com o tempo, o PHP passou a ser menos amado, a ponto de ser quase vergonhoso usá-lo ou até dizer em um meetup que sua empresa o utilizava. Outras linguagens, sem dúvida mais elegantes, ganharam muita popularidade (Python, Ruby) graças a frameworks maravilhosos construídos sobre elas. Ao mesmo tempo, surgiram novos frameworks PHP. O Symfony, por exemplo. Mas o Symfony ainda era difícil de aprender e de usar. E então o PHP morreu. Ou pelo menos era o que diziam, ignorando aparentemente que muita gente do mundo dos negócios continuava usando e gostando dele. Depois veio o PHP 5.5, seguido do PHP 7, e apareceu um framework com um nome estranho: Laravel. E a mentalidade das pessoas mudou completamente. O PHP ainda não é tão elegante quanto outras linguagens populares, mas as coisas melhoraram muito. E ele também ficou rápido.
Mesmo assim, o PHP continua sendo a linguagem que as pessoas adoram odiar, especialmente no Hacker News. Dizem que o PHP não escala. Provavelmente é por isso que o Facebook e o Mailchimp, entre outros grandes nomes, usam PHP hoje, em grande escala.
Com esse contexto em mente, por que escolhi PHP e Laravel?
- O PHP é simples de aprender e simples de usar.
- Existem muitos desenvolvedores PHP e, se as pessoas quiserem trabalhar comigo no projeto, o grupo potencial de desenvolvedores PHP é maior, pelo menos onde eu moro, do que o de Ruby ou Python. Além disso, há muita gente no GitHub usando PHP e, se eu quisesse que este projeto de código aberto ganhasse tração, tinha que escrevê-lo em uma linguagem em que pessoas de diferentes níveis pudessem contribuir com facilidade.
- O mais importante ao escolher uma pilha tecnológica para um projeto novo é o quanto será fácil mantê-lo no longo prazo. O PHP é simples. É fácil de depurar (embora pudesse ser melhor) e fácil de escalar (embora isso não seja de forma alguma minha preocupação agora).
- O Laravel é de longe o melhor framework PHP que já usei. Ele torna simples fazer coisas complexas. Fica claro que o framework foi criado para iniciar novas aplicações web bem rápido, e é um verdadeiro prazer usá-lo. Mas o grande diferencial do Laravel é a qualidade da documentação, comparada à de outros frameworks PHP e até de muitos frameworks em outras linguagens. Tudo é extremamente bem documentado. Não consigo enfatizar o suficiente como uma boa documentação é importante (o que me lembra que eu deveria documentar ainda mais o Monica).
- Há uma enorme comunidade em torno do PHP e do Laravel em particular: Laracasts, Forge, Envoyer e uma comunidade forte no Slack, para citar algumas. Se você precisar de ajuda, há muita gente pronta para dar uma mão.
Quais desafios enfrentei durante o desenvolvimento deste projeto?
No geral não tive tantos desafios ao desenvolver a versão atual do Monica. Não é uma aplicação complexa e não tenho problemas de escala, já que a base de usuários ainda é pequena (cerca de 7800 usuários no total e 4300 ativos). Mas há detalhes de implementação que fiz errado, não por má prática, mas porque minhas habilidades técnicas não eram suficientes para resolver esses problemas no curto prazo. Espero que listar esses erros ajude outras pessoas a não cometê-los, ou que gente gentil me escreva contando como eu poderia tê-los corrigido.
- Em versões anteriores, eu usava muitos eventos e listeners. O conceito é ótimo, mas tive muitos problemas para testar unitariamente as classes base por causa deles. Além disso, quanto mais os usava, mais mágica acontecia nos bastidores. Achei que quem entrasse no código teria dificuldade para entender por que certas coisas aconteciam quando um objeto era criado, por exemplo. Na minha cabeça, eventos e listeners tornavam a aplicação mais difícil de entender, então decidi remover todos (bem, 99% deles, ainda há dois listeners dos quais preciso me livrar).
- No começo, o banco de dados era inteiramente criptografado. Por razões que ainda não entendi, de vez em quando havia bugs no processo de descriptografia, resultando em dados que eu não conseguia recuperar. Como não queria lidar com esse problema naquele momento, decidi remover a criptografia. Além disso, dados criptografados tornavam impossível qualquer ordenação ou busca nas consultas, o que teria sido problemático no longo prazo. Tenho certeza de que há soluções para esses dois problemas, mas eu queria focar em criar novas funcionalidades em vez de resolver esse único ponto.
- Não escrevi testes unitários antes de lançar a aplicação. Isso me custou caro. Não acho que devamos buscar 100% de cobertura, mas ao menos ter algum tipo de teste para as funcionalidades principais do site. Caso contrário, você acaba com uma tonelada de bugs em que não havia pensado e, enquanto tenta corrigi-los, outras partes da aplicação são afetadas pela correção. Isso vira um pesadelo rapidinho. O Laravel torna os testes unitários muito fáceis: eu deveria ter levado isso mais a sério. A partir da próxima versão, nenhum pull request será integrado sem testes unitários e talvez até testes funcionais.
Conclusão
Estas são algumas razões pelas quais escolhi o Laravel. Como disse no começo do post, seu projeto não é sobre a linguagem. A menos que o objetivo do projeto seja aprender uma linguagem nova, você não deveria passar semanas escolhendo linguagem ou framework. Fique com o que você conhece e faça alguma coisa. Seus usuários não vão se importar se o código é feio ou se você escolheu Python em vez de Ruby.