Perguntas Desconfortáveis Parte 2

Imagem de capa Perguntas Desconfortáveis Parte 2

Questão

Qual a diferença entre arquiteto de software, engenheiro de software, desenvolvedor de software, e onde você se encaixa?

Introdução

Essa série tem o objetivo de gerar conteúdo para provocar seu pensamento. A intenção não é fornecer uma abordagem ou ponto de vista correto/incorreto, mas sim oferecer uma pergunta desconfortável para que você tenha que realmente ir fundo na sua mente para entender o porquê de suas decisões, e quais as motivações por trás delas.

Outro objetivo é o de compartilhar conhecimento, experiências pessoais e descobertas, assim como recebê-las da comunidade, com a intenção de gerar um espaço saudável para discussão sobre as questões apresentadas.

Contexto sobre a questão

Atualmente, estou profundamente interessado em tópicos do tipo padrões de projeto, arquitetura de software e código limpo em geral, então ficou claro para mim a diferença entre as habilidades necessárias para papéis diferentes em empresas que constroem produtos de software.

Com isso em mente, estava tentando descobrir a real diferença entre tais posições, implicando no que devemos esperar de cada uma delas.

Minha resposta pessoal para a questão

Depois de pesquisar entre diferentes visões sobre definições do título arquiteto de software, engenheiro de software e desenvolvedor de software, aliado às definições de engenheiro civil e arquiteto, chego a seguinte conclusão (não definitiva, porém) de tais carreiras:

Obs: se você tiver uma visão diferente, vamos discutir e atualizar a lista juntos!

Desenvolvedor de Software

  • Análogo ao papel do pedreiro e demais profissionais que atuam na construção da casa, no caso, na construção do software.
  • Responsável por implementar o projeto desenvolvido pelo engenheiro de software, e, idealmente, o desenvolvedor de software deve ser supervisionado pelo engenheiro.
  • Não precisa ter noção do todo (visão geral).
  • Não precisa definir padrões, apenas os seguir. Pode, entretanto, com o tempo, desenvolver uma intuição de como projetar, mas é um conhecimento que vem através da prática/repetição, tentativa e erro, e não através do esforço/estudo consciente de dominar os padrões de projeto e o porquê de se aplicar cada um no seu determinado momento.
  • Não precisa ter a bagagem conceitual necessária para projetar sistemas dimensionados especificamente para os requisitos de negócio, e redimensionamentos do projeto caso os requisitos mudem.
  • Não precisa ter o conhecimento necessário para escolher os "trade-offs" em relação a decisões do projeto visando atender de forma otimizada aos requisitos de negócio.
  • Deve ter bom conhecimento das ferramentas: linguagens de programação, frameworks, bibliotecas, sistema de controle de versão (git).
  • É bom ter algum conhecimento sobre paradigmas de programação e padrões de projeto.

Engenheiro de Software

  • Pessoa que tem domínio de como projetar, estruturar e dimensionar o software para atender os requisitos de negócio, de acordo com suas necessidades presentes e futuras.
  • Deve ter conhecimento de padrões de software.
  • Deve saber orientar e supervisionar o trabalho dos desenvolvedores para que a construção do software esteja alinhada com os padrões do projeto previamente estabelecidos.
  • Para supervisionar a equipe, é necessário que tenha um bom entendimento de processos e metodologias de desenvolvimento de software.
  • Deve ser capaz de elaborar a "planta baixa" do software, que depois será executada pelos desenvolvedores, sob sua supervisão, para que tudo esteja sendo construído de acordo com o projetado.
  • Deve saber escolher a ferramenta certa para o momento certo, sem utilizar soluções limitadas para requisitos complexos, e soluções complexas para requisitos simples.
  • Deve ser capaz de entregar o máximo de valor com o mínimo de recursos.
  • Deve saber intervir na execução do projeto caso o mesmo esteja sendo feito de forma discordante com o inicialmente projetado.
  • Deve ser capaz de adaptar o projeto, na medida do possível, caso os requisitos tenham sido alterados.
  • Deve ter pleno entendimento do impacto de cada escolha no projeto.
  • Grande diferença de outros campos da engenharia: também deve ser pelo menos um bom desenvolvedor.
  • Importante: em alguns países, você só pode ter o título de Engenheiro se tiver uma educação formal na área.

Arquiteto de Software

Considerando as matérias estudadas e a atuação do engenheiro civil e do arquiteto, podemos perceber que o arquiteto tem uma abordagem mais ligada ao aspecto artístico, subjetivo e humano da construção, enquanto o engenheiro se preocupa mais com o aspecto estrutural, objetivo e gerencial do projeto.

Dessa forma, no processo de construção de um produto de software, o profissional envolvido em tal processo que mais se assemelha às características de um arquiteto da construção civil, na realidade, é o Designer de Produto (UX/UI Designer), profissional com habilidades em entender e projetar a experiência do usuário (aspecto humano) e com habilidade de cuidar da aparência do produto (aspecto artístico), de forma a refletir a intenção do negócio e expressar a ideia da empresa/produto (aspecto subjetivo).

Sendo assim, não acho que o título Arquiteto de Software seja necessário/correto, visto que software não é algo artístico/subjetivo, mas sim uma construção objetiva oriunda de conceitos da Ciência da Computação, aliado a padrões e processos desenvolvidos e estudados na Engenharia de Software, aplicados através de ferramentas como linguagens de programação, frameworks, bibliotecas, etc.

Exemplo de um fluxo básico de construção de software e pessoas envolvidas

  1. Dono do produto fala com Designer de Produto.
  2. Designer de Produto faz pesquisa com usuários.
  3. Designer de Produto faz protótipo.
  4. Dono do Produto e Engenheiro de Software fazem apontamentos em relação ao protótipo.
  5. Designer de Produto refaz protótipo com base nas sugestões.
  6. Com protótipo aprovado, Designer de Produto faz versão final das telas.
  7. Engenheiro de Software faz a "planta baixa" baseado nos requisitos do sistema.
  8. Engenheiro de Software passa ao Dono do Produto as etapas e estimativas necessárias para execução do projeto, considerando entregas incrementais, de acordo com os princípios ágeis.
  9. Com "planta baixa" aprovada, Engenheiro de Software desenvolve módulos iniciais e define os padrões do projeto.
  10. Com a estrutura inicial do software criada, Desenvolvedores de Software começam a atuar no projeto, sob supervisão do Engenheiro de Software.
  11. As entregas começam a acontecer, de forma incremental, com o objetivo de entregar o máximo de valor no menor tempo possível, sempre garantindo a qualidade da entrega.

Artigo original: Uncomfortable Question 002