Desenvolvendo na AWS com Node.js e React!

Nos últimos anos, o papel da engenheira de software passou por uma transformação significativa. Antigamente, o foco estava quase que exclusivamente em habilidades técnicas, como a programação e a gestão de sistemas. Hoje, o cenário é bem diferente: assim como o caixa de supermercado que acumula funções de atender o cliente, pesar produtos, empacotar compras e ainda sugerir promoções, a pessoa engenheira de software moderna precisa assumir múltiplas responsabilidades. A exigência vai além da programação; envolve a capacidade de projetar arquiteturas eficientes, configurar e gerenciar infraestruturas na nuvem, otimizar redes e garantir a integridade e segurança dos dados.

Escolhi o desenvolvimento de um sistema de login como experimentação por ser uma funcionalidade essencial e um excelente ponto de partida para testar não apenas a aplicação em si, mas também diversas peças da AWS. Implementar um sistema de login envolve múltiplos componentes, como o AWS IAM (Identity and Access Management) para controle de permissões, o AWS Cognito para autenticação e gerenciamento de usuários, e o EC2 para hospedagem da aplicação. Esses serviços oferecem uma infraestrutura robusta e escalável que é ideal para explorar e compreender as capacidades da AWS em um contexto real de aplicação.

Meu objetivo era construir um sistema de login completo, incluindo funcionalidades de sucesso e falha de login, recuperação de senha e cadastro de novos usuários. Optei por utilizar React para o frontend devido à sua simplicidade e eficiência na criação de interfaces de usuário interativas e dinâmicas. Além disso, o Node.js foi escolhido para o backend por sua similaridade com React em termos de linguagem e estrutura, o que facilita a integração e manutenção do código. Juntos, React e Node.js proporcionaram uma base sólida e coesa para desenvolver uma aplicação que não só atende às necessidades dos usuários, mas também demonstra a eficiência e flexibilidade das ferramentas e serviços da AWS.

Essa experiência foi uma oportunidade de vivenciar na prática como é ser um engenheiro de software nos dias de hoje, enfrentando os desafios de configurar e otimizar serviços na nuvem, desenvolver interfaces dinâmicas e responsivas, e assegurar a segurança e a eficiência dos sistemas.

O começo do projeto foi surpreendentemente simples e direto. A configuração inicial do AWS Cognito para gerenciar autenticação e usuários foi intuitiva, graças à interface amigável e à documentação abrangente da AWS. Paralelamente, a instalação do ambiente de desenvolvimento, incluindo Node.js e React, e a configuração do Git para controle de versão, foram etapas rápidas e sem complicações. Em poucas horas, já estava com todo o ambiente de desenvolvimento configurado e pronto para começar a codificar.

Diagrama sem nome.drawio

A construção da aplicação também seguiu de forma bastante fluida. Em aproximadamente 12 horas de trabalho, consegui desenvolver uma versão funcional do sistema de login, abrangendo registro de usuários, login com verificação de sucesso e falha, e recuperação de senha. Utilizando React para o frontend e Node.js para o backend, a codificação foi eficiente e direta, facilitada pela coesão entre as tecnologias. No entanto, eu não poderia imaginar os desafios e complexidades adicionais que surgiriam nas etapas seguintes, especialmente quando se tratava de disponibilizar a aplicação.

Configurar o ambiente de produção foi uma tarefa que se estendeu por quase três dias, repleta de detalhes e ajustes minuciosos. A configuração envolveu a criação de segredos e regras no IAM para garantir que todas as permissões estivessem corretamente definidas e seguras. Além disso, a integração entre os diferentes serviços da AWS, como Cognito, EC2 e IAM, exigiu uma coordenação para assegurar que todos os componentes se comunicavam de maneira eficiente e funcional. O processo também incluiu a configuração manual do servidor via RDP, onde precisei instalar e configurar o Git e o AWS CLI para dar suporte à minha aplicação.

Após enfrentar repetidos problemas de conectividade, especialmente na configuração de portas para o backend, percebi que a abordagem inicial não estava funcionando como esperado. Apesar de vários esforços para solucionar os problemas, a melhor estratégia acabou sendo reiniciar todo o processo de configuração do zero. Esta decisão se mostrou a mais efetiva e rápida, permitindo-me corrigir quaisquer erros ocultos e otimizar a configuração do ambiente de maneira mais eficiente. Essa experiência sublinhou a importância de uma configuração meticulosa e a necessidade de estar preparado para adaptar estratégias quando surgem problemas complexos.

Enfim, após dias intensos de configuração e ajustes, consegui colocar o ambiente de pé e fazer minha aplicação funcionar. Foi uma grande satisfação ver o sistema de login, recuperação de senha e cadastro de usuários rodando perfeitamente na AWS. Passei um tempo brincando com a aplicação, explorando suas funcionalidades e garantindo que tudo estivesse operando conforme o esperado. Claro, sempre com cuidado para não gerar custos excessivos, ajustando as configurações para otimizar o uso dos recursos.

Apesar da conquista inicial, sei que ainda há muito a melhorar no código e na proteção da aplicação. O pensamento incremental será crucial para o desenvolvimento contínuo, permitindo que eu automatize o processo de deploy e faça melhorias progressivas na robustez e segurança da aplicação. Cada iteração trará refinamentos que aumentarão a eficiência e a confiabilidade do sistema, consolidando uma base sólida para futuros aprimoramentos.

Apesar de ter sido uma experiência bastante gratificante, não posso deixar de refletir sobre como a vida do desenvolvedor está se tornando cada vez mais desafiadora. Hoje, não basta apenas entender a lógica de programação e como sintetizar as regras de negócio em código. O desenvolvedor moderno precisa ter um conhecimento aprofundado de arquitetura de sistemas, infraestrutura, redes e gestão de dados, entre outras disciplinas. Cada novo projeto exige que se integrem múltiplas tecnologias e serviços, muitas vezes envolvendo configurações complexas e interdependências que demandam uma visão holística e detalhada.

Essa complexidade crescente significa que o desenvolvedor deve estar constantemente aprendendo e se adaptando a novas ferramentas e metodologias. A necessidade de dominar diversas áreas pode ser extenuante, mas também é uma oportunidade para se tornar um profissional mais completo e versátil. Entender como a infraestrutura suporta a aplicação, como as redes garantem a conectividade e como os dados são gerenciados e protegidos são conhecimentos fundamentais que permitem criar soluções mais robustas e escaláveis. Contudo, esse cenário também coloca uma pressão significativa sobre os desenvolvedores, que precisam equilibrar a profundidade técnica com a capacidade de entregar soluções práticas e eficientes em prazos cada vez mais apertados.

Tenho dúvidas sobre esse movimento de concentrar tantas especialidades em um único papel. Integrar conhecimentos profundos de arquitetura, infraestrutura, redes e gestão de dados em um único profissional pode ser exaustivo e até contraproducente. No entanto, reconheço que as ferramentas de IA são essenciais para tornar a vida do engenheiro de software mais produtiva. Essas ferramentas não apenas automatizam tarefas repetitivas, mas também oferecem insights e soluções que podem acelerar significativamente o desenvolvimento e a manutenção de sistemas complexos.

Entender o todo e ser capaz de ir atrás das soluções será cada vez mais essencial. A habilidade de problem solving, ou resolução de problemas, se tornará ainda mais valorizada. Ter uma visão abrangente do projeto, identificar rapidamente os pontos críticos e buscar as melhores soluções são competências que diferenciam os profissionais de destaque. Apesar das ferramentas de IA facilitarem muitos aspectos do trabalho, a capacidade de integrar conhecimentos diversos e aplicar um pensamento crítico para resolver problemas complexos continuará sendo indispensável no cenário tecnológico em constante evolução.

Concluindo, minha experiência no desenvolvimento de uma aplicação na AWS utilizando React e Node.js mostrou o quanto o papel do engenheiro de software pode ser desafiador e recompensador ao mesmo tempo. As múltiplas competências exigidas hoje podem parecer avassaladoras, mas com o estudo contínuo e a adaptação às novas ferramentas e metodologias, é possível não apenas acompanhar as mudanças, mas também se destacar. A dedicação ao aprendizado constante e a busca por soluções inovadoras são fundamentais para o sucesso nesta área dinâmica.

Para aqueles que estão considerando entrar na área de tecnologia, encorajo fortemente a investir o esforço necessário. Com determinação e curiosidade, é possível se tornar um excelente engenheiro de software. O mercado está em constante evolução e oferece inúmeras oportunidades para quem está disposto a aprender e se adaptar. Além de ser uma carreira desafiadora, é também extremamente gratificante, com um impacto significativo na forma como vivemos e trabalhamos. Se você está disposto a investir no seu desenvolvimento, encontrará uma carreira cheia de possibilidades e realizações.

Hoje é 04 de junho, vou deixar a aplicação no ar até o dia 07 de junho para testes (e para não gastar com AWS), no retorno das minhas férias volto com tudo para dar continuidade ao projeto. O código do git vai ficar disponível (ainda sem documentação na data de hoje).

Aplicação: http://54.207.54.15:3000/

GitHub: https://github.com/alverub89/battleofmovies

Deixe um comentário