Quais os principais desafios enfrentados pela engenharia de software?

Quais os principais desafios enfrentados pela engenharia de software?

Página principal do livro

Compre na Amazon, Submarino ou UmLivro

Veja também os cursos de extensão a distância Engenharia de Software Moderna (48 horas) e Teste de Software (20 horas), oferecidos pelo DCC/ICEX/UFMG.

Por Marco Tulio Valente (versão 1.1 - 11/01/2021)

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 em tal tarefa.

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.

Quais os principais desafios enfrentados pela engenharia de software?

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:

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

— Gergely Orosz (@GergelyOrosz) June 8, 2021

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.

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.

Quais os principais desafios enfrentados pela engenharia de software?

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

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. Veja a sua capa no topo desta página.

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 um ano de seu lançamento, mais de 100 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, o aluno tem também que aplicar os conceitos que viu na teoria, dentro do ambiente acadêmico e de sua estrutura curricular.

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

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 60% 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. Como um exemplo inicial, neste outro artigo, começamos a documentar exemplos reais de testes de software.

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:

Quais os principais desafios enfrentados pela engenharia 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 cloud ou em serviços de terceiros.

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 desse alinhamento: sistemas e negócio.

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.

Comentário Final

Antes de 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íno de conceitos básicos de programação, algoritmos e estruturas de dados.


Voltar para a lista de artigos.

Quais são os desafios a serem enfrentados hoje na produção de software?

Um dos principais desafios se refere à questão financeira, afinal recurso financeiro normalmente é escasso e não pode ser jogado fora. Talvez seja o recurso mais crítico para o desenvolvimento de software e um levantamento de requisitos bem executado contribui muito para que se tenham custos em níveis razoáveis.

Quais são as grandes preocupações de um engenheiro de software?

O engenheiro de software cuida de toda a parte técnica e científica dos sistemas, desde o desenvolvimento até a gestão. Ele pode cuidar tanto das aplicações visíveis aos usuários (que é chamada de front-end) quanto dos bastidores –– nesse caso, o back-end.

Quais os principais desafios para a engenharia para os próximos anos?

Hoje, com o avanço das tecnologias e da informação, um dos principais desafios de engenheiros de todas as áreas e, em especial, da construção civil é adequarem-se às novas realidades e inserirem em seu ambiente de trabalho o uso tão necessário das novidades do setor, além de reafirmarem a sua credibilidade.