Desafios e Soluções Criativas de um Projeto Real.

Olá pessoal, espero que este relato encontre vocês bem. Sou desenvolvedor de software e, apesar de ainda ter pouca experiência de mercado, acabei tendo uma ideia para um projeto. Trata-se de um site de pesquisa eleitoral e, antes de você sair do post, peço que termine de ler, pois preciso da opinião sincera de vocês sobre o que teriam feito diferente.

A ideia

Como é ano eleitoral, presenciei muitas discussões entre colegas, amigos e familiares sobre quem estaria à frente nas pesquisas eleitorais. Muitas vezes, mencionavam pesquisas que nunca eram divulgadas. Foi então que pensei: por que não criar um site "simples" onde aparecessem as fotos dos candidatos e, ao clicar, o usuário fosse redirecionado para um gráfico mostrando a quantidade de votos de cada candidato? Sem pesquisar sobre legislações e outras questões, rabisquei o fluxo inicial de como eu queria que fosse no Excalidraw.

Simples e sem custo

Eu sempre tive em mente que não queria gastar dinheiro, nem para comprar domínio, nem para hospedar de forma segura, entre outros. Eu queria algo de qualidade e gratuito. Apesar de ser trabalhoso no início, no fim, consegui!

Tecnologias

Eu tenho conhecimento em algumas linguagens de programação, como Golang, Kotlin, JavaScript, Java e C. Embora não seja mestre em nenhuma delas, já trabalhei em projetos reais com todas. Como estou me especializando em Golang, escolhi essa linguagem, pois queria algo leve, com baixo custo de processamento, memória e que respondesse bem a muitas requisições. Foi a escolha ideal.

Decidi manter o projeto simples, sem frameworks de frontend, apenas HTML, CSS e um pouco de JavaScript para funcionalidades específicas. No backend, para facilitar minha vida, usei o Echo em Golang.

Protótipo do site

Comecei a codar

Iniciei o desenvolvimento sem pensar muito em onde hospedar. Quando terminei as três telas principais — login, votação e resultado —, lembrei que precisaria hospedar o site. Decidi usar meus créditos gratuitos do Google Cloud. Como a aplicação era em Golang, bastou subir uma VM, instalar o Golang, rodar o projeto e compartilhar o link do IP com quem quisesse acessar.

Primeiro problema

Descobri que não podia usar recursos como pedir a localização do usuário porque precisava de um certificado SSL para usar HTTPS. Tentei contornar isso gerando meu próprio certificado, mas o navegador alertava que o site não era seguro. Mesmo assim, muitas pessoas acessaram e, surpreendentemente, os usuários não se importavam muito.

Segundo problema

Eu estava usando um banco de dados simples, o SQLite3. Como não planejei escalar o projeto, não me preocupei com o banco de dados — poderia ter salvo tudo em arquivos de texto se fosse mais fácil. Mas, com o aumento do uso, o sistema começou a travar, e eu não entendia o porquê. Recebi vários e-mails relatando que não conseguiam acessar o site, além de reclamações sobre segurança. Cansado da situação e sem estar recebendo nada, desliguei o sistema.

Terceiro problema

As reclamações continuaram, então resolvi desligar tudo. O esforço não estava valendo a dor de cabeça.

Solução milagrosa

Foi quando descobri a plataforma Render.com, que tem um plano gratuito com algumas limitações que consegui contornar com soluções de programação. Ela faz o deploy automático de aplicações Go direto do GitHub e oferece subdomínios gratuitos com certificado SSL. Com isso, mesmo que minha aplicação rodasse na porta 80, os usuários acessavam através de HTTPS.

Limitações

O plano gratuito pausava a VM após 15 a 30 minutos de inatividade, e a primeira requisição levava cerca de 50 segundos a 1 minuto para reativar a VM. Além disso, o limite era de 50 acessos por segundo, e não havia acesso SSH à VM.

Resolvendo limitações

Para manter a VM ativa, criei um script em Golang que fazia uma requisição ao meu site a cada 15 minutos. Isso resolveu as queixas de demora no carregamento. Como o banco de dados ficava na memória e era recriado a cada reinicialização, desenvolvi uma tela de login de administrador (eu mesmo), onde podia baixar o arquivo do banco de dados antes de reiniciar a VM.

Para dividir o tráfego entre duas VMs, implementei um balanceamento de carga na página inicial. O usuário acessava o domínio principal, mas, ao clicar em login, era redirecionado para uma das duas VMs com o restante do sistema. Para o banco de dados, usei uma instância gratuita de PostgreSQL, o que exigiu apenas pequenas mudanças no código. Assim, ambas as VMs compartilhavam o mesmo banco.

Reflexões

Com a aplicação em funcionamento, notei que o site tinha picos de até 500 requisições por segundo, e o tempo de resposta durante esses picos variava entre 2 e 5 segundos. A solução resolveu a maioria dos problemas, mas, como estamos em período eleitoral, decidi não manter o site no ar por muito tempo — deixei-o ativo por apenas 4 dias, durante os quais tive até 1400 acessos simultâneos.

Esse projeto me ensinou muito. Embora hoje eu consiga planejar sistemas mais seguros e eficientes, na época, optei por resolver os problemas conforme eles surgiam. Acho que é isso que a faculdade nos ensina: a reconhecer que poderíamos ter feito melhor. Gostaria de saber que decisões de projeto vocês teriam tomado de forma diferente.

Arquitetura do site

Infelizmente, por questões legais, não posso divulgar os dados coletados, mas deixarei o repositório no GitHub.

GitHub do projeto: https://github.com/hanufu/votei

cara, a ideia do projeto em si, eu não gostei tanto mas a resolução de problemas que você descreveu ai foi bem legal, parabens pela experiencia que vc passou ai, gostei muito de como vc atacou todos os problemas enfrentados