Blog

Por trás do site IngressoPrático - O projeto e o Symfony2 - parte 1

Eriksen Costa28.11.2011 - 17:48(upd: 25.07.2013 - 19:48)

Você está lendo a parte um de Por trás do site IngressoPrático, uma série em quatro posts que mostra como nós usamos o Symfony2 para desenvolver o site.

No último mês de Agosto, escrevi um post com minha visão pessoal sobre o que nós podíamos aprender com o Symfony 2.0. Naquela altura, já tínhamos desenvolvido projetos com Symfony 1.x a estávamos bastante animados com as inovações que o Symfony2 introduziu durante o seu desenvolvimento. Mas nós queríamos testá-lo em um caso do mundo real. É aqui que o IngressoPrático entra em cena.

O projeto

IngressoPrático é um site de vendas de ingressos exclusivo para eventos produzidos por uma importante escola de ballet brasileira. O projeto tinha muitas regras de negócios complexas e algumas bastante únicas. Por exemplo, o pai de um estudante poderia comprar apenas uma cota limitada de ingressos para prevenir uma liquidação rápida dos ingressos (e também um monte de gente frustrada).

Performance era outro problema. As expectativas para comprar os ingressos dos melhores assentos faz com que muitas pessoas aguardem a abertura das vendas. O site deveria estar preparado para um pico alto de tráfego.

Por que Symfony2?

Nós estávamos seguindo o desenvolvimento do Symfony2 de perto. Totalmente reescrito, o framework abraçou padrões PHP (autoloader PSR-0, namespaces e PHPUnit) e a especificação HTTP. Muita coisa ainda estava em desenvolvimento (o refactoring do componente Form tinha sido recentemente integrado no framework), entretanto, estava estável e os desenvolvedores core estavam tomando cuidado adicional para comunicar sobre quaisquer mudança incompatível que tivesse sido introduzida.

Nós também podíamos ter pego o caminho mais fácil e escolhido o symfony 1.x que ainda é um framework atraente, com um ótimo gerador de admin, muitos plugins e excelente documentação. Na outra mão tínhamos um framework mais padronizado, com melhor testabilidade e que havia aumentado o nível para práticas melhores e mais simples. E simplicidade é algo que você deve procurar quando estiver lidando com regras de negócio complexas.

Como nós queríamos testar o Symfony2 em um caso real e o IngressoPrático tinha desafios únicos e complexos, decidimos que seria um bom projeto para desenvolver com o framework.

Além disso, as vendas dos ingressos deveriam ser realizadas através do mapa de assentos do teatro do evento. Isso mais os requisitos do projeto e as complexas regras de negócios das vendas eram claramente um impeditivo para a adoção de um sistema de carrinho de compras (Magento ou Drupal + Ubercart).

Seat Map

Um mapa de assentos para um evento.

Desenvolvimento

Nós tínhamos um prazo apertado. Nós misturamos a aproximação tradicional de gestão de projetos com algumas práticas XP (TDD e iterações). Nós tínhamos fechado o escopo do projeto e dividido-o em quatro iterações de duas semanas cada. O projeto foi desenvolvido por dois desenvolvedores e por um designer terceirizado.

Nós tivemos que misturar as aproximações de gestão de projeto já que nós não estávamos alocados o tempo inteiro no projeto. Algumas iterações tiveram interrupções (indo de dias a um mês) e foram usadas mais para rastrear o progresso do projeto do que para produzir software pronto para produção (apesar que nós tínhamos por mais de 60% do tempo do projeto).

O projeto foi desenvolvido do início de Maio a Setembro. A primeira versão pública foi implantada em 18 de Julho (usando o Symfony 2.0-BETA5). A agenda do cliente consistia de um período de pré-cadastro, vendas de ingressos restritos por cota e venda de ingressos livre. Nosso plano era basicamente ter duas entregas, uma para o período de pré-cadastro e outra para a abertura de vendas. 

Quando você tem um cenário como este, é importante ter um framework que ajude a manter o código limpo. O Symfony2 promove fortemente a separação das preocupações com uma boa experiência para o desenvolvedor, já que a interação com o framework é a mais transparente possível.

O projeto consumiu 427,5 homens/hora, sendo 380 homens para desenvolvimento (de 300 horas estimadas). A aplicação foi implantada 21 vezes em produção.

Bundles e bibliotecas utilizadas

  • Symfony 2.0.3 (Standard Edition)
  • FOSUserBundle
  • LiipFunctionalTestBundle
  • KnpPaginatorBundle
    • Zend Paginator (ZF 2)
    • KnpMenuBundle
    • Doctrine ORM 2.1
      • Doctrine Fixtures
      • Doctrine Migrations
      • Gedmo Doctrine Extensions

Abertura das vendas

Nós fizemos otimizações simples na pilha LAMP para a abertura das vendas (tuning básico no Apache e no MySQL). Apesar da pequena base de usuários, mais de 30% dos ingressos foram vendidos (com limite por cota) na primeira hora. O primeiro dia correspondeu a 46% das vendas totais.

Conclusão

O Symfony2 foi de grande ajuda para o desenvolvimento do site IngressoPrático. A testabilidade melhorada comparada com o symfony 1.x foi muito importante para nós já que tínhamos regras de negócios complexas e únicas. O container de Injeção de Dependência permitiu que criássemos facilmente uma arquitetura orientada a serviços que ajudou a manter o código limpo e bem organizado. O Symfony2 é definitivamente uma excelente novidade para o desenvolvimento de aplicações PHP.