Trilha de Kotlin
Do zero ao Kotlin sênior: história da linguagem, POO, coroutines, JVM, APIs com Spring Boot, persistência e arquitetura, em 59 aulas e 9 fases.
59 posts
- 1História do Kotlin: por que a linguagem nasceu e qual problema ela resolve
Como a JetBrains criou o Kotlin para aliviar dores do Java, quais objetivos guiaram o projeto e onde a linguagem roda hoje, com datas conferidas.
iniciante - 2Ambiente e primeiro programa
Instale o JDK, o IntelliJ e o Gradle, crie um projeto Kotlin como as equipes criam e rode o primeiro programa pela IDE e pelo terminal.
iniciante - 3Controle de fluxo: if, when e laços
Como o Kotlin escolhe e repete: if e when como expressões, ranges com .. e until, for, while, break, continue e labels, com saídas reais.
iniciante - 4Funções: parâmetros, retorno e argumentos nomeados
Como declarar funções em Kotlin com fun, parâmetros, tipo de retorno, Unit, valores padrão e argumentos nomeados, com saídas reais de cada trecho.
iniciante - 5Null safety e tipos nuláveis
Aula da fase 1 da trilha de Kotlin: Como `String?` muda o contrato de uma função, por que `!!` esconde uma decisão de modelagem e como tratar valores vindos do Java?
iniciante - 6Coleções e lambdas
Listas, conjuntos e mapas no Kotlin, lambdas com it e as operações do dia a dia, como map, filter e groupBy, com saídas reais do Kotlin 2.4.21.
iniciante - 7Exceções e primeiro teste automatizado
Veja como uma exceção interrompe o fluxo, como tratá-la com try, catch e finally e como escrever o primeiro teste com kotlin.test.
iniciante - 8Classes, objetos e propriedades
Classes como moldes e objetos como instâncias, com construtor primário, propriedades, init e identidade em Kotlin, com saídas medidas no JDK 25 e no JDK 21.
iniciante - 9Encapsulamento, visibilidade, object e companion
Aprenda a esconder o estado de uma classe atrás de ações que protegem as regras, com visibilidade, object, companion object e object expression.
iniciante - 10Herança e polimorfismo
Aprenda a reaproveitar e especializar classes com open, override, super e abstract, e a tratar objetos de tipos diferentes da mesma forma em Kotlin.
iniciante - 11Interfaces, delegação e classes open
Aula da fase 2 da trilha de Kotlin: Como compor comportamento com `by` em vez de herança, e por que classes são `final` por padrão?
intermediário - 12data class, enum e value class
Aula da fase 2 da trilha de Kotlin: Quando usar `data class` para valores, o que ela gera por baixo, e como `value class` evita confundir `UserId` com `OrderId` sem custo extra?
intermediário - 13sealed e when exaustivo
Aula da fase 2 da trilha de Kotlin: Como modelar estados de um processo para que o compilador avise quando um caso novo não foi tratado?
intermediário - 14Genéricos básicos: classes e funções para vários tipos
Como escrever classes e funções genéricas em Kotlin com T, deixar o compilador deduzir o tipo, limitar T com Comparable e lidar com null, com saídas reais.
intermediário - 15Funções de escopo e funções de extensão
Aula da fase 3 da trilha de Kotlin: Qual função de escopo usar em cada caso, e por que uma função de extensão não substitui um método virtual?
intermediário - 16Coleções imutáveis e Sequence
Aula da fase 3 da trilha de Kotlin: Qual a diferença entre `List` e `Sequence` em uma cadeia de `map` e `filter`, e quando a alocação de coleções intermediárias importa?
intermediário - 17Tratamento funcional de erros
Aula da fase 3 da trilha de Kotlin: Quando `Result` e `runCatching` ajudam, quando `Either` do Arrow vale o custo, e quando uma exceção continua sendo a escolha certa?
intermediário - 18Variância e genéricos reified
Aula da fase 3 da trilha de Kotlin: Por que `List<out T>` aceita subtipos, e como `reified` permite acessar o tipo em tempo de execução?
avançado - 19Funções inline e custo de lambdas
Aula da fase 3 da trilha de Kotlin: Quando uma função `inline` elimina a alocação do lambda, e quando essa otimização não faz diferença?
avançado - 20Propriedades delegadas, operadores e destructuring
Delegates com by (lazy, observable, vetoable e um próprio), operadores com operator fun e destructuring com componentN: o que cada um resolve e onde engana.
intermediário - 21Expressões e interop com Java
Aula da fase 3 da trilha de Kotlin: Como `if`, `when` e `try` produzem valores, e como expor uma API Kotlin de forma amigável para quem ainda chama pelo Java?
intermediário - 22Threads e concorrência na JVM
Threads, condição de corrida, synchronized, volatile, pools com Future e deadlock na JVM, com código rodado em Kotlin e as saídas que apareceram de verdade.
intermediário - 23suspend e a máquina de estados
Aula da fase 4 da trilha de Kotlin: O que o compilador gera a partir de uma função `suspend`, e por que ela não cria thread por si só?
intermediário - 24CoroutineScope e concorrência estruturada
Aula da fase 4 da trilha de Kotlin: Quando `coroutineScope` falha tudo e `supervisorScope` isola falhas, e quem é responsável por cada coroutine criada?
intermediário - 25Dispatchers e bloqueio
Aula da fase 4 da trilha de Kotlin: Por que bloquear `Dispatchers.Default` trava o serviço, e como `limitedParallelism` controla a concorrência?
intermediário - 26Cancelamento cooperativo
Aula da fase 4 da trilha de Kotlin: Por que um `catch` genérico quebra o cancelamento, e como `ensureActive` e `NonCancellable` tratam a limpeza?
intermediário - 27Flow, StateFlow e Channel
Aula da fase 4 da trilha de Kotlin: Quando um `Flow` frio basta, quando um fluxo quente é necessário, e quando um `Channel` coordena produtor e consumidor?
intermediário - 28Estado compartilhado: Mutex e atomics
Proteja um contador compartilhado entre coroutines com Mutex, atomics, confinamento ou canais, e veja por que suspender não basta para evitar o erro.
intermediário - 29Virtual threads e testes com runTest
Aula da fase 4 da trilha de Kotlin: Quando virtual threads do Java 21 são a escolha certa, e como testar coroutines com tempo virtual sem `Thread.sleep`?
avançado - 30Bytecode e decompilação
Aula da fase 5 da trilha de Kotlin: O que vira objeto, método estático ou classe auxiliar ao compilar Kotlin, e como confirmar isso com `javap`?
avançado - 31Boxing e alocações escondidas
Aula da fase 5 da trilha de Kotlin: Por que `Int` vira `Integer` em coleções genéricas e em tipos nuláveis, e onde isso aparece em laços quentes?
avançado - 32Heap, GC e pausas
Aula da fase 5 da trilha de Kotlin: Como G1, ZGC e Shenandoah diferem em pausa e em custo de CPU, e como ler os logs de GC?
avançado - 33JIT e análise de escape
Aula da fase 5 da trilha de Kotlin: Quando o C2 remove uma alocação, e como escrever código que facilita essa otimização?
avançado - 34Profiling com JFR e startup
Aula da fase 5 da trilha de Kotlin: Como o JFR mostra alocação e pausas em produção, e quais as trocas entre CDS, AOT e GraalVM Native Image?
avançado - 35HTTP e REST
Pedido e resposta HTTP, verbos, idempotência, códigos de status e desenho de recursos, com um servidor de pedidos em Kotlin rodado no JDK 21 e no 25.
intermediário - 36Gradle Kotlin DSL e multi-módulo
Aula da fase 6 da trilha de Kotlin: Como organizar módulos e um catálogo de versões para que o build continue claro com o crescimento do projeto?
intermediário - 37Injeção de dependência e IoC no Spring
Como o Spring monta os objetos de um serviço por injeção no construtor, com beans, @Primary, @Qualifier e dependência circular, em saídas reais.
intermediário - 38Starters e configuração por ambiente
Aula da fase 6 da trilha de Kotlin: Como os starters do Spring Boot montam um serviço, e como `application.yml`, profiles e `@ConfigurationProperties` separam configuração de código?
intermediário - 39Spring Boot com controllers suspend
Aula da fase 6 da trilha de Kotlin: Como validar entrada com Bean Validation e como controllers `suspend` se comportam no Spring MVC?
intermediário - 40Serialização com kotlinx.serialization e Jackson
Aula da fase 6 da trilha de Kotlin: Quais as diferenças de comportamento com nulos e campos ausentes entre as duas bibliotecas?
intermediário - 41Tratamento de erros com ProblemDetail
Aula da fase 6 da trilha de Kotlin: Como mapear exceções de domínio para status HTTP sem vazar detalhes internos?
intermediário - 42Segurança com JWT e OpenAPI
Aula da fase 6 da trilha de Kotlin: Como validar claims em um resource server e documentar a API com springdoc sem expor o que não deveria?
avançado - 43Design avançado de API: paginação, versionamento e idempotência
Paginação por deslocamento e por cursor, versões de API, Idempotency-Key e ETag em Spring Boot, com requisições reais e as falhas que cada escolha esconde.
avançado - 44Clientes HTTP com RestClient e WebClient
Chame outro serviço com RestClient e WebClient, trate erros de status, faça o timeout disparar de verdade e teste o cliente sem rede, com saídas reais.
intermediário - 45Mensageria com Kafka
Por que pôr um broker entre dois sistemas, como o Kafka ordena e entrega mensagens, e um produtor e um consumidor em Kotlin com reentrega medida.
avançado - 46SQL e modelagem relacional essencial
Tabelas, chaves, restrições, JOIN, agregação e normalização com clientes e pedidos, rodados no PostgreSQL 18.6 antes de qualquer ORM.
intermediário - 47JPA básico: entidades, repositórios e @Transactional
Como mapear classes Kotlin para tabelas com JPA e Spring Data, e por que o rollback depende da classe da exceção, com saídas medidas em PostgreSQL.
intermediário - 48JPA, Hibernate e N+1
Aula da fase 7 da trilha de Kotlin: Quando o carregamento lazy causa N+1, e como `fetch join` e `@EntityGraph` resolvem o problema?
intermediário - 49data class como entidade
Aula da fase 7 da trilha de Kotlin: Por que `equals`, `hashCode` e `toString` gerados podem disparar carregamento lazy ou recursão em relacionamentos?
intermediário - 50Migrations com Liquibase
Aula da fase 7 da trilha de Kotlin: Como versionar o schema com changesets, por que um changeset já aplicado nunca deve ser editado e como o `contexts` separa dados de teste?
intermediário - 51HikariCP e limites do banco
Aula da fase 7 da trilha de Kotlin: Como dimensionar o pool em relação ao número de threads e ao limite de conexões do Postgres?
avançado - 52Spring Data MongoDB: documentos e modelagem
Aula da fase 7 da trilha de Kotlin: Quando embutir um documento e quando referenciá-lo, e como `MongoTemplate` atende consultas que o repositório não cobre?
intermediário - 53Índices e transações no MongoDB
Aula da fase 7 da trilha de Kotlin: Como usar `explain` para evitar varredura completa da coleção, e o que o replica set muda nas transações?
intermediário - 54SOLID e padrões de projeto em Kotlin
Cinco princípios SOLID com código Kotlin que viola e depois corrige, padrões que a linguagem já resolve e o que sobra das regras de Object Calisthenics.
intermediário - 55Arquitetura hexagonal com ArchUnit
Aula da fase 8 da trilha de Kotlin: Como manter o domínio sem dependência de framework e como impedir que a regra seja quebrada no futuro?
avançado - 56Testes com Kotest, MockK e Testcontainers
Aula da fase 8 da trilha de Kotlin: Quando usar testes de propriedade, por que MockK lida melhor com Kotlin do que Mockito, e como subir Postgres e MongoDB reais nos testes, além de testar o Azure…
intermediário - 57Observabilidade com Micrometer e OpenTelemetry
Aula da fase 8 da trilha de Kotlin: Como expor métricas, propagar traces e manter logs estruturados em JSON no mesmo serviço?
avançado - 58Resiliência e empacotamento
Aula da fase 8 da trilha de Kotlin: Como aplicar circuit breaker e retry com jitter, e como gerar uma imagem Docker enxuta com camadas e `jlink`?
avançado - 59Projeto final: uma API completa de ponta a ponta
Uma API de pedidos com hexagonal, JWT, paginação, ProblemDetail, Liquibase, Micrometer e Docker, testada com Testcontainers e chamada com curl.
avançado