Como praticar Kotlin?

Aprender a teoria é importante, mas a prática é o que transforma conhecimento em habilidade real. Se você quer realmente dominar Kotlin, precisa colocar a mao no código todos os dias. Neste guia, vou mostrar as melhores formas de praticar, desde exercícios para iniciantes até estrategias avançadas para quem já tem alguma experiência.

1. Kotlin Playground e REPL

O jeito mais rápido de começar a praticar e usando o Kotlin Playground no navegador. Nao precisa instalar nada, basta abrir e começar a digitar código.

Para prática local, você pode usar o REPL (Read-Eval-Print Loop) do Kotlin:

// Abra o terminal e digite: kotlinc
// Isso abre o REPL interativo onde voce pode testar codigo rapidamente

// Experimente no Playground ou REPL:
fun inverterPalavras(frase: String): String =
    frase.split(" ").reversed().joinToString(" ")

fun contarVogais(texto: String): Int =
    texto.lowercase().count { it in "aeiou" }

fun main() {
    println(inverterPalavras("Kotlin e incrivel"))
    // Saida: "incrivel e Kotlin"

    println(contarVogais("Desenvolvimento de software"))
    // Saida: 11
}

2. Kotlin Koans

Os Kotlin Koans são exercícios interativos oficiais criados pela JetBrains. Eles cobrem os principais recursos da linguagem de forma progressiva e são excelentes para quem esta comecando.

Os Koans cobrem topicos como:

  • Introdução a sintaxe
  • Convenções e operadores
  • Coleções e transformacoes
  • Propriedades e delegação
  • Builders e DSLs
  • Generics

3. Plataformas de desafios de programação

Resolver desafios em plataformas online e uma forma excelente de praticar lógica e sintaxe simultaneamente.

Plataformas recomendadas:

  • HackerRank: tem seção específica para Kotlin com problemas categorizados por dificuldade
  • LeetCode: aceita solucoes em Kotlin e e otimo para preparacao de entrevistas
  • Exercism: oferece trilha de Kotlin com mentoria voluntaria
  • CodeWars: desafios em formato de “katas” com dificuldade progressiva
// Exemplo de desafio tipico: encontrar o segundo maior numero
fun segundoMaior(numeros: List<Int>): Int? {
    if (numeros.size < 2) return null
    return numeros.distinct().sortedDescending().getOrNull(1)
}

// Desafio: verificar se uma string e palindromo
fun ePalindromo(texto: String): Boolean {
    val limpo = texto.lowercase().filter { it.isLetterOrDigit() }
    return limpo == limpo.reversed()
}

// Desafio: FizzBuzz funcional
fun fizzBuzz(n: Int): List<String> =
    (1..n).map { numero ->
        when {
            numero % 15 == 0 -> "FizzBuzz"
            numero % 3 == 0 -> "Fizz"
            numero % 5 == 0 -> "Buzz"
            else -> numero.toString()
        }
    }

fun main() {
    println(segundoMaior(listOf(5, 3, 8, 1, 9, 2)))  // 8
    println(ePalindromo("A man a plan a canal Panama"))  // true
    println(fizzBuzz(15))
}

4. Projetos pessoais progressivos

A melhor prática vem de construir algo real. Aqui esta uma progressao recomendada de projetos:

Nível iniciante:

  • Calculadora de linha de comando
  • Lista de tarefas (to-do list) no terminal
  • Conversor de unidades (temperatura, moedas, medidas)
  • Jogo de adivinhacao de números

Nível intermediário:

  • API REST com Ktor ou Spring Boot
  • App Android simples com Jetpack Compose (lista de notas, calculadora de gorjeta)
  • Leitor de RSS que consome feeds da internet
  • Sistema de gerenciamento de biblioteca (CRUD completo)

Nível avançado:

  • App multiplataforma com KMP
  • Clone simplificado de um app popular (lista de compras, previsao do tempo)
  • Contribuicao em projetos open source
  • Ferramenta CLI com kotlinx-cli
// Projeto pratico: calculadora de IMC
fun calcularIMC(peso: Double, altura: Double): Double =
    peso / (altura * altura)

fun classificarIMC(imc: Double): String = when {
    imc < 18.5 -> "Abaixo do peso"
    imc < 25.0 -> "Peso normal"
    imc < 30.0 -> "Sobrepeso"
    imc < 35.0 -> "Obesidade grau I"
    imc < 40.0 -> "Obesidade grau II"
    else -> "Obesidade grau III"
}

fun main() {
    print("Digite seu peso (kg): ")
    val peso = readLine()?.toDoubleOrNull() ?: return

    print("Digite sua altura (m): ")
    val altura = readLine()?.toDoubleOrNull() ?: return

    val imc = calcularIMC(peso, altura)
    val classificacao = classificarIMC(imc)

    println("Seu IMC: ${"%.1f".format(imc)}")
    println("Classificacao: $classificacao")
}

5. Contribuicao em projetos open source

Contribuir em projetos open source e uma das melhores formas de praticar Kotlin em um contexto profissional. Você aprende padrões de código real, passa por code review e interage com outros desenvolvedores.

Como começar:

  1. Procure projetos Kotlin no GitHub com a tag “good first issue”
  2. Leia o código existente para entender os padrões
  3. Comece com contribuicoes pequenas (correção de bugs, melhoria de documentação)
  4. Evolua para contribuicoes maiores conforme ganha confianca

Projetos brasileiros de Kotlin para contribuir:

  • Bibliotecas e ferramentas da comunidade
  • Projetos de aprendizado colaborativo
  • Aplicativos open source em Kotlin

6. Estudo de código alheio

Ler código escrito por outros desenvolvedores experientes e uma forma poderosa de aprendizado. Análise projetos open source populares em Kotlin e tente entender:

  • Como eles organizam o código
  • Quais padrões de projeto utilizam
  • Como lidam com tratamento de erros
  • Como escrevem testes

7. Testes automatizados como prática

Escrever testes e uma habilidade fundamental e também uma otima forma de praticar:

// Praticando com testes unitarios
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*

class CalculadoraTest {
    private val calc = Calculadora()

    @Test
    fun `soma de dois numeros positivos`() {
        assertEquals(5, calc.somar(2, 3))
    }

    @Test
    fun `divisao por zero lanca excecao`() {
        assertThrows(ArithmeticException::class.java) {
            calc.dividir(10, 0)
        }
    }

    @Test
    fun `lista filtrada corretamente`() {
        val numeros = listOf(1, 2, 3, 4, 5, 6)
        val pares = numeros.filter { it % 2 == 0 }
        assertEquals(listOf(2, 4, 6), pares)
    }
}

8. Habitos diarios que aceleram o aprendizado

  • 30 minutos por dia: a consistencia vale mais que sessoes longas esporadicas
  • Caderno de anotações: anote conceitos novos, erros cometidos e solucoes encontradas
  • Ensine alguem: explicar um conceito para outra pessoa consolida seu próprio entendimento
  • Revise código antigo: volte a projetos anteriores e melhore-os com o que aprendeu
  • Participe de comunidades: tire duvidas, responda perguntas de outros e troque experiencias

Pros e contras de cada método de prática

Plataformas de desafios:

  • Pro: exercícios variados e com dificuldade progressiva
  • Pro: preparacao para entrevistas tecnicas
  • Contra: problemas abstratos que nem sempre refletem o trabalho real

Projetos pessoais:

  • Pro: motivacao pessoal e resultado tangivel
  • Pro: experiência proxima ao trabalho profissional
  • Contra: pode ser difícil manter a disciplina sozinho

Contribuicao open source:

  • Pro: experiência real com code review e colaboracao
  • Pro: networking com outros desenvolvedores
  • Contra: curva de aprendizado inicial para entender projetos grandes

O mais importante

Nao existe uma única forma certa de praticar. O segredo e combinar diferentes abordagens e manter a constancia. Comece com o que for mais confortavel para você e va expandindo conforme ganha confianca. O mais importante e escrever código todos os dias, mesmo que seja pouco.

Perguntas relacionadas