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
- Dono do produto fala com Designer de Produto.
- Designer de Produto faz pesquisa com usuários.
- Designer de Produto faz protótipo.
- Dono do Produto e Engenheiro de Software fazem apontamentos em relação ao protótipo.
- Designer de Produto refaz protótipo com base nas sugestões.
- Com protótipo aprovado, Designer de Produto faz versão final das telas.
- Engenheiro de Software faz a "planta baixa" baseado nos requisitos do sistema.
- 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.
- Com "planta baixa" aprovada, Engenheiro de Software desenvolve módulos iniciais e define os padrões do projeto.
- Com a estrutura inicial do software criada, Desenvolvedores de Software começam a atuar no projeto, sob supervisão do Engenheiro de Software.
- 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