Tecnologia para não tecnologistas — parte 2
Olá pessoas!
No último artigo, passamos um pouco pelos assuntos fundamentais em tecnologia (hardware, software, tipos de desenvolvedores e linguagens de programação).
Continuando a saga, que tal nos aprofundarmos um pouco em mais alguns termos que os profissionais de tecnologia usam no dia-a-dia e que podem soar estranho aos não iniciados?
Vamos começar pelo termo engenharia de software.
Pelo dicionário do Google, temos a seguinte definição para engenharia:
Aplicação de métodos científicos ou empíricos à utilização dos recursos da natureza em benefício do ser humano.
Logo de cara temos um problema aqui. Usar a expressão "aplicação de métodos científicos ou empíricos" eu até entendo, porque faz sentido. Mas a questão filosófica que temos aqui é: será que software pode ser considerado um recurso da natureza?
Não existem processadores, disco rígidos e pentes de memória na natureza. Afinal, todos são sintéticos e feitos pela humanidade. Além de a própria idéia de software ser algo intangível e digital, certo?
Bom, é por causa desse tipo de pergunta que surgiu a disciplina específica de engenharia de software, para adicionar um pouco de técnica e sofisticação ao assunto.
Aqui vale uma curiosidade, o termo foi cunhado na década de 1960, por uma cientista da computação chamada Margareth Hamilton, que simplesmente fez o sistema de controle para o projeto Apollo. Para quem não conhece, foi essa moça aqui:
Sim, você entendeu certo. No começo, sistemas eram escritos em papel primeiro. E foi essa pilha de papel que ajudou a levar o homem a lua.
A contextualização tá tão bacana que vou até citar integralmente um trecho do artigo da wikipedia sobre o assunto:
O termo [Engenharia de Software] foi criado na década de 1960 e utilizado oficialmente em 1968 na NATO Science Committee. Sua criação surgiu numa tentativa de contornar a crise do software e dar um tratamento de engenharia (mais sistemático, controlado e de qualidade mensurável) ao desenvolvimento de sistemas de software complexos. Um sistema de software complexo se caracteriza por um conjunto de componentes abstratos de software (estruturas de dados e algoritmos) encapsulados na forma de algoritmos, funções, módulos, objetos ou agentes interconectados, compondo a arquitetura do software, que deverão ser executados em sistemas computacionais.
Ou seja, engenharia de software trata da camada mais próxima ao código, com técnicas para estruturar dados, algoritmos e na forma de organização dos códigos e módulos relacionados.
Mas, o que é arquitetura de software então?
Uma das definições da palavra arquitetura é:
Arte e técnica de organizar espaços e criar ambientes para abrigar os diversos tipos de atividades humanas, visando também a determinada intenção plástica.
Pode não parecer, mas isso tem tudo a ver com o ato de pensar sistemas.
Imagine um sistema como um conjunto de partes que interagem entre si para se atingir determinado fim. Eles possuem regras definidas (ou seja, o que ele faz) e a quantidade de recursos computacionais que temos é limitada (ou seja, onde ele executa essas regras), além disso, é necessário pensar as fronteiras de interação entre as partes (ou seja, o escopo).
Agora, adaptando a definição com essas ideias em mente, temos:
Arte e técnica de organizar e criar sistemas para abrigar os diversos tipos de regras de negócio, visando também as determinadas restrições do ambiente computacional relacionado.
Portanto, arquitetura é a técnica de pensar onde os sistemas irão rodar e quais as suas fronteiras com outros sistemas, levando em consideração as limitações computacionais envolvidas. Se você vai escrever um sistema para uma maquininha de processamento de cartões, a arquitetura é de uma forma. Se você precisa fornecer um sistema disponível 24 horas por dia, 7 dias por semana, 365 dias por ano para os usuários de um banco privado de 50 milhões de clientes, é outra arquitetura completamente diferente.
Existem profissionais dedicados para ambos os assuntos, mas a grosso modo, toda pessoa desenvolvedora é uma pessoa engenheira de software, dado que escreve código. Mas, não necessariamente todas as pessoas desenvolvedoras são pessoas arquitetas, pois são habilidades diferentes.
Em linhas gerais, o arquiteto na maioria das empresas não codifica. Aqui dá para usar uma metáfora do mundo real: ao contratar um arquiteto para um projeto de um prédio, o ideal é que ele saiba construir o que ele desenhou, certo? Até mesmo para evitar ideias mirabolantes impossíveis de se executar (mas que funcionam no papel), mas não é muito comum você encontrar um arquiteto que sabe subir uma parede na unha. Em tecnologia, ocorre o mesmo fenômeno.
Em se tratando de programação, aquele que codifica é chamado de engenheiro e aquele que projeta é conhecida como arquiteto. Em construção civil, quem produz é o pedreiro/empreiteiro e quem projeta é divido em 2 funções: engenharia para fundação e arquitetura para estética.
Mas, assim como na construção civil, é possível encontrar os profissionais que projetam estética (front-end), fundação (back-end) e executam ambos (full-stack). Mas, no final das contas, são especialistas em alguma das áreas e conseguem ser proficientes em algumas outras, mas não são necessariamente especialistas em todas elas ao mesmo tempo.
Mas isso já é um assunto para um próximo artigo.
Até!
Você gostou do conteúdo e gostaria de fazer mentoria comigo? Clique aqui e descubra como.