# Engenharia de dados

A engenharia de dados é o ramo tech responsável pelo desenvolvimento e manutenção de sistemas que coletam, organizam, e processam dados. Esse campo é essencial para garantir que os dados brutos, muitas vezes não estruturados, sejam transformados em informações acessíveis e úteis para análises, aprendizado de máquina e outras aplicações. Tornar estes dados utilizáveis é um trabalho técnico que envolve computação e armazenamento, bem como processamento de dados.

## História

A engenharia de dados começou a se desenvolver nas décadas de 1960 e 1970, à medida que as empresas passaram a utilizar sistemas de gerenciamento de banco de dados (também conhecidos como Database Management Systems ou DBMS) para organizar e processar grandes volumes de informações. Nessa época, o armazenamento e a manipulação de dados eram conduzidos principalmente em mainframes, com tecnologias voltadas para a segurança e a robustez na gestão das informações. Esses sistemas eram essenciais para manter registros empresariais, processar transações financeiras e suportar operações administrativas.
Estas informações eram tratadas como ativos críticos, armazenadas em sistemas que priorizavam a integridade e a disponibilidade. Por conta disso, durante esse período, o modelo dominante de banco de dados era o hierárquico, que, embora menos flexível, oferecia um controle rigoroso sobre os dados armazenados. A IBM, com suas soluções de banco de dados como o IMS (Information Management System), liderava o cenário global, fornecendo a infraestrutura para que grandes corporações em diferentes setores pudessem gerenciar seus dados de maneira centralizada e eficiente.
Com o advento dos sistemas de banco de dados relacionais nos anos 1980, surgiu uma nova abordagem para a manipulação de dados. O modelo relacional, popularizado por tecnologias como o banco de dados da Oracle, permitiu que os dados fossem organizados de maneira mais flexível, facilitando a consulta e análise das informações. Essa evolução marcou o início de uma transição na infraestrutura de dados, à medida que as empresas ao redor do mundo começaram a adotar soluções que ofereciam maior agilidade e adaptabilidade às crescentes demandas do mercado.
Até então, a gestão e o manuseio de dados nas empresas eram, em sua maioria, responsabilidade exclusiva das equipes de tecnologia da informação (TI). Os demais departamentos utilizavam os dados já processados pela TI como apoio para suas atividades, com a elaboração de relatórios, mas havia pouca ou nenhuma troca de conhecimentos sobre dados entre o time de TI e as outras áreas da empresa.
Com o boom da Internet no início da década de 2010, houve um aumento exponencial nos volumes, na velocidade e na variedade dos dados, o que levou à popularização do termo big data, que passou a ser praticamente sinônimo de "dados" no imaginário coletivo. Empresas de tecnologia baseadas em dados, como o Facebook e o Airbnb, começaram a utilizar o termo engenheiro de dados para designar os profissionais especializados na área.
Esse movimento foi impulsionado pela vasta quantidade de dados disponível com a Internet, o que levou grandes empresas como Google, Facebook, Amazon, Apple, Microsoft e Netflix a abandonarem as técnicas tradicionais de ETL (Extração, Transformação e Carregamento) e armazenamento de dados. Essas empresas passaram a adotar a engenharia de dados, uma vertente da engenharia de software focada em dados, com ênfase em infraestrutura, armazenamento, proteção de dados, segurança cibernética, mineração, modelagem, processamento e gerenciamento de metadados. Essa mudança de abordagem no tratamento de dados foi centrada, sobretudo, na computação em nuvem, permitindo que os dados deixassem de ser uma expertise exclusiva da TI e passassem a ser manipulados e utilizados por diversas outras áreas da empresa, incluindo vendas e marketing.

## Ferramentas
### Computação

A computação de alto desempenho tem um papel fundamental no processamento e análise de grandes volumes de dados, sendo uma componente crucial na engenharia de dados. Uma abordagem amplamente adotada nesse campo é a programação de fluxo de dados, onde a computação é modelada por meio de um gráfico direcionado conhecido como gráfico de fluxo de dados. Os nós são as operações e as arestas representam o fluxo de dados.
Essa metodologia permite a execução eficiente e paralela de processos, o que é essencial para lidar com os volumes crescentes de dados. Entre as implementações mais populares dessa abordagem estão o Apache Spark, amplamente utilizado para processamento de grandes conjuntos de dados, e o TensorFlow, especificamente projetado para aprendizado profundo. Recentemente, surgiram implementações mais avançadas, como o Differential e o Timely Dataflow, que utilizam técnicas de computação incremental. Essas técnicas permitem um processamento de dados ainda mais eficiente, atualizando apenas as partes do sistema que são afetadas por novas informações, em vez de reprocessar todo o conjunto de dados.

### Armazenamento

Os dados podem ser armazenados de diversas maneiras, dependendo de como serão utilizados, e essa escolha é um fator crucial na otimização dos sistemas de armazenamento e processamento. Engenheiros de dados trabalham na busca por redução de custos e melhorias na eficiência. Para isso, eles empregam técnicas como compactação, que reduz o espaço necessário para armazenar dados; particionamento, que divide grandes conjuntos de dados em partes menores e mais gerenciáveis; e arquivamento, que transfere dados antigos ou menos utilizados para sistemas de armazenamento de longo prazo. Essas práticas permitem que as empresas gerenciem seus dados de maneira mais eficaz, mantendo a performance e a escalabilidade dos sistemas de informação.

#### Bancos de dados

Quando os dados são estruturados e requerem algum tipo de processamento de transações online, os bancos de dados, em geral, são a solução escolhida. Tradicionalmente, os bancos de dados relacionais foram amplamente utilizados, pois oferecem fortes garantias de correção de transações através do modelo ACID (Atomicidade, Consistência, Isolamento e Durabilidade). A maioria desses bancos de dados relacionais utiliza a linguagem SQL para realizar consultas e manipular dados.
No entanto, à medida que os volumes de dados começaram a crescer exponencialmente na década de 2010, os bancos de dados NoSQL ganharam popularidade. Ao contrário dos bancos de dados relacionais, os sistemas NoSQL são projetados para escalar horizontalmente de forma mais eficaz, abrindo mão das rigorosas garantias de transação ACID em favor de uma maior flexibilidade e desempenho em cenários de grandes volumes de dados. Eles também ajudam a mitigar a incompatibilidade de impedância objeto-relacional, que pode ser um desafio nos bancos de dados relacionais.
Mais recentemente, as bases de dados NewSQL surgiram como uma tentativa de combinar o melhor dos dois mundos: a escalabilidade horizontal dos bancos de dados NoSQL com as garantias ACID dos bancos de dados relacionais. Essa abordagem visa atender às necessidades de aplicações modernas que demandam tanto alta escalabilidade quanto integridade transacional.

#### Data warehouses

Quando os dados são estruturados e o foco está no processamento analítico online, em vez de transações online, os data warehouses são a principal escolha. Esses armazéns de dados são projetados para permitir a análise em larga escala, mineração de dados e aplicações de inteligência artificial, oferecendo capacidades que vão além do que os bancos de dados tradicionais podem proporcionar. Na prática, os dados muitas vezes fluem de bancos de dados transacionais para data warehouses, onde são preparados e organizados para análises mais complexas.
Data warehouses permitem que analistas de negócios, engenheiros de dados e cientistas de dados acessem e manipulem grandes volumes de dados de maneira eficiente, utilizando ferramentas como SQL ou softwares de inteligência empresarial (BI).

#### Data lakes

Um data lake é um repositório centralizado projetado para armazenar, processar e proteger grandes volumes de dados em uma ampla variedade de formatos. Diferente dos data warehouses, que são mais estruturados, os data lakes são capazes de acomodar dados estruturados provenientes de bancos de dados relacionais, dados semiestruturados como arquivos XML ou JSON, dados não estruturados como texto ou log de eventos, e até mesmo dados binários como imagens, vídeos e arquivos de áudio.
Esses repositórios podem ser implementados tanto em infraestruturas locais quanto em ambientes baseados em nuvem, utilizando serviços oferecidos por fornecedores de nuvem pública, como Amazon Web Services (AWS), Microsoft Azure ou Google Cloud. Data lakes são especialmente valiosos para empresas que precisam gerenciar e analisar grandes quantidades de dados variados, oferecendo a flexibilidade necessária para suportar uma ampla gama de aplicações analíticas, incluindo aprendizado de máquina e big data.

#### Arquivos

Quando os dados são menos estruturados, é comum que sejam armazenados diretamente como arquivos. Existem várias opções de armazenamento para esses dados:
* Sistemas de arquivos: representam dados de forma hierárquica, organizando-os em pastas e subpastas. Essa estrutura é familiar para muitos usuários e facilita a navegação e a organização dos dados em ambientes com uma hierarquia clara.
* Armazenamento em bloco: divide os dados em pedaços de tamanho regular, que são gerenciados individualmente. Esse método é frequentemente associado ao armazenamento em discos rígidos (virtuais) ou unidades de estado sólido (SSD), sendo eficiente para sistemas que requerem acesso rápido e preciso a grandes volumes de dados.
* Armazenamento de objetos: gerencia dados utilizando metadados, onde cada arquivo é identificado por uma chave única, como um UUID (Identificador Único Universal).

### Gerenciamento

A diversidade de processos de dados e os diferentes locais de armazenamento podem ser desafiadores para os usuários, o que torna o gerenciamento eficaz dessas operações uma necessidade. Para lidar com essa complexidade, sistemas de gerenciamento de fluxo de trabalho, como o Apache Airflow, tornaram-se populares. Esses sistemas permitem que as tarefas relacionadas aos dados sejam especificadas, criadas e monitoradas de maneira eficiente.
As tarefas de dados são frequentemente organizadas como um gráfico acíclico direcionado (DAG), onde os nós representam as tarefas individuais e as arestas definem a ordem de execução. Essa abordagem facilita o rastreamento do fluxo de trabalho e garante que as dependências entre tarefas sejam gerenciadas corretamente, proporcionando maior controle e visibilidade sobre o processamento de dados. O uso de sistemas de gerenciamento de fluxo de trabalho ajuda a automatizar e simplificar operações complexas, tornando o processo de engenharia de dados mais eficiente e confiável.

## Ciclo de vida
### Planejamento de negócios

Os objetivos empresariais definidos pelos executivos são refletidos nos principais planos de negócios da organização, com uma definição mais detalhada nos planos táticos e uma execução prática nos planos operacionais. Esses planos estabelecem a estratégia a ser seguida e orientam as ações em todos os níveis da empresa.
No cenário atual, a maioria das empresas compreende a importância de criar um plano de negócios robusto que alinhe a estratégia empresarial com suas operações diárias. No entanto, a implementação desses planos pode ser desafiadora, frequentemente devido à falta de transparência e comunicação efetiva entre os níveis tático e operacional da organização.
Para superar essas dificuldades, é crucial que haja um sistema de feedback contínuo. Esse feedback permite a identificação e a correção antecipada de problemas decorrentes de falhas na comunicação ou de interpretações incorretas dos planos. Um ciclo de feedback eficiente ajuda a garantir que as estratégias sejam ajustadas conforme necessário, promovendo uma execução mais eficaz e alinhada com os objetivos empresariais.

### Projeto de sistemas

O design de sistemas de dados é um processo complexo que abrange diversos componentes essenciais para garantir a eficiência e a eficácia no gerenciamento de informações. Entre os principais aspectos desse design estão a arquitetura das plataformas de dados e o planejamento do armazenamento de dados.

### Modelagem de dados

A modelagem de dados é o processo de criação de um modelo de dados, que é uma representação abstrata das informações e das relações entre diferentes conjuntos de dados. Esse modelo serve como um mapa conceitual que descreve como os dados são organizados, armazenados e inter-relacionados dentro de um sistema.

## Profissões
### Engenheiro de dados

Um engenheiro de dados é especializado na construção e manutenção de sistemas que permitem a coleta, armazenamento, processamento e disponibilização de grandes volumes de dados. Esse profissional garante que os dados estejam organizados e acessíveis para que possam ser utilizados por cientistas de dados, analistas e outras equipes da organização. Suas principais responsabilidades incluem:
* Arquitetura de dados: projetar e implementar a arquitetura de sistemas de dados, incluindo bancos de dados, data warehouses, data lakes e pipelines de dados, para assegurar que os dados sejam organizados de forma eficiente e escalável.
* Construção de pipelines de dados: desenvolver e gerenciar pipelines de ETL (Extração, Transformação e Carregamento) que automatizam a movimentação e a transformação de dados de diferentes fontes para destinos como data warehouses e data lakes.
* Qualidade e governança de dados: garantir a integridade, consistência e segurança dos dados através de práticas de governança de dados, incluindo limpeza, validação e monitoramento contínuo dos fluxos de dados.
* Otimização de desempenho: melhorar a eficiência dos sistemas de dados através da otimização de consultas, indexação de bancos de dados e ajuste de parâmetros para maximizar o desempenho e reduzir o tempo de processamento.

### Cientista de dados

O cientista de dados é um profissional que se concentra na análise e interpretação dos dados para extrair insights significativos e apoiar a tomada de decisões. As principais responsabilidades de um cientista de dados incluem:
* Análise de dados: aplicar técnicas de matemática, algoritmos, estatística e aprendizagem de máquina para analisar dados e identificar padrões, tendências e correlações.
* Desenvolvimento de modelos: criar e validar modelos preditivos e analíticos que ajudam a resolver problemas de negócios e prever futuros comportamentos.
* Ferramentas e métodos: utilizar ferramentas e linguagens de programação como R, Python e bibliotecas específicas para análise de dados e machine learning.