Você está na página 1de 14

UNIVERSIDADE DE SÃO PAULO

Instituto de Ciências Matemáticas e de Computação

Departamento de Ciências de Computação

Estudo de ferramentas e conceitos para desenvolvimento de


aplicações web com arquitetura cliente-servidor e micros
serviços.

Mathias Fernandes Duarte Coelho

Empresa: Opus Software Ltda

Supervisor: Marcos Giacometti Machado

Relatório de estágio realizado na empresa Opus dentro do


escopo da disciplina SSC0291 2023 do Departamento de
Sistemas de Computação do Instituto de Ciências
Matemáticas e de Computação – ICMC-USP.

USP – São Carlos


Junho de 2023
Sumário

1. Sobre a empresa............................................................................................................... 2
1.1 Cultura da empresa ...................................................................................................3
2. Setor da empresa onde o estágio foi realizado ..............................................................
3 3. Período em que o estágio foi realizado...........................................................................
3 4. Métodos, Técnicas e Tecnologias Utilizadas..................................................................
4 5. Projetos realizados...........................................................................................................
6 6. Descrição das Atividades Realizadas...........................................................................
7. Dificuldades e Limitações .............................................................................................

8. Contribuições do estágio para o aluno......................................................................... 13


9. Relacionamento entre o Curso e o Projeto de Estágio ...............................................
14 10. Considerações sobre o Curso de Graduação.............................................................
15 11. Trabalhos Futuros.......................................................................................................
16

1. Sobre a empresa
Foi realizado um estágio na Opus Software, uma empresa sediada em São Paulo/SP
que se dedica ao desenvolvimento de software para outras empresas (setor de serviços).
Apesar da localização física, a empresa adotou o home office desde a pandemia e segue o
modelo até hoje devido aos bons resultados. A empresa oferece diversas soluções B2B
(Business to Business) para diversos clientes. Em seguida, são descritos alguns detalhes
dos serviços e clientes da empresa.

Há uma ampla gama de serviços especializados para atender às necessidades de seus


clientes. Entre os serviços oferecidos, destacam-se:

● Migração de aplicativos: A Opus possui expertise na migração de aplicativos


baseados em SOA (Arquitetura Orientada a Serviços) para a arquitetura de
microservices. Esse processo permite uma maior flexibilidade, escalabilidade e
eficiência nos sistemas;

● Desenvolvimento de sistemas de internet banking: A empresa desenvolve soluções


personalizadas para o setor bancário, incluindo o desenvolvimento de sistemas de
internet banking. Esses sistemas permitem que os clientes ofereçam serviços
bancários online seguros e convenientes aos seus usuários;

● Soluções financeiras: A empresa oferece soluções financeiras abrangentes, como


geradores de boletos e notas fiscais eletrônicas. Essas soluções visam simplificar e
automatizar processos financeiros, aumentando a eficiência e a precisão das
operações financeiras dos clientes;

● Gestão de redes: O serviço de gestão de redes, auxilia seus clientes a monitorar,


configurar e manter suas infraestruturas de rede. Isso inclui garantir a segurança da
rede, otimizar o desempenho e solucionar problemas relacionados à conectividade e
comunicação.

A empresa Opus Software possui uma base de clientes diversificada, que inclui
empresas como OCTOPUS, GATI e Instituto Ethos, que utilizam seus serviços de gestão
de redes. Além disso, a Opus atende clientes como Pernambucanas e Bradescard no
segmento de automação bancária, fornecendo soluções personalizadas. Outro cliente
importante é a Small World, que busca soluções financeiras na Opus.

1.1 Cultura da empresa


Descrevo aqui um pouco da cultura da empresa. A Opus Software se mostrou ser
um lugar muito aberto para aprendizado e desenvolvimento. Todas as pessoas em que tive
contato, demonstraram um apreço pela empresa e mostraram ter domínio em suas áreas,
explicando o que faziam e como. Além disso, quase todas as semanas há uma reunião livre,
em que um funcionário da empresa, se desejar, pode dar uma palestra sobre um tema de
sua escolha para quem estiver interessado, e o nome desse evento tem o nome de “29
minutos”, que é o tempo das palestras. Alguns temas discutidos em que participei foram:
Cultura Japonesa, Refinamento de Backlog e Treinamento Soft Skills: Inteligência
Emocional e Empatia.
2. Setor da empresa onde o estágio foi realizado
Fui inserido em uma equipe composta por cinco estagiários alocados no
departamento de TI, e recebemos orientação direta de dois programadores da empresa. Um
dos programadores possui poucos anos de experiência, enquanto o outro tem mais tempo de
vivência na área. Todos os estagiários seguem um plano de estudos comum, no qual
discutimos semanalmente os temas e esclarecemos dúvidas. Os projetos, por sua vez, são
desenvolvidos individualmente por cada estagiário. Além disso, algumas apresentações
foram feitas para o supervisor de estágio.

3. Período em que o estágio foi realizado


O estágio foi iniciado em janeiro de 2023 com expectativa até dezembro de 2023.

4. Métodos, Técnicas e Tecnologias Utilizadas


Inicialmente, fui introduzido ao método Scrum, conhecendo os valores e práticas
como sprints, backlog de projeto e metodologia ágil. Como não iniciamos de imediato em
algum projeto de desenvolvimento de software, o próprio plano de estágio tornou-se um
projeto, e seguimos o Scrum visando seguir o plano. O acompanhamento foi feito dividido
em 2 reuniões semanais de 30 à 60 minutos, e algumas apresentações de 15 minutos quando
uma parte do projeto era concluída.

Todas as atividades sugeridas foram feitas individualmente, porém, exigiu-se a


organização em quadros kanban, com colunas to-do, blocked, in progress and done. As
principais tecnologias usadas pela empresa são PostGreSQL, Java, Spring, GIT, Angular e
React. Por isso, até o momento, realizei alguns treinamentos nessas tecnologias oferecidas
pela empresa.

Os primeiros treinamentos realizados foi de PostGreSQL e Java, que visou revisitar


conceitos comuns de como realizar um CRUD (Create, Remove, Update and Delete);
relacionamento entre entidades e o Teorema de CAP (Consistency, Availability, Partition
tolerance). Em seguida, foi proposto o desafio “SQL Murder Mystery” (SQL, O mistério do
assassinato), que consiste em solucionar um crime usando dados um pequeno banco e para
tal, foi necessário usar diversos tipos de queries SQL disponivel em
https://mystery.knightlab.com/.

Em Java, foi trabalhado desde os conceitos primordiais de orientação objetos,


configuração do ambiente java, maven, práticas de testes unitários com a biblioteca JUnit e
tratamento de erro (aplicando try/catch e logs), conceitos apresentados na disciplina de
Orientação a Objetos da graduação. Por fim, houve uma introdução aos conceitos mais
recentes adicionados nas últimas versões do Java, como streams, arrow functions, lambdas
e etc. Tudo foi realizado dentro de dois meses.

No terceiro e quarto mês, iniciei os estudos com Spring Boot, que é a principal
tecnologia usada para desenvolver o back-end dos projetos da empresa, e em Javascript,
que é a base das aplicações front-end. Durante a graduação, na disciplina de Web do curso
de computação, havia aprendido a desenvolver o back-end em Node.js e o front-end com
Javascript e Vue.js. Então essa fase do treinamento me ajudou a entender melhor como
diferentes tecnologias Web podem resolver o mesmo problema de formas diferentes.

No quinto mês, iniciei o aprendizado em Angular. Durante a minha graduação tive o


contato com esse framework em atividades extracurriculares, porém, devido a
complexidade, apenas agora venho desenvolvendo a compreensão necessária para trabalhar
com ele.

Ao longo deste estágio, também participei de outros treinamentos mais curtos


focados em oratória, soft skills (onde desenvolvi habilidades para uma convivência mais
harmoniosa), e um curso de 15 horas sobre conceitos de sistemas distribuídos, que ainda
serão aprofundados e colocados em prática.

5. Projetos realizados
A empresa entende que, em primeiro momento, o estagiário deve desenvolver
projetos separados com o intuito de aprender, em vez de iniciar em algum projeto real ou
contato direto com clientes. Nesse sentido, na primeira etapa foi proposto o
desenvolvimento de um sistema back-end e front-end, em que pude elaborar desde a ideia
da aplicação, os diagramas utilizados para elaborar a sistema, então escrever a aplicação,
documentar e escrever alguns testes integrados. Até a data da escrita deste relatório, apenas
a API da aplicação foi desenvolvida, enquanto a parte gráfica ainda está em esboço. Assim,
apresentarei a seguir mais detalhes desse projeto.

O nome dado ao projeto foi “events”, em que o objetivo era uma sistema em que os
usuários pudessem publicar e divulgar eventos, tal como buscar e se inscrever em eventos.
No esboço inicial, pensei em 3 funções principais: Adicionar, para criar um novo evento;
busca com paginação, para procurar eventos mais próximos e Listar eventos criados ou em
que o usuário está inscrito. A partir dessa concepção, foi feito o esboço da Figura 2.

E a partir disso, elaborei um diagrama simples (Figura 3), para me guiar durante o
desenvolvimento, que passou por algumas modificações. No diagrama inicial, esperava ter
as seguintes tabelas: User, para salvar informações básicas dos usuários; Event, para salvar
eventos criado por usuários; EventEdition, que são edições de um evento, com data,
localização e vagas disponíveis; e por fim, uma tabela de Ingressos, que seria usada para
mapear quem comparecerá ao eventos e obter estatisticas e avaliações ao fim do evento.
No diagrama final, as mudanças ocorreram na relação entre as entidades User e Ingressos;
na criação da entidade Review, para facilitar o armazenamento de avaliações e na alteração
dos status dos ingressos, que antes mapeavam uma situação de compra-venda e passaram a
representar a situação reservado (booked), expirado (expired) ou usado (used).

Na Figura 4, pode-se verificar a organização geral do projeto, em que foi separado


em 4 camadas, API (camadas exposta), domain (camadas com acesso diretamente o banco e
serviços), components (reservados para tarefas rotineiras, como calcular a nota final do
evento após expirado) e common (funções comuns em mais de um módulo).
O principal desafio desse projeto foi encontrar uma forma simples de calcular os
eventos geograficamente mais próximos a partir da latitude e longitude deles (A latitude e
longitude é obtida através de uma API pública do Google). A latitude e longitude são
coordenadas de uma região esférica, assim, fórmulas simples como pitágoras não resolvem
com precisão o problema, além de ser uma operação custosa. Outra limitação que encontrei,
foi de como seria possível adicionar buscas customizadas dentro do spring, que criar o
CRUD do banco de forma padrão. A solução final encontrada foi aplicar o Teorema de
Haver Sines, da Figura 5. Apesar de ser uma operação complexa computacionalmente, ela
resolveu o problema com precisão adequada para essa pequena aplicação. Uma futura
solução seria utilizar algum banco diferente para a localização ou um serviço externo.

Figura 2: Tela principal com funções cruciais do sistema. O ícone de localização é a posição do
usuário; os demais ícones dentro do mapa são eventos próximos e o ícone destacado em amarelo é
um evento selecionado pelo usuário para ver mais detalhes.
Figura 3: Relação entre entidades do banco inicial.

Figura 4: Organização do projeto.


Figura 5: Interface spring que realiza o cálculo de regiões mais próximas. O campo value em
@Query recebe uma query SQL customizada e o countQuery é utilizado para a paginação da
query.

O projeto está disponível para consulta em https://github.com/Math-O5/events.

6. Descrição das Atividades Realizadas


A seguir, a listagem das atividades realizadas e uma pequena descrição do intuito de
cada uma e de como elas contribuíram no meu crescimento profissional.

● Duas reuniões semanais de 30 a 60 minutos: Participar de reuniões regulares me


permitiu colaborar com a equipe, discutir o progresso do projeto, compartilhar
ideias e alinhar expectativas. Essas reuniões forneceram uma oportunidade para
aprender com outros membros da equipe e desenvolver habilidades de comunicação
e colaboração.

● Palestras de 29 minutos: Participar de palestras de curta duração proporcionou a


oportunidade de adquirir conhecimentos sobre tópicos relevantes para o meu campo
profissional. Essas palestras abordaram tendências tecnológicas, metodologias de
desenvolvimento, boas práticas e outros tópicos. Essa exposição a diferentes
perspectivas e conhecimentos contribuiu para o crescimento profissional.

● Cursos: SQL, Angular, Spring Boot, HTML/CSS, Javascript e GIT; esses cursos
forneceram os conhecimentos técnicos para fazer o projeto na seção 5;

● Cursos: Soft Skills e Oratória Teste de Software: Os cursos realizados em soft skills,
oratória e testes foram fundamentais para ampliar minhas competências além das
habilidades técnicas. Desenvolver habilidades interpessoais, aprimorar a capacidade
de se expressar claramente e aprender sobre boas práticas de teste foram
importantes para o meu crescimento profissional.

● Curso de Teste de Software com parceria da USP, aula ministrada pelo professor
Delamaro e outros docentes, abordando diversas técnicas de teste de software.

● Projeto descrito na seção 5: O projeto em questão foi uma oportunidade para aplicar
meus conhecimentos técnicos e enfrentar desafios reais. A fase de projeto pode ser
divida em algumas partes:

○ Elaboração da ideia do projeto: Participar da elaboração da ideia do projeto


envolveu a análise de requisitos, identificação de oportunidades e a
proposição de solução.
○ Diagramas do sistema, banco e rotas: A criação de diagramas do sistema, do
banco de dados e das rotas permitiu uma melhor compreensão e visualização
da arquitetura do projeto.

○ Implementação: A atividade de implementação envolveu a tradução dos


requisitos e diagramas em código concreto.

○ Escrita de testes: A escrita de testes é uma prática importante no


desenvolvimento de software, pois garante a qualidade e robustez do código.

○ Documentação: A elaboração da documentação do projeto foi essencial para


registrar o trabalho realizado, facilitar a compreensão do projeto por outros
membros da equipe e futuras manutenções.

○ Esboço da tela em frontend: A criação do esboço da tela em frontend permitiu


visualizar e planejar a interface do usuário.

No geral, todas essas atividades contribuíram para o meu crescimento profissional,


fornecendo oportunidades de aprendizado técnico, desenvolvimento de habilidades
interpessoais, resolução de problemas e trabalho em equipe.

7. Dificuldades e Limitações
Em resumo, durante o início do estágio, participei de vários treinamentos nos quais
não enfrentei muitas limitações, uma vez que grande parte dos conteúdos abordados eram
revisões dos tópicos estudados durante a graduação ou ampliações desses conceitos,
baseados na ciência da computação. No entanto, no projeto em si, surgiram duas limitações
significativas.

A primeira limitação foi encontrar uma solução otimizada para um problema real de
cálculo de localizações. Isso se deve ao fato de que cada região pode conter uma quantidade
variável de eventos, que pode variar de poucos a centenas ou até mesmo milhares. A busca
desses eventos é uma operação recorrente dentro do escopo do projeto, o que exigiu um
cuidadoso planejamento para lidar eficientemente com essa complexidade.

A segunda limitação foi adaptar o uso da tecnologia proposta, o Spring Boot, para
atender aos requisitos específicos do projeto. Como o meu projeto não se limitava apenas a
operações de CRUD comuns, foi necessário personalizar os padrões do framework para
atender às necessidades específicas. Isso exigiu um trabalho extra para garantir que a
tecnologia escolhida se adequasse aos requisitos do projeto.

Apesar dessas limitações, o objetivo principal do projeto foi alcançado com sucesso,
que era consolidar o conhecimento sobre como criar uma API, implementar operações de
CRUD e desenvolver os serviços associados. Além disso, também foi possível escrever
testes adequados e documentar tanto a aplicação quanto o processo de desenvolvimento.
Essa conquista contribuiu para a consolidação do conhecimento adquirido durante o curso e
me permitiu adquirir novas habilidades práticas relacionadas ao desenvolvimento de
software.

No geral, embora tenham ocorrido limitações ao longo do projeto, o resultado final


foi satisfatório e alcançou os objetivos estabelecidos, contribuindo para o meu crescimento
profissional e a aplicação prática dos conhecimentos adquiridos durante o estágio.

8. Contribuições do estágio para o aluno

Durante o meu estágio, pude experimentar diversas contribuições valiosas para o


meu desenvolvimento profissional. Entre elas, destaco melhorias significativas na minha
comunicação e habilidades como desenvolvedor. Ao participar de treinamentos voltados
para soft skills, oratória e realizar apresentações ao longo deste semestre, percebi uma
notável melhoria na minha capacidade de expressar minhas ideias de forma clara e eficaz
em ambientes de grupo. Essa habilidade de comunicação aprimorada certamente será
fundamental em minha carreira, permitindo-me colaborar de maneira mais eficiente em
equipes de trabalho e transmitir minhas ideias de maneira assertiva.

No que diz respeito às minhas habilidades técnicas como desenvolvedor, as práticas


de documentação, testes e os conhecimentos adquiridos durante o estágio têm sido
extremamente enriquecedores para a minha formação. Através do contato direto com
projetos reais, pude compreender a importância da documentação adequada para facilitar a
compreensão e a manutenção de sistemas. Além disso, a ênfase nos testes me permitiu
adquirir uma mentalidade mais voltada para a qualidade e robustez do código que produzo.

Os conhecimentos técnicos adquiridos ao longo do estágio estão contribuindo para


minha formação de forma significativa, fornecendo uma base sólida em diferentes aspectos
do desenvolvimento de software. Estou aprendendo novas tecnologias, aprimorando minhas
habilidades de programação e compreendendo como aplicar os princípios e padrões de
projeto de software de forma eficiente.

De forma geral, meu estágio tem sido uma experiência enriquecedora e


transformadora, fornecendo oportunidades valiosas para o crescimento pessoal e
profissional. As contribuições em termos de melhoria na comunicação, desenvolvimento de
habilidades técnicas e aquisição de conhecimentos práticos estão moldando minha
formação de maneira positiva, preparando-me para enfrentar os desafios futuros em minha
carreira como desenvolvedor.

9. Relacionamento entre o Curso e o Projeto de Estágio

O estágio que estou realizando tem uma relação direta com o curso de graduação em
computação. As disciplinas obrigatórias do curso forneceram os fundamentos teóricos
necessários para entender as diversas áreas da computação. Isso me possibilitou aprofundar
meus conhecimentos em subáreas e tecnologias específicas durante o estágio.

Embora o curso tenha sido abrangente e de grande importância para minha


formação acadêmica e profissional, algumas ressalvas podem ser feitas em relação ao
aprofundamento em determinados temas. Seria benéfico que o curso oferecesse mais
disciplinas optativas relacionadas ao desenvolvimento web, teste de software e outras áreas
de interesse dos profissionais da computação.

Além disso, percebo que há uma carência no ensino sistemático de boas práticas de
programação, como tornar o código legível e de fácil manutenção. Embora alguns
professores abordem essas práticas em suas atividades, seria vantajoso que o curso
dedicasse mais atenção a esse aspecto tão relevante na prática profissional da computação.

Em resumo, o curso de graduação em computação oferece uma base sólida de


conhecimentos teóricos e habilidades práticas.

10. Considerações sobre o Curso de Graduação


Após o início deste estágio, pude perceber a solidez e abrangência do curso de
Bacharelado em Computação. Ele oferece uma base sólida nos conceitos fundamentais da
área e ainda possibilita o aprofundamento em subáreas específicas, como o
desenvolvimento Web e teste de software. Essa versatilidade é uma vantagem do curso,
pois permite que os estudantes ampliem seus conhecimentos de acordo com seus interesses
e aspirações profissionais.

No entanto, durante o decorrer desse semestre, identifiquei uma lacuna no ensino de


sistemas distribuídos, bem como nas áreas que o precedem, como Redes, Sistemas
Operacionais e serviços Cloud. Esses temas são de extrema importância no
desenvolvimento de software em escala, pois envolvem o gerenciamento e a comunicação
eficiente entre diversos componentes distribuídos de um sistema. Entender esses conceitos
é fundamental para lidar com a complexidade das aplicações modernas e para garantir a
escalabilidade, confiabilidade e desempenho dos sistemas desenvolvidos.

Considerando o cenário tecnológico em constante evolução, é essencial que o


currículo acadêmico esteja alinhado com as demandas do mercado de trabalho. Portanto,
seria benéfico para o curso de Bacharelado em Computação reforçar o ensino de sistemas
distribuídos e suas áreas correlatas. Isso pode ser feito por meio de disciplinas mais
especializadas, workshops práticos ou projetos de pesquisa, a fim de proporcionar aos
estudantes uma compreensão mais aprofundada desses tópicos-chave e prepará-los
adequadamente para os desafios da indústria de desenvolvimento de software em larga
escala.

Em suma, embora o curso de Bacharelado em Computação seja completo em


relação aos conceitos fundamentais e proporcionem oportunidades de aprofundamento em
áreas específicas, seria interessante fortalecer o ensino de sistemas distribuídos e suas áreas
relacionadas. Investir nessa melhoria curricular proporciona uma formação mais abrangente
e atualizada, e possibilitaria o desenvolvimento de soluções tecnológicas avançadas.

11. Trabalhos Futuros


Durante a transição entre o fim deste semestre e o início do próximo, planeja-se
concluir o desenvolvimento do aplicativo front-end que interage com o projeto mencionado
na seção 5, utilizando o framework Angular. Além disso, no próximo semestre, de acordo
com os orientadores da empresa, terei a oportunidade de participar de um projeto interno e
também farei cursos relacionados a sistemas distribuídos em parceria com a Universidade
Federal de Pernambuco.

Você também pode gostar