Skip to content

joaopauloaramuni/laboratorio-de-desenvolvimento-de-software

Repository files navigation


pucminas


Repo Laboratório de Desenvolvimento de Software

Disciplina do curso de Engenharia de Software da PUC Minas

  • 2°Sem 2024
  • 1°Sem 2025
  • 2°Sem 2025

Sumário:

Links úteis:

Calendário Acadêmico
📚 Referências gerais
📌 Conceituação de Projeto de Software
🏛️ Arquitetura de Software
🖼️ Modelagem Estrutural e Comportamental
📐 Padrões de Projeto
✔️ Qualidade de Projeto

📖 Periódicos científicos

🛠️ Ferramentas de desenho e diagramas

🛠️ IDEs e Ferramentas
⚙️ Ambientes de desenvolvimento para produtividade e depuração

IDE (Ambiente de Desenvolvimento Integrado) e editores especializados ajudam a escrever, depurar e manter código com mais eficiência. Ferramentas como IntelliJ IDEA e VS Code oferecem recursos como autocompletar, depuração visual, integração com Git, suporte a frameworks como Spring e muito mais.


🎓 Como obter o IntelliJ IDEA Ultimate gratuitamente com o GitHub Student Developer Pack

Ao se cadastrar no GitHub Student Developer Pack, você garante acesso gratuito à versão Ultimate das ferramentas da JetBrains, como o IntelliJ IDEA Ultimate 🧠💻. Essa é uma excelente oportunidade para utilizar recursos avançados de desenvolvimento — tudo sem custo para estudantes! 🚀

✅ Passo a passo:

1️⃣ Adicione seu e-mail institucional da PUC Minas (terminado em @sga.pucminas.br) como e-mail secundário na sua conta do GitHub em https://github.com/settings/emails
2️⃣ Acesse a caixa de entrada do e-mail e clique no link de confirmação enviado pelo GitHub.
3️⃣ Ao acessar o GitHub Student Developer Pack, permita que o navegador compartilhe sua localização atual 🌍.
4️⃣ Selecione "PUC Minas" como sua instituição, envie um print da sua carteirinha digital do app PUC Mobile ou um comprovante de matrícula recente como forma de verificação. Depois, aguarde até 2 dias úteis para que o selo GitHub Pro 🏅 seja ativado na sua conta.
5️⃣ Acesse: https://www.jetbrains.com/shop/eform/students
 ➡ Vá até a aba GitHub e clique em "Authorize with GitHub" 🔑.
6️⃣ Instale o IntelliJ IDEA e, ao abrir o programa, vá em "Ativar licença". Escolha a opção "Log in with GitHub", faça login com sua conta GitHub (que já possui o selo GitHub Pro 🏅 e que você autorizou previamente no site da JetBrains — passo 5), e a licença Ultimate será ativada automaticamente 🎉.

🏁 Pronto! Agora você pode aproveitar todos os benefícios do GitHub Pro 🏅, incluindo:

  • Acesso gratuito às ferramentas profissionais da JetBrains, como o IntelliJ IDEA Ultimate 🧠💻
  • GitHub Copilot com sugestões inteligentes de código (com testes gratuitos por tempo limitado) 🤖
  • Repositórios privados ilimitados 🔒
  • Insights avançados de contribuições, métricas e estatísticas dos seus projetos 📊
  • Ferramentas de CI/CD integradas com GitHub Actions ⚙️
  • Integrações com dezenas de serviços e ferramentas educacionais 🧩

Esses recursos ajudam a elevar seu aprendizado, organizar seus projetos e turbinar sua produtividade como desenvolvedor 💼🚀

🔗 Confira todos os detalhes do plano GitHub Pro para estudantes aqui:


📚 Documentação oficial
🧾 Fontes confiáveis e completas sobre a linguagem Java e seu ecossistema

A documentação oficial é a principal referência para aprender, consultar funcionalidades e entender o comportamento da linguagem Java e suas bibliotecas padrão. Essencial tanto para iniciantes quanto para desenvolvedores experientes.


☕ Java e Spring
🔧 Frameworks e ferramentas modernas para desenvolvimento backend com Java

O ecossistema Spring oferece suporte completo para criação de aplicações Java robustas, modulares e escaláveis. O Spring Boot, em especial, simplifica a configuração e o desenvolvimento de APIs RESTful, facilitando a integração com bancos de dados, autenticação, mensageria, entre outros.

Java SE 17
Spring Boot

🎨 Frameworks de interface
💻 Estilização e componentes de UI para aplicações web Java

Frameworks frontend ajudam a criar interfaces responsivas e modernas, muitas vezes utilizados junto com tecnologias como JSF, Thymeleaf ou APIs REST em Java.


🌐 Clientes REST
🔌 Ferramentas para testar, consumir e depurar APIs REST

Clientes REST permitem enviar requisições HTTP (GET, POST, PUT, DELETE), testar endpoints, autenticações e visualizar respostas com facilidade.


🐳 Docker, Deploy e Cloud ☁️
🚢 Empacotamento e publicação de aplicações em ambientes em nuvem

Ferramentas como Docker, Fly.io, Vercel e Heroku permitem criar ambientes isolados, implantar APIs e serviços em nuvem de forma simples, escalável e muitas vezes gratuita para projetos educacionais.


🗃️ Bancos de dados
💾 Sistemas de gerenciamento de dados relacionais e NoSQL

Essas ferramentas são fundamentais para persistência de dados em aplicações Java. MongoDB (NoSQL) e PostgreSQL (relacional) são amplamente utilizados em projetos web modernos.

🍃 MongoDB
🐘 PostgreSQL
📜 Scripts

📊 Observabilidade
📈 Monitoramento de métricas e visualização de desempenho

Ferramentas como Grafana e Prometheus permitem acompanhar o comportamento da aplicação, uso de recursos e definir alertas para garantir estabilidade em ambientes produtivos.


🧪 Testes e qualidade
✅ Testes automatizados e validação de código em aplicações Java

Frameworks como JUnit e Mockito são essenciais para escrever testes unitários e mocks. Selenium e Selenide permitem testes automatizados em navegadores, garantindo qualidade e confiança em cada entrega.

Frameworks de Teste
Mocks e Testes Automatizados

💰 Pagamentos e APIs Financeiras
💳 Integração de sistemas Java com plataformas de pagamento

Plataformas como Mercado Pago e Stripe oferecem SDKs para Java que facilitam pagamentos online, geração de cobranças, webhooks e checkout transparente.


📞 Comunicação via API
📲 APIs para envio de mensagens e integração com canais de comunicação

O Twilio permite envio de SMS, ligações, mensagens de WhatsApp e muito mais, podendo ser facilmente integrado a backends Java para notificações automatizadas e comunicação em tempo real.


📘 APIs RESTful e Documentação
📑 Design, documentação e testes de APIs com Swagger

Swagger facilita a criação de APIs REST bem documentadas, com suporte a testes via interface gráfica e geração automática de contratos e documentação OpenAPI para serviços Java.


🧹 Análise de código

Ferramentas para análise estatística de código, detecção de code smells, métricas de qualidade e identificação de más práticas de programação.

  • PMD: Ferramenta que verifica problemas comuns em código Java, como variáveis não utilizadas, duplicação de código e estilos de codificação.
  • SonarQube: Plataforma para análise contínua de qualidade de código, cobrindo múltiplas linguagens. Avalia bugs, vulnerabilidades e cobertura de testes.
  • Qodana: Plataforma de análise estática de código desenvolvida pela JetBrains. Integra-se com IDEs, CI/CD e repositórios para detectar code smells, vulnerabilidades de segurança e violações de boas práticas, com suporte a múltiplas linguagens como Java, Kotlin, PHP, Python e JavaScript.
  • JNose: Ferramenta focada na identificação de test smells e design smells em código Java. Ajuda na compreensão de problemas relacionados à testabilidade e manutenibilidade.
  • Code Climate: Ferramenta de análise contínua de qualidade de código que gera métricas como complexidade ciclomática, duplicação, cobertura de testes e code smells. Suporta diversas linguagens e se integra com GitHub, GitLab e outros.
  • CodeQL: Plataforma de análise de segurança e qualidade de código da GitHub, que permite executar consultas para detectar vulnerabilidades, bugs e más práticas em diversos tipos de código fonte.
  • CK: Ferramenta de linha de comando para análise estática de código Java. Extrai métricas como CBO, LCOM, WMC, RFC, DIT, NOM e LOC, úteis para avaliar a complexidade e a qualidade do código.

📊 Tendências e pesquisas
📈 Relatórios e estudos sobre o mercado de tecnologia e comportamento de desenvolvedores

Relatórios anuais e pesquisas globais ajudam a entender as principais linguagens, ferramentas, salários, preferências e tendências no mercado de desenvolvimento de software. São ótimos para orientar decisões de carreira e identificar habilidades em alta.


🗣️ Apresentação de laboratório:

🧑‍🤝‍🧑 Exemplo de slides para apresentação em grupo:


📄 README de projeto:

📘 Exemplos de README de projeto:


📝 Portfólios:

Exemplos de portfólio profissional:

Luca Azalim (Aluno do curso de Engenharia de Software da PUC Minas - Campus Lourdes):
Gabriel Victor (Aluno do curso de Engenharia de Software da PUC Minas - Campus Lourdes):
Pedro Braga (Aluno do curso de Engenharia de Software da PUC Minas - Campus Lourdes):
Davi Mendes (Aluno do curso de Engenharia de Software da PUC Minas - Campus Coração Eucarístico):
João Marcelo Carvalho (Aluno do curso de Engenharia de Software da PUC Minas - Campus Coração Eucarístico):
Flávio Júnior (Aluno do curso de Engenharia de Software da PUC Minas - Campus Coração Eucarístico):
Mateus Nascimento
Guilherme Tadeu:
Sat Naing:
Template para Terminal:
Henry Heffernan:
Josh W. Comeau:
Bohr.io
📚 E-book: Building an Effective Dev Portfolio
👤 Outros perfis:

🎨 Figma
🖌️ Design de interfaces e prototipagem com Figma

O Figma é uma das principais ferramentas de design de interfaces e prototipagem colaborativa do mercado. Permite criar layouts, fluxos de navegação e componentes reutilizáveis de forma integrada entre designers e desenvolvedores. Com recursos de colaboração em tempo real, facilita a iteração rápida e a validação de ideias, sendo amplamente adotado por equipes ágeis e projetos orientados à experiência do usuário (UX/UI).

👨‍🏫 Figma - Education
🎨 Figma - Templates

O Figma é uma das principais ferramentas de design de interfaces e prototipagem colaborativa do mercado. Permite criar layouts, fluxos de navegação e componentes reutilizáveis de forma integrada entre designers e desenvolvedores. Com recursos de colaboração em tempo real, facilita a iteração rápida e a validação de ideias, sendo amplamente adotado por equipes ágeis e projetos orientados à experiência do usuário (UX/UI).

🗂️ Figma - Templates gerais
💻 Figma - Portfólios Dev
☁️ Figma - Templates AWS / Arquitetura de sistemas
🔁 Figma - Diagramas de Sequência e de Classe
🌐 Figma - APIs e Microserviços
👤 Figma - User Persona Template
🧱 Figma - C4 Model (Arquitetura de Software)

✍️ Fonts:
FiraCode
JetBrains Mono
Cascadia Code
Ubuntu Mono
IBM Plex Mono
Hack
Orbitron
Source Code Pro

🐳 Docker:
▶️ Docker - Vídeo tutorial
🛠️ Comandos Docker úteis:
docker --version

docker build -t minha-aplicacao .
docker build --platform linux/amd64 -t minha-aplicacao .

docker images

docker run -d -p 8080:8080 minha-aplicacao
docker run --platform linux/amd64 -d -p 8080:8080 minha-aplicacao

docker ps

docker stats
🔎 Veja mais sobre docker:
Comandos Docker: Guia rápido
Comando Descrição
docker run Executa um novo contêiner a partir de uma imagem.
docker ps Lista os contêineres em execução.
docker ps -a Lista todos os contêineres, incluindo os que não estão em execução.
docker images Lista todas as imagens locais disponíveis.
docker rmi Remove uma ou mais imagens.
docker rm Remove um ou mais contêineres.
docker build Cria uma nova imagem a partir de um Dockerfile.
docker pull Baixa uma imagem do Docker Hub ou de um repositório remoto.
docker push Envia uma imagem para um repositório remoto no Docker Hub.
docker exec Executa um comando em um contêiner em execução.
docker logs Exibe os logs de um contêiner.
docker network Gerencia redes Docker.
docker volume Gerencia volumes para persistência de dados.
docker-compose up Inicia e orquestra múltiplos contêineres definidos no docker-compose.yml.
docker-compose down Para e remove os contêineres, redes e volumes definidos no docker-compose.yml.
docker stats Exibe estatísticas em tempo real sobre o uso de recursos de contêineres em execução.
docker inspect Mostra informações detalhadas sobre um contêiner ou imagem.
docker start Inicia um contêiner que foi parado.
docker stop Para um contêiner em execução.
docker restart Reinicia um contêiner.
docker pause Pausa um ou mais contêineres em execução.
docker unpause Retoma um ou mais contêineres que foram pausados.
docker commit Cria uma nova imagem a partir das alterações em um contêiner.
docker tag Adiciona uma nova tag a uma imagem existente.
docker login Faz login em um repositório Docker.
docker logout Faz logout de um repositório Docker.
docker search Busca imagens no Docker Hub.
docker pull Baixa uma imagem do Docker Hub ou de um repositório remoto.
docker cp Copia arquivos ou diretórios entre o sistema de arquivos do contêiner e o host.
docker volume create Cria um novo volume Docker.
docker volume rm Remove um ou mais volumes.
docker network create Cria uma nova rede Docker.
docker network rm Remove uma ou mais redes.
docker network ls Lista todas as redes Docker.
docker history Mostra o histórico de camadas de uma imagem.

💬 Exemplo de comentário em Code Review

Obs: Para iniciar um code review, você precisa abrir um pull request (PR) no repositório. O PR é a solicitação para mesclar suas alterações no branch principal. Depois de aberto, você e seus colegas podem navegar pelas mudanças, clicar nas linhas de código para adicionar comentários e discutir melhorias diretamente no PR.


🔍 Sugestão de melhoria

A classe UserService atualmente contém lógica de acesso direto ao banco de dados usando EntityManager. Para seguir o princípio da separação de responsabilidades e melhorar a testabilidade do código, considere extrair essa lógica para um DAO (UserDAO).


Benefícios da mudança
  • Redução do acoplamento entre a camada de serviço e a persistência.
  • Facilidade para substituir a implementação do DAO futuramente (por exemplo, ao trocar Hibernate por outra tecnologia).
  • Facilidade para criar mocks e testar a lógica de negócio isoladamente.

📌 Sugestão de implementação
  • Criar uma classe UserDAO com métodos como findById(Long id) e save(User user).
  • Injetar essa classe no UserService.
  • Mover a lógica de persistência para o DAO.

📚 Link oficial da documentação do GitHub

🏗️ Roadmap Code Review

Um roadmap é um guia visual que apresenta etapas, habilidades ou conhecimentos necessários para atingir um objetivo específico. Ele ajuda a organizar o aprendizado ou desenvolvimento ao longo do tempo, mostrando caminhos recomendados e prioridades.

Veja também:


🏛️ Entendendo a Arquitetura de um App Spring Boot

A arquitetura de um app Spring Boot é como um ecossistema bem orquestrado, onde cada componente tem um papel essencial para garantir a escalabilidade, manutenibilidade e organização do sistema.

🔍 Entender a fundo cada uma dessas peças é o que diferencia um bom desenvolvedor!

Confira abaixo o papel fundamental de cada componente ilustrado no GIF:


🍃 Arquitetura Spring Boot
arquitetura
📚 Referências

🧩 Componentes da Arquitetura Spring Boot
Componente Descrição
🧭 Controller É a primeira linha de contato, recebendo as requisições HTTP e devolvendo as respostas. Atua como a interface da aplicação.
🧠 Service Contém as regras de negócio da aplicação. É onde a lógica central é executada, separada da interface e da persistência.
💾 Repository Responsável pela comunicação com o banco de dados, abstraindo as operações de persistência e consulta.
🔗 JPA (Java Persistence API) Atua como uma ponte entre objetos Java e tabelas do banco de dados, facilitando o mapeamento e a persistência dos dados.
🌐 REST Define os padrões de comunicação via HTTP, essenciais para a construção de APIs modernas e interoperáveis.
📦 Entity Representa uma tabela do banco de dados como um objeto Java. Base para o mapeamento e a persistência dos dados.
🧪 Testes Garante que todas as funcionalidades funcionem como esperado. Pilar para a qualidade e robustez do software.
📤 DTOs (Data Transfer Objects) Objetos leves usados para transportar dados entre camadas, evitando o envio de informações desnecessárias.
📚 Swagger Ferramenta que gera uma documentação interativa da API, facilitando o entendimento e uso por outros desenvolvedores.
🔐 Security Cuida da autenticação (quem você é) e autorização (o que você pode fazer), protegendo os recursos da aplicação.
⚙️ Configuration Centraliza as configurações da aplicação, como portas, credenciais e parâmetros de comportamento.
🚨 Exception Handler Centraliza o tratamento de erros, permitindo respostas consistentes e amigáveis em caso de falhas.

✅ Conhecer a arquitetura do Spring Boot ajuda a escrever sistemas mais limpos, coesos e testáveis. Cada camada tem sua função e respeitar essa separação é o primeiro passo para a excelência no desenvolvimento backend.


🚀 Domine o Spring Boot em 2025

O Spring Boot continua sendo uma das ferramentas mais poderosas e utilizadas por desenvolvedores Java. Sua proposta de simplificar o desenvolvimento de aplicações robustas e prontas para produção o tornou o padrão de fato no desenvolvimento backend moderno.

Em 2025, dominar o Spring Boot é essencial para quem deseja se destacar como desenvolvedor backend. Com a crescente adoção de arquiteturas de microserviços e práticas nativas de nuvem, a demanda por profissionais especializados nesse ecossistema só aumenta.

O roadmap abaixo vai te guiar desde os conceitos fundamentais até os tópicos mais avançados, combinando teoria e prática de forma progressiva. Você entenderá como o ecossistema evoluiu — com recursos como compilação nativa, melhorias de performance e integração com a nuvem — e como aplicar esses conhecimentos no desenvolvimento de aplicações reais.


🍃 Roadmap Spring Boot

Um roadmap é um guia visual que apresenta etapas, habilidades ou conhecimentos necessários para atingir um objetivo específico. Ele ajuda a organizar o aprendizado ou desenvolvimento ao longo do tempo, mostrando caminhos recomendados e prioridades.

roadmap
📚 Referências

pucminas