No mundo da tecnologia, o termo ‘design’ é tipicamente associado a desenvolvedores front-end e à estética visual—como um site impressionante ou uma interface de usuário atraente. No entanto, os desenvolvedores back-end também são designers. Eles são especialistas em Design de Sistema, construindo cuidadosamente a arquitetura, as dependências e as estruturas de dados que moldam as experiências dos usuários. Este artigo explorará a arte muitas vezes esquecida em seu trabalho.
A internet está repleta de memes que retratam a dinâmica “dev vs. designer”, mostrando uma colaboração que pode resultar em resultados tanto impressionantes quanto divertidos. Frequentemente, reservamos o termo “designer” para funções relacionadas ao “design de interface”, como Web Designer, UI/UX Designer ou Product Designer. Podemos até, talvez inconscientemente, associá-lo a alguém artístico e criativo, focado em criar produtos bonitos e intuitivos com uma estética cuidadosamente desenvolvida.
No entanto, essa ênfase no aspecto artístico do “design” pode nos fazer esquecer seu lado prático. Em última análise, o design envolve tomar decisões sobre como as coisas devem parecer, funcionar e operar para atingir objetivos específicos. É por isso que os engenheiros de software back-end também são designers, e o “design de sistema” é uma categoria legítima de design.
Além de contribuir com feedback e ideias que moldam o design de um produto—uma discussão importante por si só—os engenheiros back-end fazem decisões consistentes que influenciam o design do software. Desde a arquitetura geral de um sistema até as dependências individuais e estruturas de dados, os desenvolvedores enfrentam inúmeras escolhas que afetam a experiência do usuário final, assim como a usabilidade e a manutenibilidade do software.
Apesar de frequentemente serem retratados como rivais em memes engraçados, os desenvolvedores back-end e front-end são, na realidade, mais semelhantes do que muitas pessoas imaginam.
O Lado Pragmático do Design
O design é como uma moeda de duas faces, com a estética e a criatividade de um lado e o pragmatismo do outro. Ambos coexistem e são essenciais para entregar um produto que atenda às expectativas e necessidades dos usuários. No entanto, o aspecto artístico é frequentemente mais evidente, priorizando a criação de uma interface atraente e intuitiva—qualidades que os usuários notam e apreciam imediatamente.
Por outro lado, o lado pragmático é igualmente importante, pois orienta as decisões em direção a soluções que sejam eficientes, escaláveis e manuteníveis; no entanto, esses aspectos podem não ser tão óbvios para os usuários.
As escolhas de design feitas pelos engenheiros de software permeiam todas as camadas da pilha tecnológica, e tanto os engenheiros front-end quanto os back-end enfrentam esses desafios diariamente. Essas escolhas incluem:
- Definir a arquitetura do sistema
- Adicionar novos microserviços
- Integrar um novo provedor de SaaS
- Modificar uma API
- Alterar a estrutura de dados
É um equívoco pensar que os desenvolvedores back-end apenas “produzem código”: as decisões de design tomadas ao construir o back-end de uma aplicação influenciam indiretamente a experiência do usuário e são tão críticas quanto as decisões do front-end. Por exemplo, considere fatores como o tempo de carregamento de uma aplicação, a rapidez com que você pode buscar dados e a fluidez da experiência do usuário em diferentes contextos.
A confiabilidade, escalabilidade, desempenho e eficiência são atributos de uma aplicação que frequentemente consideramos garantidos; no entanto, sua ausência se torna dolorosamente evidente quando algo dá errado—especialmente quando decisões ruins de design de sistema back-end foram tomadas.
A Arte dos Engenheiros de Back-end
Chamar os Engenheiros de Back-end de “artistas” pode parecer uma exagero até que se perceba a quantidade de criatividade, intuição, adaptabilidade e habilidades de resolução de problemas necessárias para desenvolver o back-end de um sistema distribuído complexo. Dentre as muitas abordagens possíveis para alcançar um determinado objetivo, o engenheiro back-end precisa selecionar o design que atenda perfeitamente aos requisitos, ao mesmo tempo que possa evoluir de maneira tranquila ao longo do tempo.
De uma perspectiva mais ampla, os engenheiros back-end precisam evoluir sua abordagem com base nas mudanças na tecnologia em toda a indústria.
Pense, por exemplo, em como a programação costumava exigir a escrita de código do zero, linha por linha. Agora, é uma abordagem semelhante à montagem, onde os engenheiros de back-end precisam selecionar e combinar meticulosamente componentes, bibliotecas e frameworks para criar um sistema completo onde cada peça se encaixa perfeitamente.
Além disso, eles precisam frequentemente abraçar novos tipos de arquiteturas de software, paradigmas de programação, etc., para atender aos requisitos impostos pela transição para sistemas distribuídos e aplicações nativas na nuvem.
No nível empresarial, pode ser necessário criar designs que mudem intencionalmente ao longo do tempo (ou seja, design de sucessão e arquitetura evolutiva) devido a requisitos de produto futuros conhecidos ou desconhecidos. Ou podem precisar revisar suas escolhas tecnológicas e evoluir suas opções de pilha tecnológica para aproveitar novas tecnologias (por exemplo, LLMs).
Em uma observação pessoal, ao longo dos meus anos na tecnologia, conheci um grande número de engenheiros que também são talentosos artistas visuais ou músicos. Embora eu não tenha encontrado nenhum estudo oficial para corroborar essa observação, não ficaria surpreso ao saber que há uma correlação entre ser um ótimo desenvolvedor e ser um ótimo músico ou artista.
Vale ressaltar também que muitos engenheiros realizam o design lógico/funcional implicitamente, sem perceber (por exemplo, quando quebram uma User Story). No entanto, abraçar totalmente a necessidade de Design de Sistema e aplicá-lo em seu trabalho diário torna-se uma grande vantagem competitiva, mesmo apenas pela sua capacidade de prevenir dívidas técnicas—ou seja, identificando áreas de “alta coesão” e destacando dependências de “alto acoplamento” que devem ser evitadas.
No cenário em constante evolução do desenvolvimento de software, as linhas entre os papéis de ‘desenvolvedor’ e ‘designer’ continuarão a se tornar mais tênues.