{
  "version": "https://jsonfeed.org/version/1",
  "title": "Magneira",
  "home_page_url": "https://magneira.com.br",
  "feed_url": "https://magneira.com.br/tag-tcc.json",
  "description": "Engenharia de software, tecnologia e inteligência artificial",
  "items": [
    {
      "id": "https://magneira.com.br/tcc-utfpr-magno.html",
      "url": "https://magneira.com.br/tcc-utfpr-magno.html",
      "title": "Meu TCC de 2019: uma plataforma de promoções por geolocalização",
      "content_html": "<p>Em 2019, concluí minha graduação em Engenharia de Software na UTFPR com um projeto que, olhando hoje, representa bem o tipo de problema que sempre gostei de resolver: pegar uma ideia, estruturar tecnicamente e construir o produto de ponta a ponta.</p>\n<p>Meu Trabalho de Conclusão de Curso se chamava <strong>“Desenvolvimento de uma plataforma MEAN Stack de veiculação publicitária por geolocalização”</strong>.</p>\n<p>O nome era acadêmico. A ideia era mais simples.</p>\n<p>Eu queria construir uma plataforma em que estabelecimentos pudessem publicar promoções e os usuários encontrassem ofertas próximas utilizando a própria localização.</p>\n<p>O projeto ficou conhecido como <strong>Gastando Pouco</strong>.</p>\n<h2 id=\"a-ideia-começou-antes-do-tcc\">A ideia começou antes do TCC<a href=\"#a-ideia-começou-antes-do-tcc\" aria-label=\"Link to heading 'A ideia começou antes do TCC'\" data-heading-content=\"A ideia começou antes do TCC\" class=\"anchor\"></a></h2>\n<p>A origem do projeto foi alguns anos antes, em uma competição de empreendedorismo: o <strong>Startup Weekend Londrina de 2016</strong>.</p>\n<p>A proposta era aproximar estabelecimentos locais de consumidores que estivessem próximos.</p>\n<p>Imagine uma loja publicando uma promoção e, em vez de aquela informação simplesmente aparecer para qualquer pessoa na Internet, a localização do estabelecimento fazer parte da própria lógica da aplicação.</p>\n<p>O usuário informaria — mediante autorização — sua localização. A plataforma teria latitude e longitude das empresas cadastradas e conseguiria responder algo próximo de:</p>\n<p><strong>“Quais estabelecimentos com promoções ativas existem perto de mim?”</strong></p>\n<p>Essa ideia acabou virando o escopo do meu TCC.</p>\n<h2 id=\"o-projeto\">O projeto<a href=\"#o-projeto\" aria-label=\"Link to heading 'O projeto'\" data-heading-content=\"O projeto\" class=\"anchor\"></a></h2>\n<p>A aplicação foi dividida em três partes principais.</p>\n<h3 id=\"o-sistema-da-empresa\">O sistema da empresa<a href=\"#o-sistema-da-empresa\" aria-label=\"Link to heading 'O sistema da empresa'\" data-heading-content=\"O sistema da empresa\" class=\"anchor\"></a></h3>\n<p>Existia uma aplicação administrativa para os estabelecimentos.</p>\n<p>A empresa podia criar sua conta, cadastrar seus dados e localização, publicar promoções, editar publicações existentes e acompanhar informações relacionadas às ofertas.</p>\n<p>Na prática, já existia ali um pequeno painel administrativo.</p>\n<p>Eu tinha páginas específicas para cadastro de promoções, listagem das publicações, edição, perfil da empresa e relatórios.</p>\n<p>Uma promoção possuía informações como período de validade, empresa responsável e categoria. O sistema precisava saber não apenas <strong>o que estava sendo anunciado</strong>, mas também <strong>onde aquela empresa estava localizada</strong>.</p>\n<h3 id=\"o-sistema-do-cliente\">O sistema do cliente<a href=\"#o-sistema-do-cliente\" aria-label=\"Link to heading 'O sistema do cliente'\" data-heading-content=\"O sistema do cliente\" class=\"anchor\"></a></h3>\n<p>Do outro lado existia o site utilizado pelo consumidor.</p>\n<p>Ao entrar na aplicação, o usuário autorizava o acesso à sua localização. O frontend capturava latitude e longitude e enviava essas informações para a API junto com outros parâmetros da busca, como distância e categorias.</p>\n<p>A partir disso, a aplicação apresentava as promoções disponíveis naquela região.</p>\n<p>O usuário também podia visualizar uma empresa, consultar suas promoções, filtrar ofertas por categoria e salvar promoções como favoritas.</p>\n<p>Era basicamente um <strong>feed de promoções baseado em localização</strong>.</p>\n<h2 id=\"a-parte-que-eu-mais-queria-explorar-geolocalização\">A parte que eu mais queria explorar: geolocalização<a href=\"#a-parte-que-eu-mais-queria-explorar-geolocalização\" aria-label=\"Link to heading 'A parte que eu mais queria explorar: geolocalização'\" data-heading-content=\"A parte que eu mais queria explorar: geolocalização\" class=\"anchor\"></a></h2>\n<p>Um dos objetivos técnicos do trabalho era justamente experimentar o uso de coordenadas geográficas em uma aplicação completa.</p>\n<p>Não queria apenas pegar latitude e longitude no navegador e mostrar os números na tela.</p>\n<p>A localização precisava participar da regra de negócio.</p>\n<p>O frontend capturava a posição do usuário e enviava para o backend parâmetros como:</p>\n<p><code>latitude</code></p>\n<p><code>longitude</code></p>\n<p><code>distância</code></p>\n<p>A API utilizava essas informações para consultar o MongoDB e descobrir quais empresas estavam dentro da região definida.</p>\n<p>No backend, a consulta utilizava recursos geoespaciais do próprio MongoDB, incluindo operações como <code>$geoNear</code> e <code>$geoWithin</code>.</p>\n<p>Depois de localizar as empresas próximas, a aplicação relacionava cada estabelecimento às promoções cadastradas e considerava também o período de validade das ofertas.</p>\n<p>Isso transformava latitude e longitude em algo útil para o produto.</p>\n<p>Não era apenas:</p>\n<blockquote>\n<p>“O usuário está nesta coordenada.”</p>\n</blockquote>\n<p>Era:</p>\n<blockquote>\n<p>“Considerando esta coordenada e este raio, quais informações são relevantes para esse usuário?”</p>\n</blockquote>\n<p>Essa diferença era uma das principais provas de conceito que eu queria construir.</p>\n<h2 id=\"a-arquitetura\">A arquitetura<a href=\"#a-arquitetura\" aria-label=\"Link to heading 'A arquitetura'\" data-heading-content=\"A arquitetura\" class=\"anchor\"></a></h2>\n<p>Na época escolhi trabalhar com a chamada <strong>MEAN Stack</strong>:</p>\n<p><strong>MongoDB + Express + Angular + Node.js.</strong></p>\n<p>Um dos objetivos do TCC era utilizar JavaScript/TypeScript ao longo de praticamente toda a aplicação.</p>\n<p>No frontend, Angular.</p>\n<p>No backend, Node.js com Express.</p>\n<p>Para persistência, MongoDB.</p>\n<p>Para comunicação entre as aplicações, uma API utilizando JSON.</p>\n<p>Também utilizei Firebase em partes da solução, incluindo autenticação, armazenamento de imagens e hospedagem das aplicações web.</p>\n<p>O resultado era uma arquitetura com dois frontends independentes consumindo uma mesma aplicação de backend.</p>\n<p>Hoje isso parece uma divisão bastante natural, mas o objetivo naquele momento era justamente utilizar o projeto para estudar como essas tecnologias poderiam trabalhar juntas em uma aplicação real.</p>\n<h2 id=\"não-era-só-código\">Não era só código<a href=\"#não-era-só-código\" aria-label=\"Link to heading 'Não era só código'\" data-heading-content=\"Não era só código\" class=\"anchor\"></a></h2>\n<p>Uma coisa interessante ao revisitar o projeto é perceber quanto trabalho de Engenharia de Software existia ao redor da implementação.</p>\n<p>Eu defini requisitos funcionais separadamente para empresa e cliente, requisitos não funcionais, arquitetura, modelo de dados, backlog e processo de desenvolvimento.</p>\n<p>Também adaptei o <strong>Scrum Solo</strong> para organizar o trabalho.</p>\n<p>As sprints tinham duração de sete dias e eu registrava a evolução do projeto a cada ciclo.</p>\n<p>Isso provavelmente parece exagerado para um projeto desenvolvido por uma única pessoa.</p>\n<p>Mas esse também era o objetivo.</p>\n<p>O TCC não era apenas entregar uma aplicação funcionando. Era aplicar, em um projeto relativamente completo, os conhecimentos adquiridos durante a graduação.</p>\n<h2 id=\"o-que-foi-entregue\">O que foi entregue<a href=\"#o-que-foi-entregue\" aria-label=\"Link to heading 'O que foi entregue'\" data-heading-content=\"O que foi entregue\" class=\"anchor\"></a></h2>\n<p>No final, o projeto tinha um conjunto razoavelmente grande de funcionalidades para uma prova de conceito.</p>\n<p>Existiam autenticação, cadastro de empresas, cadastro e edição de promoções, localização dos estabelecimentos, localização do usuário, busca por distância, categorias, favoritos, visualização das empresas, mapas, upload de imagens, frontend administrativo, frontend público e uma API responsável pelas regras de negócio.</p>\n<p>Era um MVP.</p>\n<p>Inclusive, foi assim que defini o projeto nas considerações finais do TCC.</p>\n<p>O objetivo nunca foi construir um marketplace completo.</p>\n<p>Não existiam pagamentos dentro da plataforma e também não existia uma comunicação direta entre empresa e consumidor.</p>\n<p>O foco era validar a arquitetura e principalmente a ideia de <strong>organizar promoções utilizando a localização como um dos principais parâmetros da busca</strong>.</p>\n<h2 id=\"o-que-eu-faria-diferente-hoje\">O que eu faria diferente hoje<a href=\"#o-que-eu-faria-diferente-hoje\" aria-label=\"Link to heading 'O que eu faria diferente hoje'\" data-heading-content=\"O que eu faria diferente hoje\" class=\"anchor\"></a></h2>\n<p>Sete anos é bastante tempo quando estamos falando de desenvolvimento de software.</p>\n<p>As versões das ferramentas mudaram. Algumas bibliotecas desapareceram. Outras abordagens de arquitetura se tornaram mais comuns.</p>\n<p>Eu certamente estruturaria várias partes desse código de outra forma hoje.</p>\n<p>Mas é exatamente isso que torna interessante manter projetos antigos disponíveis.</p>\n<p>O repositório é praticamente uma fotografia de como eu pensava desenvolvimento de software naquele momento.</p>\n<p>É possível encontrar decisões boas, decisões questionáveis, código que eu provavelmente não escreveria novamente e problemas que continuam bastante atuais.</p>\n<p>Autenticação.</p>\n<p>APIs.</p>\n<p>Separação entre frontend e backend.</p>\n<p>Geolocalização.</p>\n<p>Consultas geoespaciais.</p>\n<p>Upload de arquivos.</p>\n<p>Autorização.</p>\n<p>Experiência do usuário.</p>\n<p>Deploy.</p>\n<p>Modelagem dos dados.</p>\n<p>São problemas que continuam aparecendo nos sistemas que construímos atualmente, mesmo que as ferramentas tenham mudado.</p>\n<h2 id=\"algumas-ideias-que-ficaram-para-depois\">Algumas ideias que ficaram para depois<a href=\"#algumas-ideias-que-ficaram-para-depois\" aria-label=\"Link to heading 'Algumas ideias que ficaram para depois'\" data-heading-content=\"Algumas ideias que ficaram para depois\" class=\"anchor\"></a></h2>\n<p>No próprio TCC deixei uma seção de trabalhos futuros.</p>\n<p>Entre as possibilidades estavam criar aplicativos para Android e iOS, permitir compartilhamento das promoções nas redes sociais, gerar códigos de desconto e enviar notificações push para pessoas próximas quando uma empresa publicasse uma nova promoção.</p>\n<p>Algumas dessas ideias hoje parecem bastante óbvias.</p>\n<p>Em 2019, porém, elas representavam a continuação natural daquela prova de conceito.</p>\n<h2 id=\"por-que-estou-publicando-isso-agora\">Por que estou publicando isso agora<a href=\"#por-que-estou-publicando-isso-agora\" aria-label=\"Link to heading 'Por que estou publicando isso agora'\" data-heading-content=\"Por que estou publicando isso agora\" class=\"anchor\"></a></h2>\n<p>Estou começando este blog e quero utilizar parte dele para registrar não apenas o que estou construindo atualmente, mas também alguns projetos que fizeram parte da minha trajetória.</p>\n<p>Não pretendo atualizar o código do Gastando Pouco para fingir que ele foi escrito hoje.</p>\n<p>A graça é justamente o contrário.</p>\n<p>Quero preservar esses projetos como registros de uma época, explicar o problema que eu estava tentando resolver, as decisões que tomei e o que aprendi durante o processo.</p>\n<p>Esse TCC foi um desses projetos.</p>\n<p>Foi uma oportunidade de transformar uma ideia que surgiu em um Startup Weekend em uma aplicação funcional, passando por levantamento de requisitos, arquitetura, banco de dados, frontend, backend, deploy e documentação.</p>\n<p>E também foi o projeto que encerrou uma etapa importante: minha graduação em Engenharia de Software.</p>\n<p>Para quem quiser explorar o código, os diagramas, documentos e até diferentes versões do próprio TCC, o repositório continua disponível:</p>\n<p><strong>github.com/magnocarvalho/tcc</strong></p>\n<p>Talvez daqui a alguns anos seja interessante voltar novamente neste projeto e comparar não apenas as tecnologias, mas também como mudou minha forma de pensar software.</p>\n",
      "summary": "\"Como nasceu o Gastando Pouco, meu TCC de Engenharia de Software na UTFPR — uma plataforma MEAN Stack de promoções baseada em geolocalização.\"",
      "date_published": "2019-12-01T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Magno Carvalho dos Santos",
          "url": "https://github.com/magnocarvalho",
          "avatar": "https://github.com/magnocarvalho.png"
        }
      ],
      "tags": [
        "arquivo",
        "tcc",
        "utfpr",
        "geolocalizacao",
        "mongodb"
      ],
      "language": "en"
    }
  ]
}