Você está na página 1de 7

Página principal do livro

Compre na Amazon ou Casas Bahia

Veja também nosso curso de extensão a distância, com certificados emitidos pelo DCC/UFMG.

Engenharia de Software Moderna


1 Desafios da Formação de Engenheiros de
Software
1.1 Introdução
Em 2019, ministrei pela primeira vez um curso de Engenharia de Software para alunos de
graduação. Desde então, tenho estudado, trabalhado e refletido sobre questões ligadas à
formação qualificada de Engenheiros de Software no Brasil. Assim, neste artigo, vou
compartilhar minha visão sobre os desafios envolvidos nessa tarefa.

1.2 Relevância
Primeiro, para delimitar o contexto deste artigo, acho importante começar lembrando que
Engenharia de Software é cada vez mais essencial na formação de alunos de Ciência da
Computação, Sistemas de Informação, Engenharia de Computação, etc.

Para ressaltar esse fato, na primeira aula da minha disciplina apresento para os alunos o
seguinte diagrama.
Proporção de Engenheiros de Software versus Cientistas da Computação

Esclareço que ele não é baseado em nenhum estudo científico, mas na minha experiência
acadêmica e profissional.
Costumo usar também o seguinte tweet de um profissional com larga experiência no mercado
de desenvolvimento de software para reforçar o meu argumento:

Gergely Orosz
@GergelyOrosz · Follow

A lot of people are excited about other tech


disciplines than software engineering. But it's
good to know ratios I've seen at Uber &
similar places:

PMs: 1 for every 10-20 engineers


PMM: 1:30-100
Data Scientist/analyist: 1:10-20
Designer: 1:10-20
UX researcher: 1:20-50
3:10 PM · Jun 8, 2021

Read the full conversation on Twitter

82 Reply Share

Read 8 replies

Segundo o tweet, grandes empresas de tecnologia possuem de 10 a 20 mais engenheiros de


software do que Product Managers (PMs), analistas e cientistas de dados e designers de
interfaces, por exemplo.
Portanto, a mensagem para os alunos é clara: quando vocês se formarem, não todos, mas a
maioria será Engenheiro de Software. Ou terá um título equivalente, como Frontend, Backend,
Fullstack, Mobile developer, Arquiteto de Software, Tech ou Squad Lead, etc.

Contexto Brasileiro
Temos também no Brasil capacidade, vocação e potencial para desenvolver um mercado de
software relevante e com impacto global. Na verdade, não estou falando nenhuma novidade,
pois sempre se falou nesse assunto. Também, não estou sugerindo que nosso mercado de
software seja inexistente e inexpressivo. Pelo contrário, estamos avançando e temos inúmeros
casos de sucesso.
Por outro lado, temos esse descasamento paradoxal entre oferta e demanda de profissionais
de TI no Brasil. Digo, em um país onde existe um brutal problema de desemprego temos um
setor da economia – empresas de TI – com centenas de milhares de vagas abertas, sendo a
maioria delas para trabalho diretamente relacionado com Engenharia de Software.
Assim, acredito que nunca foi tão importante formar, no Brasil, um maior número de
profissionais com capacidade e interesse de atuar na área de Engenharia de Software.

1.3 Eixos de Formação


O propósito central deste artigo é destacar que a formação qualificada de Engenheiros de
Software requer um conjunto de esforços em dois eixos (veja também a próxima figura):
Eixo Central de Formação: os desafios nesse eixo são de ordem conceitual e prática.
Eixo Transversal de Formação: aqui, os desafios envolvem, principalmente, um domínio
de habilidades comportamentais (soft skills) e também uma visão – mesmo que mais
ampla – de negócios.

Eixos de formação de Engenheiros de Software

A seguir, detalho um pouco mais sobre esses eixos e suas respectivas categorias de formação.

1.4 Eixo Central de Formação


Este eixo envolve a formação básica de um Engenheiro de Software, a qual deve contemplar,
em nossa opinião, o desenvolvimento de habilidades conceituais e práticas.

Formação Conceitual
Quando ministrei a disciplina de Engenharia de Software pela primeira vez, na graduação, senti
uma falta de livros didáticos mais modernos na área. Por isso, resolvi dedicar um ano de
intenso trabalho para escrever um livro-texto sobre Engenharia de Software.

Sou suspeito para afirmar, mas acredito que, após a escrita desse livro, estou conseguindo
cobrir essa dimensão do ensino de Engenharia de Software de maneira satisfatória. Isso
envolve transmitir conceitos, práticas e princípios, sempre modernos, de processos, projeto,
arquitetura, testes, manutenção, etc de software.
Na verdade, estamos bastante satisfeitos com a adoção do livro. Após três anos de seu
lançamento, mais de 200 professores estão usando o nosso material.

Também gostaríamos de comentar sobre dois problemas que podem ocorrer quando aborda-
se a parte conceitual:
Ser muito abrangente e “conteudista” e, assim, procurar ensinar todo e qualquer método,
técnica ou ferramenta. Achamos que isso torna as aulas de Engenharia de Software
massantes e repetitivas.

Ser opinativo e, assim, emitir diversos comentários e vereditos sobre os temas estudados,
sem que eles estejam baseados em uma evidência empírica mais sólida.
Para evitar o primeiro problema, tomamos o cuidado de tornar o nosso livro enxuto (lean),
com cerca de 400 páginas. Mesmo em futuras edições, pretendemos manter esse tamanho e,
assim, evitar que o livro se transforme em uma enciclopédia. No fundo, a ideia é maximizar o
valor de cada página e, assim, manter o engajamento do leitor. Para nos ajudar a cumprir esse
objetivo, sempre lembramos da seguinte frase de Mark Twain:

“ Eu não tive tempo de escrever uma carta curta, então acabei escrevendo uma carta
longa …

No entanto, é importante ressaltar que extensões do livro já estão em pleno andamento, mas
na forma de artigos didáticos. Nesse caso, o propósito não é apenas apresentar um conteúdo
novo, mas também usar os artigos como trabalhos para os alunos. Esclareço: os artigos são
auto-contidos ou, no máximo, referenciam conteúdo do próprio livro. E são sempre
acompanhados de exercícios.

Formação Prática
Porém, de nada adianta dominar a teoria, se o aluno nunca colocou ela em prática. Ou seja,
ainda dentro do ambiente acadêmico e de sua estrutura curricular, é interessante que o aluno
possa aplicar os conceitos que viu na teoria.

Ao comentar sobre isso, sempre me lembro da frase do Linus Torvalds:

“ Falar é fácil, mas quero ver o código!

Então, sobre a dimensão prática da formação do Engenheiro de Software, quero dizer que não
concordo que ela possa ser completamente terceirizada por meio de estágios ou atividades
semelhantes.
Por outro lado, quando a universidade assume parte da responsabilidade pela formação
prática dos alunos, surgem complicações naturais do ambiente acadêmico. Por exemplo,
torna-se desafiador pedir que os alunos implementem um sistema real em uma disciplina
acadêmica, na qual devem ser cobertos também aspectos conceituais.

Da mesma forma, pedir para que os alunos trabalhem em sistemas de terceiros, como
sistemas de código aberto, também não é trivial. O motivo é que o aluno, normalmente, não
tem tempo, no escopo de uma disciplina acadêmica, para entender um sistema real e
complexo.
Assim, para atender à formação prática dos alunos, estamos trabalhando em duas frentes
principais:

Oferecendo para graduação, na UFMG, uma disciplina chamada Prática de


Desenvolvimento de Software, na qual metade da nota refere-se a um trabalho em
equipe, que requer o desenvolvimento de um sistema real (ou com características
próximas de um sistema real). Nesse trabalho, os alunos devem usar um método ágil e,
portanto, têm que escrever histórias de usuários, implementá-las em sprints, realizar
alguns eventos, como sprint reviews, implementar testes, etc. Durante a disciplina, eu,
como professor, tento assumir o papel de Product Owner, Scrum Master e consultor
técnico dos times.

Estamos também iniciando o desenvolvimento de um conjunto de roteiros e programas


“ilustrativos”, de pequeno porte e que exercitam conceitos básicos de divisão processos,
arquitetura, devops, testes, etc.

1.5 Eixo Transversal de Formação


Neste eixo estão incluídas duas categorias de formação: comportamental e em negócios.
Decidimos chamar o eixo de transversal porque ele trata de questões que são também
importantes em outros profissionais de computação, como cientistas de dados,
administradores de redes, etc. Por isso, elas podem também ser abordadas em outras
disciplinas de graduação.

Formação Comportamental
Concluindo e, na falta de um nome melhor, estou usando o termo “formação
comportamental” para referenciar os soft skills que são fundamentais em um Engenheiro de
Software. Isto é, hoje em dia, não basta saber programar e dominar os conceitos básicos da
área (formação conceitual). Não basta também ter capacidade de realização (formação
prática).

Além disso, o Engenheiro de Software moderno tem que saber trabalhar em equipe, saber
liderar e ser liderado, saber se comunicar e se expressar, de forma escrita e oral, saber ouvir e
saber falar na hora certa, ser capaz de entender o que a organização espera dele, etc.

De fato, em um artigo recente, publicado na revista científica Information and Software


Technology, fizemos uma análise de várias ofertas de emprego postadas no Stack Overflow
Jobs. Pudemos confirmar que a grande maioria faz referência a soft skills. Veja a seguir aqueles
que são mais demandados:

Soft skills demandados em Engenheiros de Software

Porém, a abordagem da dimensão comportamental em cursos de Engenharia de Software é


ainda um problema em aberto, pelo menos para mim. Talvez, na verdade, o problema não seja
exclusivo de disciplinas de Engenharia de Software, mas de caráter mais geral na formação de
profissionais de Computação.

Formação em Negócios
Em um mundo cada vez mais ágil e dinâmico, os Engenheiros de Software não podem
restringir sua atuação à escrita de código. Eles têm também que constantemente refletir sobre
o valor que está sendo gerado pelo código que eles produzem.

Para isso, os profissionais têm que entender do negócio principal da empresa na qual
trabalham. Isso é importante inclusive para conversar e argumentar com outros profissionais,
como POs, gerentes de produtos, designers e mesmo com os usuários finais.

No fundo, o emprego de Engenheiros de Software depende do valor gerado pelo código que
eles produzem. Então, não é bom assumir que os requisitos e funcionalidades de um sistema
vão sempre chegar prontos e perfeitamente definidos. O desenvolvedor moderno tem que ser
capaz de propor novas funcionalidades, participar e influenciar na evolução dos sistemas nos
quais trabalha, sugerir novas funcionalidades e mesmo novas oportunidades de negócio.
Idealmente, um time de desenvolvedores deve procurar relacionar seu trabalho com a
melhoria de um indicador de negócio. Por exemplo, uma determinada funcionalidade pode
estar sendo implementada porque ela tem potencial para ampliar a base de clientes em x% ou
reduzir a taxa de cancelamentos em y%. Ela pode ainda permitir que a empresa economize z
milhões de reais em serviços de computação em nuvem ou em outros serviços.
Evidentemente, do ponto de vista de ensino, não dá para tratar da variedade de negócios que
beneficiam-se atualmente de software. Porém, pelo menos transversalmente, é importante
comentar com os alunos sobre a importância do alinhamento entre sistemas e negócios.
Outras disciplinas de graduação – como uma disciplina de empreendedorismo – podem
também ajudar nessa formação. Na verdade, em uma época de transformação digital – como
a que estamos vivemos –, as oportunidades que existem para criação de novas empresas são
imensas. E Engenharia de Software é o motor da maioria dos processos de transformação
digital. Adicionalmente, as empresas cobram cada vez mais uma mentalidade empreendedora
de seus colaboradores, por meio do que costuma-se chamar de empreendedorismo interno.

1.6 Conclusão
Para concluir, gostaríamos de mencionar dois pré-requisitos que achamos fundamentais para
iniciar a formação de engenheiros de software:
É muito importante que o aluno goste de programar. Como fizemos questão de dizer no
prefácio do nosso livro “cada vez mais, engenheiros de software têm que escrever código.
Hoje, há pouco espaço para dizer que eu não preciso programar, pois sou arquiteto ou
analista.”
É muito importante também que o aluno saiba programar. Ou seja, o aluno já deve ter
domínio de conceitos básicos de programação, algoritmos e estruturas de dados.

Voltar para a lista de artigos.

Modo noturno

Direitos autorais reservados. Versão para uso pessoal. Para reportar quaisquer erros, incluindo pequenos erros de
ortografia, use este formulário.

Você também pode gostar