Grand Roadmap
Roadmap de estudos que montei e venho seguindo em meu estudos para Golang.
Com adições de:
- Back-end: Desenvolvendo serviços seguros, escaláveis e de alta performance com Go.
- Design Patterns e Boas práticas de Desenvolvimento de Software.
- Análise de Sistemas e Levantamento de Requisitos.
- Conhecimentos importantes de Ciência da Computação e Engenharia de Software:
- Algoritmos e Estruturas de Dados.
- Teoria dos Grafos e Computação Paralela.
- Banco de Dados e Sistemas Operacionais.
- Redes de Computadores e Segurança da Informação.
- Infraestrutura e DevOps: Containers, Kubernetes, CI/CD, Cloud Computing.
- Diferentes tipos de serviços e aplicações:
- APIs RESTful e GraphQL.
- Microserviços e Comunicação Assíncrona.
- Streaming de Dados em Tempo Real: WebSockets, Kafka, WebRTC.
Adicionados por preferência pessoal:
- Matemática e Física aplicadas à Computação.
1. Fundamentos de Go (Golang)
1.1 Introdução a Go
- O que é Go: História, filosofia da linguagem (simplicidade, performance, concorrência).
- Configuração do ambiente: Instalando Go, configuração de IDE (Visual Studio Code, GoLand), gerenciamento de dependências com go mod.
- Compilação e execução de programas: Comandos go build, go run, go test.
- Sintaxe Básica: Tipos de dados, variáveis, operadores, controle de fluxo (if, for, switch).
- Funções: Definição, parâmetros, retornos múltiplos, funções anônimas.
1.2 Tipos de Dados e Estruturas
- Tipos Primitivos: Inteiros, floats, booleans, strings, arrays e slices.
- Structs: Como usar structs para modelar dados complexos.
- Interfaces: Definição e implementação de interfaces, polimorfismo em Go.
- Mapas: Uso de map para estrutura de dados chave-valor.
1.3 Concurrency e Goroutines
- Concorrência vs Paralelismo: Entendimento da diferença.
- Goroutines: Como lançar e gerenciar goroutines.
- Channels: Comunicação entre goroutines, buffers de channels.
- Select statement: Como trabalhar com múltiplos canais.
- Sync Package: Mutexes, WaitGroups e outras ferramentas de sincronização.
1.4 Pacotes e Módulos
- Pacotes padrão: fmt, net/http, os, time, log, math, strings, encoding/json.
- Módulos: Gerenciamento de dependências com go mod e go get.
- Testes: Escrever testes com o pacote testing, criar benchmarks, testify para asserções.
1.5 Frameworks de Go
- Gin: Framework web para desenvolvimento de APIs RESTful em Go.
- Como usar o Gin para criar rotas, middlewares, e fazer validação de dados.
- Integração com banco de dados usando GORM (ORM para Go).
- Criação de APIs RESTful com autenticação (JWT, OAuth).
- Testes de APIs utilizando httptest, Gin e GoMock.
2. Engenharia de Software
2.1 Princípios e Boas Práticas
- SOLID: Compreender e aplicar os 5 princípios de design de software.
- Design Patterns: Padrões de projeto como Singleton, Factory, Observer, Strategy, Repository.
- Arquitetura de Software:
- Arquitetura monolítica vs microservices.
- Arquitetura em camadas (Layers) e Design Orientado a Serviços (SOA).
- Event-Driven Architecture e CQRS.
- Práticas Ágeis: Scrum, Kanban, princípios do Agile, Continuous Delivery (CD), Continuous Integration (CI).
2.2 Engenharia de Requisitos e Análise de Sistemas
- Levantamento de Requisitos: Técnicas para identificar e documentar requisitos funcionais e não funcionais.
- Modelagem UML: Diagramas de casos de uso, classes, atividades e sequência.
- TDD (Test-Driven Development): Escrever testes antes de escrever o código.
- Refatoração de Código: Melhorias de legibilidade e performance sem alterar a funcionalidade.
2.3 Ferramentas de Desenvolvimento e Versionamento
- Git: GitHub, GitLab, Bitbucket.
- CI/CD: Jenkins, GitHub Actions, GitLab CI, Docker (contêineres), Kubernetes.
- Monitoramento e Logging: Ferramentas como Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana).
3. Ciência da Computação
3.1 Algoritmos e Estruturas de Dados
- Estruturas de Dados: Listas, pilhas, filas, árvores (binárias, AVL, B-Tree), grafos.
- Algoritmos: Ordenação (quicksort, mergesort), busca (binária, BFS, DFS), algoritmos de caminho mínimo (Dijkstra, A*).
- Complexidade Computacional: Notação Big-O, análise de tempo e espaço.
- Algoritmos de String: Algoritmo de KMP, Rabin-Karp, busca em substrings.
3.2 Teoria dos Grafos e Computação Paralela
- Grafos: Representação, buscas (BFS, DFS), ciclo, caminhos mais curtos, árvores de expansão mínima.
- Programação Paralela: Concorrência vs paralelismo, técnicas de sincronização e compartilhamento de dados.
3.3 Banco de Dados
- SQL: SQL básico, joins, normalização, transações, índices, procedures.
- NoSQL: MongoDB, Redis, Cassandra – quando usar e como integrar.
- Modelagem de Banco de Dados: ER (Entity-Relationship), modelo relacional vs. não relacional.
3.4 Sistemas Operacionais
- Conceitos básicos: Processos, threads, escalonamento de processos.
- Memória: Gerenciamento de memória (heap, stack, garbage collection).
- Sistemas de Arquivos: Arquivos, diretórios, sistemas de arquivos locais e distribuídos.
3.5 Redes de Computadores
- Protocolos: TCP/IP, UDP, HTTP/HTTPS, WebSockets.
- Redes de alta performance: Arquitetura de redes, balanceamento de carga, otimização de latência.
4. Engenharia da Computação
4.1 Circuitos e Arquitetura de Computadores
- Circuitos Digitais: Portas lógicas, flip-flops, multiplexadores, aritmética binária.
- Arquitetura de Processadores: Unidades lógicas, aritméticas, ALU, registros, pipelines.
- Memória: Memórias cache, RAM, memória virtual, hierarquia de memória.
FPGAs e Circuitos Integrados: Fundamentos de design de circuitos.
4.2 Sistemas Embarcados
- Desenvolvimento para Hardware: Programação em C/C++ para microcontroladores.
Go para sistemas embarcados: Utilização do Go com frameworks como TinyGo para programação em dispositivos embarcados.
5. Matemática
5.1 Cálculo
- Cálculo Diferencial: Derivadas, limites, otimização de funções.
- Cálculo Integral: Integrais definidas, aplicações de áreas e volumes.
5.2 Álgebra Linear
- Vetores e Matrizes: Operações com vetores e matrizes, sistemas lineares, transformações lineares.
- Autovalores e Autovetores: Decomposição espectral, aplicações em aprendizado de máquina.
5.3 Probabilidade e Estatística
- Probabilidade: Teorema de Bayes, variáveis aleatórias, distribuições (normal, binomial, Poisson).
- Estatística: Média, mediana, desvio padrão, teste de hipóteses, inferência estatística.
5.4 Teoria dos Números
- Criptografia: Fundamentos da criptografia moderna, RSA, AES, funções hash.
- Teoria dos Grafos: Aplicações em redes e algoritmos.
6. Física
6.1 Física Clássica
- Mecânica: Leis de Newton, movimento de partículas, trabalho e energia
- Termodinâmica: Leis da termodinâmica, entropia, máquinas térmicas.
6.2 Eletromagnetismo
- Campos elétricos e magnéticos: Lei de Gauss, equações de Maxwell.
- Ondas: Propagação de ondas eletromagnéticas.
6.3 Física Computacional
- Simulações numéricas: Solução de problemas físicos usando métodos numéricos (método de Euler, Runge-Kutta).
- Métodos de Monte Carlo: Técnicas para simulação e otimização. 7. Infraestrutura e Backend com Go
7. Infraestrutura e Backend com Go
7.1 Infraestrutura e DevOps
7.1.1 Ferramentas de DevOps e Automação
7.1.2 Cloud Computing
- Amazon Web Services (AWS), Google Cloud Platform (GCP), Microsoft Azure:
- Hospedagem e escalabilidade de aplicativos backend com Go em provedores de cloud.
- AWS Lambda para funções serverless e Go.
- Elastic Load Balancing (ELB) e Auto Scaling Groups para escalabilidade automática.
- Amazon RDS e DynamoDB para bancos de dados gerenciados.
8. Backend com Go: APIs, Microserviços e Performance
8.1 Desenvolvimento de APIs com Go
8.1.1 RESTful APIs
- Princípios REST: Entender os princípios fundamentais de REST (stateless, uso adequado dos verbos HTTP).
- Criação de APIs com Gin e Echo: Criar rotas, middlewares, validação de entrada e gerenciamento de erros.
- Autenticação e Autorização:
- Implementar autenticação JWT para APIs seguras.
- Autorização baseada em roles (RBAC) ou OAuth.
- Versionamento de API: Boas práticas de versionamento de API (path versioning, header versioning).
- Documentação: Uso do Swagger/OpenAPI para documentar suas APIs e permitir fácil integração.
8.1.2 GraphQL com Go
- Fundamentos do GraphQL: Diferenças entre GraphQL e REST (consultas, mutações, subscriptions).
- Go + GraphQL: Bibliotecas como gqlgen ou graphql-go para criar e consumir APIs GraphQL.
- Schemas e Queries: Como definir esquemas, tipos e resolvers.
- Autenticação em GraphQL: Implementação de autenticação e autorização em GraphQL.
- Paginação e Filtragem: Padrões de paginação, como Relay.
8.2 Microserviços com Go
8.2.1 Arquitetura de Microserviços
- Conceito de Microserviços: Definição e vantagens (escala, modularidade, agilidade).
- Comunicação entre Microserviços:
- APIs RESTful e gRPC para comunicação entre serviços.
- Event-Driven Architecture: Usar Kafka ou RabbitMQ para comunicação assíncrona.
- Gestão de Estado: Session management e persistência de dados entre microserviços.
- Gateway API: Usar API Gateway para roteamento de requests, como Kong, Traefik ou NGINX.
- Service Discovery: Utilizar ferramentas como Consul ou etcd para registrar e descobrir serviços dinamicamente.
8.2.2 Comunicação Assíncrona
- Mensageria com RabbitMQ, Kafka ou NATS.
- Pub/Sub, filas de mensagens e eventos para sistemas desacoplados.
- CQRS (Command Query Responsibility Segregation):
- Separar operações de leitura e escrita em diferentes serviços.
- Usar event sourcing como parte do CQRS.
8.2.3 Gerenciamento e Orquestração
- Docker e Kubernetes para orquestrar e escalar serviços de forma eficiente.
- Resiliência:
- Circuit Breakers com Go (utilizando pacotes como hystrix ou resilience4j).
- Retry Patterns e timeouts para lidar com falhas em sistemas distribuídos.
- Logs distribuídos: Uso de ferramentas como ELK Stack (Elasticsearch, Logstash, Kibana) ou Grafana Loki.
9. Banco de Dados: SQL e NoSQL
9.1 Banco de Dados Relacional (SQL)
- MySQL/PostgreSQL: Criação de tabelas, joins, subconsultas, índices e otimização de consultas.
- ORM em Go com GORM: Como utilizar o GORM para mapear structs Go para tabelas em SQL.
- Relacionamentos em GORM (um para um, um para muitos, muitos para muitos).
- Transações, migrações e seeds de dados com GORM.
- SQL Avançado:
- Stored Procedures, triggers, e views.
- Técnicas de otimização: explain analyze, uso de índices e caching.
9.2 Banco de Dados Não Relacional (NoSQL)
- MongoDB: Como usar o MongoDB com Go através do mgo ou mongo-go-driver.
- Modelagem de dados em NoSQL, consultas complexas e agregações.
- Redis: Usar Redis para caching e persistência de dados temporários (usuários online, sessões, etc.).
- Cassandra: Modelagem e consulta em Cassandra, um banco de dados orientado a colunas.
9.3 Bancos de Dados Distribuídos
- Sharding: Como dividir dados em várias instâncias para escalar horizontalmente.
- Consistency: Uso de CAP Theorem para decidir entre consistência, disponibilidade e tolerância a partições.
- Eventual Consistency: Como projetar sistemas tolerantes a falhas com consistência eventual.
10. Performance e Escalabilidade de Aplicações Web
10.1 Performance no Backend
- Profiling e Análise de Performance: Como usar ferramentas como pprof e Go Trace para identificar gargalos de desempenho.
- Caching: Implementar caching em nível de aplicação com Redis ou Memcached
- Concorrência:
- Uso de goroutines e channels para aumentar a performance do processamento paralelo.
- Worker Pools e Throttling para controle de consumo de recursos.
10.2 Escalabilidade de Aplicações Web
- Escalabilidade Horizontal e Vertical:
- Escalar serviços em Kubernetes, usar Auto-Scaling Groups.
- Técnicas de load balancing e balanceamento de carga com NGINX ou HAProxy.
- Partitioning e Sharding de banco de dados para distribuir a carga de trabalho.
- Redundância e Failover: Implementar alta disponibilidade com múltiplos datacenters ou Zonas de Disponibilidade em Cloud Providers.
10.3 Monitoramento e Observabilidade
- Prometheus: Monitoramento de métricas em tempo real (uso de métricas customizadas em Go).
- Grafana: Visualização das métricas e alertas.
- Tracing Distribuído com Jaeger ou OpenTelemetry.
- Alertas e Logging com ELK Stack ou Fluentd.
11. Testes em Go
11.1 Testes Unitários
- Pacote testing: Como escrever testes unitários em Go.
- Mocks: Usar bibliotecas como GoMock ou Testify para criar mocks de interfaces e objetos.
- Cobertura de Testes: Como medir a cobertura de testes e melhorar a qualidade do código.
11.2 Testes de Integração
- Testes de APIs: Testar APIs RESTful com httptest ou Gin Testing.
- Banco de Dados em Testes: Usar containers Docker para testar interações com banco - de dados.
11.3 Testes de Performance
- Benchmarks: Medir o desempenho de funções com o pacote testing (benchmarking).
- Testes de carga: Ferramentas como JMeter ou Locust para testar a escalabilidade de suas APIs e microserviços. 12. Streaming de Dados em Tempo Real
12. Streaming de Dados em Tempo Real
12.1 Fundamentos do Streaming
- Diferença entre Streaming e Polling:
- Polling: Requisições periódicas do cliente para obter novos dados.
- Streaming: Envio contínuo de dados em tempo real entre o cliente e o servidor.
- Vantagens do Streaming:
- Redução de latência.
- Melhor experiência do usuário em aplicações interativas e dinâmicas.
12.2 WebSockets
- Fundamentos do WebSocket: Conexões bidirecionais persistentes entre cliente e servidor.
- Como usar WebSockets com Go para comunicação em tempo real.
- Bibliotecas Go para WebSockets: gorilla/websocket, nhooyr/websocket.
- Criação de Servidor WebSocket com Go:
- Como implementar e gerenciar conexões WebSocket em Go.
- Como criar um servidor WebSocket básico usando Gin ou net/http.
- Escalabilidade de WebSockets:
- Como lidar com múltiplos clientes simultâneos (conexões simultâneas e gerenciamento de recursos).
- Uso de Redis Pub/Sub para escalar WebSockets entre múltiplos servidores.
12.3 Streaming de Eventos com Kafka
- Kafka vs. WebSockets: Quando usar Kafka para comunicação assíncrona e quando WebSockets para comunicação em tempo real.
- Apache Kafka: Como usar Kafka para processamento de eventos em tempo real.
- Go Client para Kafka: Bibliotecas como confluent-kafka-go.
- Produção e Consumo de Mensagens: Como produzir eventos para tópicos e consumir eventos em Go.
- Escalabilidade e Resiliência:
- Como lidar com grandes volumes de dados e garantir a entrega confiável de mensagens.
- Técnicas de partitioning e replication do Kafka.
- Real-Time Event Processing:
- Implementação de sistemas de processamento de fluxo em tempo real (como KSQL ou Apache Flink).
12.4 Streaming com WebRTC
- WebRTC: Tecnologias de comunicação em tempo real (principalmente áudio, vídeo e dados).
- Uso de WebRTC com Go:
- Como integrar Go com WebRTC para comunicação em tempo real via peer-to-peer (P2P).
- Bibliotecas como pion/webrtc para construir soluções de comunicação WebRTC em Go.
13. Segurança em Aplicações Web
13.1 Práticas de Segurança Básica
13.1.1 Autenticação e Autorização
- Autenticação baseada em Token (JWT)
- Como implementar autenticação usando JSON Web Tokens (JWT) em APIs RESTful e GraphQL.
- Criação e verificação de tokens JWT com bibliotecas como golang-jwt/jwt.
- Como usar OAuth2 e OpenID Connect para delegação de autenticação (ex: Login via Google, Facebook).
- Autorização e Controle de Acesso:
- RBAC (Role-Based Access Control): Como implementar autorização baseada em papéis.
- ACL (Access Control Lists): Gerenciamento de permissões de acesso a recursos específicos.
13.1.2 Proteção Contra Ameaças Comuns
- Injeção de SQL: Como proteger suas aplicações contra SQL Injection.
- Usar consultas parametrizadas ou ORM como GORM para evitar injeções.
- Cross-Site Scripting (XSS): Prevenção de XSS em suas aplicações.
- Escapar adequadamente dados do usuário e usar bibliotecas como HTML sanitization.
- Cross-Site Request Forgery (CSRF):
- Como proteger suas APIs e web apps de CSRF usando tokens de CSRF.
- Clickjacking: Como proteger seu site contra ataques de clickjacking utilizando cabeçalhos X-Frame-Options.
13.2 Criptografia e Proteção de Dados
13.2.1 Criptografia de Dados
- Criptografia de Senhas:
- Como implementar a criptografia de senhas usando algoritmos seguros como bcrypt ou argon2.
- Salt e hashing de senhas para garantir que os dados de senha sejam armazenados de forma segura.
- TLS/SSL:
- Como configurar conexões seguras HTTPS em Go usando TLS para garantir a segurança na troca de dados.
- Let's Encrypt para certificados SSL gratuitos e automatizados.
- Criptografia de Dados em Repouso e Trânsito:
- Como criptografar dados armazenados (por exemplo, em bancos de dados).
- Usar AES para criptografia simétrica e RSA para criptografia assimétrica.
13.2.2 Integração de Criptografia em Go
- Como usar a biblioteca crypto em Go para criptografia, hashing e assinatura de dados.
- Implementar HMAC (Hash-Based Message Authentication Code) para garantir a integridade e autenticidade de dados.
13.3 Proteção Contra DDoS e Ataques em Larga Escala
- Rate Limiting:
- Como limitar o número de requisições por IP ou usuário em APIs usando Go (exemplo com Gin ou Go-Rate-Limit).
- CAPTCHA:
- Implementação de CAPTCHA (Google reCAPTCHA ou hCaptcha) para impedir bots de interagir com seu sistema.
- Firewall e Segurança de Rede:
- Implementação de firewalls para proteger sua infraestrutura de acessos não autorizados.
- Uso de WAF (Web Application Firewall) para detectar e bloquear ataques comuns.
13.4 Proteção de APIs
13.4.1 Validação e Sanitização de Entrada
- Validação de Entrada: Sempre validar e sanitizar os dados de entrada do usuário para evitar injeção de dados maliciosos.
- Bibliotecas de Validação: Como usar pacotes de validação como validator em Go.
- Limitação de Tamanho de Request: Como definir limites de tamanho de payload para evitar ataques de negação de serviço (DoS).
13.4.2 Proteção de Endpoints
- Autenticação em APIs:
- Autenticação em APIs RESTful com JWT.
- OAuth2 para APIs de acesso a terceiros e APIs internas.
- CORS (Cross-Origin Resource Sharing):
- Configuração de CORS para permitir ou restringir a origem de requisições de APIs
- Log de Acessos e Monitoramento de Segurança:
- Uso de ferramentas de logging e monitoramento (como ELK Stack, Prometheus e Grafana) para identificar acessos suspeitos e prevenir brechas de segurança.
13.5 Ferramentas e Bibliotecas de Segurança em Go
- gorilla/securecookie: Para gerenciamento seguro de cookies em Go.
- x/crypto: Biblioteca padrão de Go para criptografia e segurança.
- GoSecure: Ferramenta de segurança para auditar aplicações Go em busca de vulnerabilidades comuns.