Página principal do livro

Compre na Amazon ou UmLivro

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

Engenharia de Software Moderna

Marco Tulio Valente

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:

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.