IGTI Blog

Os desafios do especialista em Engenharia de Software com métodos ágeis

Há várias opções para o profissional de tecnologia, e a Engenharia de Software é uma delas. Há muita demanda por projetos de desenvolvimento de software, sejam projetos internos ou externos. A carreira na Engenharia de Software é ampla e cheia de oportunidades para cada tipo de carreira. Há muitas áreas de conhecimento e muitas habilidades necessárias para se construir software. Muitas pessoas acham que software se resume a codificação, mas construir software é uma atividade extremamente complexa e exige profissionais de diversas especialidades. Neste artigo, por exemplo, é possível ver os diversos caminhos tecnológicos possíveis para um desenvolvedor web.

A Engenharia de Software é uma área dinâmica e em constante mudança. O profissional precisa saber se adaptar a essas mudanças, pois as tecnologias evoluem constantemente e o profissional precisa estar sempre atualizado.  As habilidades técnicas não são suficientes para quem trabalha em uma empresa que utilize metodologias ágeis. O comportamento conta muito. Trabalhar em equipes não é simples, pois quando colocamos várias pessoas com personalidades distintas para trabalhar juntas, é necessário gerir os conflitos e convergir as atividades para um objetivo comum.

Este artigo vai passar pelas áreas de especialização na Engenharia de Software para dar um panorama geral da área e das habilidades necessárias. É importante lembrar que é praticamente impossível que um profissional seja especialista em todas as áreas da engenharia de software. Entretanto é importante ter uma visão geral para conseguir trabalhar e gerir projetos de desenvolvimento de software.

Principais desafios do profissional de Engenharia de Software

O profissional de Engenharia de Software se depara diariamente com questões técnicas e comportamentais. Ele precisa estar atento aos desafios tecnológicos, e também ao grande desafio de trabalhar com outras pessoas para construir um sistema. Vários são os desafios enfrentados pelo Engenheiro de Software.

Ambiente tecnológico em constante mudança

Novas tecnologias estão surgindo e as antigas estão se atualizando o tempo todo. A evolução tecnológica é notada por qualquer pessoa, bastando imaginar o ambiente tecnológico de cinco anos atrás para percebermos a grande diferença. Dessa forma, o profissional precisa estar sempre aprendendo algo novo para não ficar para trás.

Muitas áreas de conhecimento e atuação na Engenharia de Software.

Para lidar com a construção de um sistema há várias áreas de conhecimento, com as mais variadas características. Os generalistas precisam aprender um pouco de tudo e os especialistas precisam ter uma visão geral. Uma equipe ou empresa precisa ter habilidades em todas as áreas para garantir o sucesso de um produto de software.

Curadorias de conteúdos para algumas das áreas da engenharia de software:

 

Todo engenheiro de software acaba sendo um generalista, mas há sempre uma área de conhecimento em que se destaca mais.

Abstração e complexidade do software

Software tem uma natureza abstrata e complexa, e lidar com tamanha abstração e complexidade exige muita habilidade dos engenheiros de software. À medida que um sistema cresce de tamanho, também cresce em complexidade, portanto, sem esforços de qualidade seria impossível manter ou evoluir o sistema.  Por isso é preciso gerenciar o crescimento para garantir que a complexidade não saia do controle da equipe.

Software transforma a maneira de trabalhar e de viver

Todos nós estamos rodeados de software em nossas vidas pessoais e profissionais. O software transformou e transforma a maneira como vivemos e trabalhamos, e isso faz com que os requisitos estejam em constante mudança, pois as necessidades mudam à medida que usamos um sistema. É necessário muito esforço e atenção aos requisitos para garantir que os esforços de desenvolvimento estão gerando valor para o cliente.

Trabalhar em equipe para produzir software de qualidade

Cada profissional tem sua personalidade e sua maneira de trabalho. Em um ambiente ágil é essencial trabalhar em equipe para garantir o sucesso de um projeto. Dessa forma, quando várias pessoas diferentes trabalham juntas em uma atividade tão complexa como o desenvolvimento de software é preciso haver esforços de gestão de equipes para mediar os conflitos e garantir a coesão dos esforços a um objetivo comum.

Áreas de conhecimento da Engenharia de Software

A Engenharia de Software é uma área ampla que pode ser dividida em subáreas de conhecimento. O SWEBOK (Software Engineering Body of Knowledge) faz uma divisão em várias áreas para consolidar os conhecimentos necessários ao Engenheiro de Software.

Requisitos – Entender as necessidades dos usuários

O ponto de partida para o desenvolvimento de software são os requisitos, pois todo software surge a partir de uma necessidade.

A Engenharia de Requisitos é dividida em quatro etapas que englobam todo o ciclo de vida dos requisitos de um sistema.

  • Elicitação – Descobrir os requisitos do sistema
  • Análise – Classificar, organizar e priorizar os requisitos de acordo com os objetivos do projeto.
  • Especificação – Detalhar os requisitos para que a equipe técnica seja capaz de transformá-los em software. Em metodologias ágeis é comum trabalhar com Histórias de Usuários para especificar os requisitos.
  • Validação – Garantir que os requisitos estão alinhados às demandas dos usuários e que satisfazem as suas necessidades da melhor maneira possível

Arquitetura – Tomar as melhores decisões para um produto de qualidade

A arquitetura de um software pode ser definida como o conjunto de decisões que são tomadas ao longo do projeto. Para tomar as melhores decisões os líderes técnicos utilizam modelos, que propiciam um bom ambiente para discutir as decisões, uma vez que abstraem os fatores irrelevantes e focam nas questões mais importantes.

Em alto nível, a arquitetura mostra como o sistema está organizado e como seus elementos interagem para atender os requisitos.

Implementação – Lidar com a complexidade e construir o sistema

Muitos profissionais da área de software resumem o desenvolvimento de software apenas à codificação. Esse é um erro comum e muito grave, pois a implementação é apenas uma das área de conhecimento da Engenharia de Software. Entretanto, é uma área muito importante e, assim como as outras, exige grande capacidade técnica para ser realizada.

O objetivo da etapa de implementação é produzir código que se tornará o software. Dessa forma, as atividades de implementação devem estar em grande sintonia com as outras atividades para garantir a produção software de qualidade. Os principais desafios da etapa de implementação são:

  • Reduzir complexidade do código
  • Preparar o código para futuras alterações
  • Construir para verificação e testes
  • Reuso de código
  • Uso de padrões de desenvolvimento

Testes – Encontrar os defeitos o mais rapidamente possível

O objetivo das atividades de testes é encontrar defeitos. Simples assim. E o desafio do Engenheiro de Software é saber como encontrar os defeitos o mais rápido possível. Testes podem ser manuais ou automatizados. Para cada tipo de teste há várias estratégias possíveis, e é importante ter conhecimento para escolher a melhor estratégia para atingir os objetivos do projeto e não ultrapassar os limites do orçamento.

Manutenção – Trabalhar com software em produção garantindo sua integridade

A manutenção de um sistema começa quando ele é entregue e começa a funcionar no ambiente de produção. A partir desse momento é necessário ter mais atenção às alterações realizada, pois o sistema não pode parar de funcionar.

DevOps – Garantir o ambiente certo para o sistema funcionar

DevOps é um termo novo que remete a Desenvolvimento + Operação (do inglês: Development and Operations). É o profissional que entende de desenvolvimento de software e de gestão de infraestrutura para garantir o processo de entrega (deploy) do sistema.

O grande objetivo do profissional de DevOps é a automação de todo o processo de integração (build), testes, entrega e mudanças nos ambientes de infraestrutura. Ele atinge seu objetivo ao disseminar a cultura de que a integração, testes e entrega podem acontecer rapidamente e constantemente.

Gestão da Engenharia de Software

A Gestão da Engenharia de Software consiste na aplicação de atividades de gestão para garantir que o software será entregue de maneira eficiente e efetiva, gerando valor para as partes interessadas. Diferentemente de outras áreas de gestão, o desenvolvimento de software tem características peculiares que demandam um conhecimento de gestão específico para projetos de software. O gestor certamente deve conhecer as diversas áreas da engenharia de software para conseguir gerenciar um projeto de desenvolvimento de sistemas.

Processos – As melhores práticas para produzir software

Há várias formas diferentes de se conduzir um projeto de desenvolvimento de software. Mesmo dentro das metodologias ágeis há várias opções. O Engenheiro de Software deve conhecer os processos e boas práticas que sejam melhor para o contexto da equipe e do projeto. As várias atividades da engenharia de software devem estar devidamente orquestradas para garantir que o produto final satisfaça as demandas do cliente.

Processos bem definidos e executados facilitam o entendimento das pessoas, a comunicação e coordenação, a gestão do projeto, a medição e a garantia da qualidade do projeto.

Competências comportamentais

A habilidade técnica do profissional de Engenharia de Software é essencial. Mas a habilidade técnica não é suficiente para a produtividade. As competências comportamentais são extremamente importantes para trabalhar em equipes ágeis e convergir os esforços para o que realmente gera valor no projeto.

É importante aprender com os mais experientes. Nem tudo está nos livros.

Há muito conteúdo técnico por aí, no entanto, mesmo com grande carga teórico é importante ter humildade para aprender com os mais experientes, pois reconhecer os problemas e entender onde podemos melhorar como profissionais agiliza o crescimento de carreira.

Saber trabalhar com o time muitas vezes é mais importante do que a produtividade.

Muitos profissionais tentam ser mais produtivos para se destacarem, mas em uma equipe ágil o trabalho em equipe é mais importante que a produtividade. Funcionários de alto desempenho são mais valorizados pela sua capacidade de resolver problemas complexos, e não pela velocidade com que resolvem os problemas.

O usuário, cliente e empresa são importantes. É preciso equilibrar as demandas de cada um deles

Em todas as atividades da Engenharia de Software sempre estamos envoltos por demandas das diversas partes interessadas do projeto. Nesse cenário, a habilidade de negociação é importante para negociar com as diversas partes e conseguir equilibrar as necessidades de cada um. Não devemos negligenciar nenhuma das partes, pois isso pode prejudicar muito o projeto e o produto.

Inteligência emocional faz a diferença para o profissional que trabalha com um time

Quando trabalhamos em equipes estamos envoltos por pessoas com diferentes personalidades e diferentes necessidades. Assim, o profissional que consegue reconhecer e avaliar os próprios sentimentos e os dos outros certamente se destacará no trabalho em equipe. Essa é uma característica essencial para um líder.

Entenda as necessidades do projeto e trabalhe para melhorar o que não estiver bom

O Engenheiro de Software deve ter proatividade para tomar iniciativas importantes para o projeto mesmo que ninguém as tenha solicitado. Deve-se identificar os pontos fracos do projeto, equipe e produto e trabalhar para melhorá-los. O profissional que fica esperando instruções para tudo dificilmente se destaca em uma empresa.

O perfil profissional do Engenheiro de Software

O perfil do Engenheiro de Software é difícil de definir, pois há várias áreas de atuação e várias especialidades possíveis. Alguém que se defina como Engenheiro de Software deve ter noções técnicas em todas as áreas de conhecimento.

Muitos profissionais da área são especialistas em determinada área, mas não têm visão do todo. Eles entendem como programar, mas não são capazes de liderar uma iniciativa de desenvolvimento de software, por não conseguirem enxergar o projeto de maneira global. Isso é essencial para o Engenheiro de Software, que consegue ter uma visão mais analítica e global do projeto e é capaz de relacionar várias informações para atacar o problema de maneira efetiva.

O Engenheiro de Software deve estar preparado para trabalhar em um ambiente mais dinâmico com mudanças constantes. Por isso, ele deve ser capaz de se manter atualizado e estudar por conta própria, pois todas as áreas evoluem constantemente.

O desenvolvimento de software é um processo mais criativo do que operacional. Assim, o engenheiro de software deve ser criativo o suficiente para resolver os problemas mais complexos, e técnico o suficiente para construir tais soluções.

Não pode faltar atenção à satisfação do cliente. O desenvolvimento de software altera a maneira de viver e trabalhar, e um produto que não se atenta às necessidades dos usuários e clientes tem grandes chances de fracassar. O engenheiro de software deve ter a habilidade de relacionar suas atividades às necessidades das partes interessadas do projeto.

Conclusão

Projetos de desenvolvimento de software demandam profissionais das mais diversas áreas de conhecimento. É importante ter engenheiros de software especialistas em cada uma dessas áreas, mas é essencial que todos tenham uma visão geral das outras áreas para conseguir atingir os resultados do projeto.

As habilidades comportamentais também são muito importantes. Capacidade técnica não é suficiente para o profissional se destacar em uma empresa ou no mercado.

A engenharia de software é uma área com muita demanda de profissionais. Esse cenário não deve mudar nos próximos anos, pois o software tem sido cada vez mais presente em nossas vidas pessoais e profissionais.

Professor autor: Augusto Farnese