Veja também nosso curso de extensão a distância, com certificados emitidos pelo DCC/UFMG.
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.
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.
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:
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:
— Gergely Orosz (@GergelyOrosz) June 8, 2021
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
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.
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.
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.
A seguir, detalho um pouco mais sobre esses eixos e suas respectivas categorias 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.
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.
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.
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.
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:
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.
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.
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.