Programando com Elixir
Um guia abrangente sobre programação funcional e concorrente usando Elixir. Aborda a transição do pensamento orientado a objetos para o pensamento funcional, correspondência de padrões, imutabilidade, o modelo ator para concorrência e a construção de sistemas distribuídos robustos com OTP.
Visão Geral do Curso
📚 Resumo do Conteúdo
Um guia abrangente sobre programação funcional e concorrente usando Elixir. Cobrirá a transição do pensamento orientado a objetos para o funcional, correspondência de padrões, imutabilidade, o modelo de ator para concorrência e a construção de sistemas distribuídos robustos com OTP.
Domine a arte de construir sistemas concorrentes resilientes por meio da beleza da programação funcional.
Autor: Dave Thomas
Agradecimentos: José Valim, Corey Haines, Bruce Tate, Jessica Kerr, Anthony Eden, Chad Fowler, Kim Shrier, Candace Cunningham e Potomac Indexing.
🎯 Objetivos de Aprendizagem
- Contraste o modelo de transformação de dados do Elixir com a programação convencional baseada em estado.
- Configure o shell interativo do Elixir (IEx) e execute códigos do Elixir via scripts e compilação.
- Aplique o operador de correspondência (
=), o operador de pinça (^) e o curinga (_) para desestruturar e validar dados. - Explique as implicações teóricas e práticas da imutabilidade sobre desempenho e gerenciamento de memória.
- Identifique e utilize os tipos internos do Elixir, incluindo tipos Valor, Sistema e Coleção.
- Aplique as regras de escopo de variáveis e a expressão
withpara gerenciar transformações de dados complexas. - Crie e invoque funções anônimas usando ambas as notações padrão e de captura (
&). - Implemente funções nomeadas dentro de módulos usando correspondência de padrões e recursão para lidar com lógicas complexas.
- Aplique cláusulas de guarda e parâmetros padrão para controlar o fluxo de execução das funções.
- Desconstruir e Construir Listas: Use correspondência de padrões cabeça/cauda para navegar e construir estruturas listas recursivas.
🔹 Aula 1: Introdução ao Elixir e Correspondência de Padrões
Visão Geral: Esta aula apresenta o Elixir como uma linguagem funcional centrada na transformação de dados, em vez da mutação de estado. Os alunos aprenderão a navegar no ambiente Elixir (IEx), compilar e executar scripts e dominar a Correspondência de Padrões — o mecanismo fundamental que o Elixir utiliza para vinculação de variáveis e fluxo de controle.
Resultados de Aprendizagem:
- Contraste o modelo de transformação de dados do Elixir com a programação convencional baseada em estado.
- Configure o shell interativo do Elixir (IEx) e execute código Elixir via scripts e compilação.
- Aplique o operador de correspondência (
=), o operador de pinça (^) e o curinga (_) para desestruturar e validar dados.
🔹 Aula 2: Imutabilidade e Noções Básicas do Elixir
Visão Geral: Esta aula explora a filosofia fundamental do Elixir: a imutabilidade. Os alunos aprenderão como o Elixir trata os dados como entidades imutáveis, os benefícios de desempenho dessa abordagem e os diversos tipos internos — desde tipos simples como átomos e intervalos até coleções complexas como mapas e binários. A aula conclui com um aprofundamento no escopo de variáveis e na poderosa expressão with.
Resultados de Aprendizagem:
- Explique as implicações teóricas e práticas da imutabilidade sobre desempenho e gerenciamento de memória.
- Identifique e utilize os tipos internos do Elixir, incluindo tipos Valor, Sistema e Coleção.
- Aplique as regras de escopo de variáveis e a expressão
withpara gerenciar transformações de dados complexas.
🔹 Aula 3: Funções, Módulos e o Operador Pipeline
Visão Geral: Esta aula explora o cerne da programação em Elixir: a transformação funcional. Aborda a transição de funções anônimas e fechamentos para módulos estruturados e funções nomeadas. Os alunos aprenderão a aproveitar a correspondência de padrões, recursão e o operador pipeline para criar códigos concisos, legíveis e mantíveis, enquanto interagem com a VM subjacente do Erlang.
Resultados de Aprendizagem:
- Crie e invoque funções anônimas usando ambas as notações padrão e de captura (
&). - Implemente funções nomeadas dentro de módulos usando correspondência de padrões e recursão para lidar com lógicas complexas.
- Aplique cláusulas de guarda e parâmetros padrão para controlar o fluxo de execução das funções.
🔹 Aula 4: Listas Recursivas e Estruturas de Dados
Visão Geral: Esta aula cobre os mecanismos fundamentais das listas do Elixir por meio da recursão, focando especificamente no padrão "Cabeça e Cauda" para processar e construir dados. Transita para estruturas de dados complexas — Mapas, Estruturas e Listas de Palavras-Chave — fornecendo um framework de decisão para selecionar a estrutura adequada e técnicas avançadas para manipular dados aninhados usando o módulo Access e a teoria de tipos do Elixir.
Resultados de Aprendizagem:
- Desconstruir e Construir Listas: Use correspondência de padrões cabeça/cauda para navegar e construir estruturas de lista recursivas.
- Implementar Padrões de Alta Ordem: Crie funções personalizadas
mapereducepara transformar ou agregadar dados de listas. - Selecionar Estruturas de Dados Adequadas: Diferencie entre Mapas, Estruturas e Listas de Palavras-Chave com base em requisitos de desempenho, ordenação e integridade de dados.
🔹 Aula 5: Enumerações, Streams e Processamento de Strings
Visão Geral: Esta aula explora a abordagem dual para o processamento de coleções no Elixir: o módulo Enum, que é agressivo, e o módulo Stream, que é preguiçoso e componível. Também oferece uma análise profunda da transformação de dados por meio de compreensões e dos mecanismos internos das strings do Elixir, diferenciando entre listas de caracteres (entre apóstrofos simples) e binários (entre aspas duplas). Os alunos aprenderão a processar estruturas de dados complexas, lidar com dados infinitos e realizar extração de bits em nível baixo.
Resultados de Aprendizagem:
- Diferencie entre avaliação agressiva e preguiçosa ao processar coleções.
- Utilize compreensões de listas com múltiplos geradores e filtros para transformar dados e extrair informações a nível de bit.
- Diferencie entre strings entre apóstrofos simples (listas de caracteres) e strings entre aspas duplas (binários) e aplique o módulo correto (List vs. String) para manipulação.
🔹 Aula 6: Fluxo de Controle, Projetos Mix e Ferramentas Profissionais
Visão Geral: Esta aula orienta desenvolvedores na transição de escrever funções Elixir isoladas para construir, testar e monitorar aplicações de qualidade profissional. Cobertura de estruturas de controle avançadas (case, cond), o ciclo de vida de um projeto Mix (da estrutura de diretórios aos executáveis CLI) e a suíte de ferramentas profissionais usadas para depuração, teste baseado em propriedades e monitoramento de servidores.
Resultados de Aprendizagem:
- Implemente lógica de ramificação complexa usando
case,conde tratamento de exceções. - Estruture projetos Elixir usando
Mix, gerencie dependências externas comoHTTPoisonePoison, e configure ambientes de aplicação. - Desenvolva suites de testes robustas utilizando
ExUnit,DocTeste teste baseado em propriedades comStreamData.
🔹 Aula 7: Concorrência e Nós Distribuídos
Visão Geral: Esta aula explora a transição de aplicações Elixir de um único processo para sistemas distribuídos. Aborda os mecanismos de tratamento de mensagens, persistência de processos por meio de loops recursivos de cauda e a gestão robusta dos ciclos de vida dos processos via vínculos e monitoramento. Por fim, introduz o modelo de distribuição da VM Erlang, ensinando como conectar nós, protegê-los com cookies e lidar com I/O em rede.
Resultados de Aprendizagem:
- Implemente processos estatais e persistentes usando recursão de cauda e timeouts de mensagens.
- Construa árvores de processos tolerantes a falhas usando vinculação (
spawn_link) e monitoramento (spawn_monitor). - Configure e conecte nós distribuídos usando convenções de nomeação, cookies de segurança e registro global de processos.
🔹 Aula 8: Fundamentos do OTP: Servidores e Supervisores
Visão Geral: Esta aula apresenta o framework Open Telecom Platform (OTP) no ecossistema Elixir, focando especificamente no comportamento GenServer e nos padrões Supervisor. Os alunos aprenderão a construir processos de servidor robustos e estatais, diferenciar entre comunicação síncrona e assíncrona e implementar árvores de supervisão tolerantes a falhas que gerenciam automaticamente os ciclos de vida dos processos.
Resultados de Aprendizagem:
- Defina os componentes centrais do OTP e implemente o ciclo de vida padrão de callbacks do
GenServer. - Diferencie e implemente padrões de mensagem síncronas (call) e assíncronas (cast).
- Configure e implante um Supervisor para monitorar processos trabalhadores e manter a confiabilidade do sistema em caso de falhas.
🔹 Aula 9: Arquiteturas Complexas do OTP e Gerenciamento de Estado
Visão Geral: Esta aula transita de GenServers individuais para o design e implantação de aplicações OTP complexas e multi-componentes. Aborda o design arquitetônico do "Duper", um encontrador de arquivos duplicados, os mecanismos das especificações de aplicação OTP e técnicas avançadas de implantação, incluindo atualizações quentes usando Distillery. Além disso, explora alternativas simplificadas de gerenciamento de estado como Tasks e Agents, fornecendo um quadro para escolher a ferramenta certa conforme as necessidades de concorrência específicas.
Resultados de Aprendizagem:
- Analise os requisitos da aplicação usando o framework de cinco perguntas para identificar pontos focais e características de tempo de execução.
- Construa uma aplicação OTP multi-servidor (Duper) utilizando servidores especializados (Results, PathFinder, Gatherer) e Supervisores Dinâmicos.
- Realize lançamentos de código e atualizações quentes usando Distillery, incluindo migração de estado via callback
code_change.
🔹 Aula 10: Metaprogramação, Protocolos e Segurança de Tipos
Visão Geral: Esta aula explora a extensibilidade avançada do Elixir, focando em como manipular código como dados por meio de metaprogramação e macros. Os alunos aprenderão a alcançar polimorfismo usando Protocolos e Comportamentos, estruturar sistemas de grande escala com projetos Umbrella e implementar tratamento robusto de erros. Finalmente, a aula aborda a adição de uma camada de análise estática usando o sistema de tipos do Elixir e Dialyzer para garantir a correção do código.
Resultados de Aprendizagem:
- Domine o uso de
quoteeunquotepara injetar e manipular blocos de código dentro de macros. - Implemente Protocolos e Comportamentos personalizados para criar estruturas de código polimórficas e reutilizáveis.
- Construa projetos Umbrella multi-aplicativos e aplique especificações formais de tipos a código Elixir dinâmico.