<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://devlog.tiagoaguiar.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://devlog.tiagoaguiar.dev/" rel="alternate" type="text/html" /><updated>2026-07-04T19:17:22+00:00</updated><id>https://devlog.tiagoaguiar.dev/feed.xml</id><subtitle>Eu sou Tiago Aguiar, desenvolvedor há 15 anos. Hoje crio aplicativos móveis, mas minha jornada passou pelo front-end e back-end antes de me especializar em mobile. Minha paixão por programação começou em 2009, quando escrevi minha primeira linha de código em Assembly para microcontroladores. Desde então, transformei curiosidade em carreira e acumulei uma sólida experiência no desenvolvimento de software. Além de Senior Mobile Developer (Android &amp; iOS), também sou empreendedor, criador de conteúdo, Indie Dev e apaixonado pelo desenvolvimento de motores de jogos. Com isso, pude ajudar milhares de pessoas a conquistarem seu primeiro emprego na programação e outras tantas a evoluírem para o próximo nível. Se você deseja aprender a programar de verdade, aqui é um lugar para encontrar direção, prática e o caminho para sair do ZERO ao PRO. Na vida pessoal sou marido, pai de 3 pets e fã do Iron Maiden \o/
</subtitle><author><name>Tiago Aguiar</name></author><entry><title type="html">3.1 - Alocando Buffer de Desenho com DIBSection no Windows</title><link href="https://devlog.tiagoaguiar.dev/dibsection-back-buffer/" rel="alternate" type="text/html" title="3.1 - Alocando Buffer de Desenho com DIBSection no Windows" /><published>2026-06-07T12:52:27+00:00</published><updated>2026-06-07T12:52:27+00:00</updated><id>https://devlog.tiagoaguiar.dev/dibsection-back-buffer</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/dibsection-back-buffer/"><![CDATA[<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org58541eb">Área cliente da janela</a></li>
<li><a href="#orga888a0b">Criando o back buffer</a></li>
<li><a href="#orgd9988c3">O que é uma DIBSection</a></li>
<li><a href="#org5cdd25b">O que é HBITMAP</a></li>
<li><a href="#orgb2af594">HBITMAP, HMODULE, HWND, HDC e outros handles</a></li>
<li><a href="#org6270622">Configurando o BITMAPINFO</a>
<ul>
<li><a href="#orga457429">biSize</a></li>
<li><a href="#org8dc48b3">biWidth e biHeight</a></li>
<li><a href="#org06503c3">biPlanes</a></li>
<li><a href="#orgdf3d644">biBitCount</a></li>
<li><a href="#org87552c7">biCompression</a></li>
<li><a href="#orgbd983e3">biSizeImage</a></li>
</ul>
</li>
<li><a href="#org0332e9e">Preenchendo os pixels</a></li>
<li><a href="#org4f819fd">Recriando o buffer no resize</a></li>
<li><a href="#org59a25ac">Exibindo o buffer na janela</a></li>
<li><a href="#org222acb1">Device Context e bitmap</a></li>
<li><a href="#org180e32a">Conclusão</a></li>
<li><a href="#org51733b6">Meu Acesso Rápido</a></li>
</ul>
</div>
</div>

<p>
Neste artigo vou alocar um <i>back buffer</i> no Windows usando <code>CreateDIBSection</code>.
</p>

<p>
A ideia é simples: o jogo desenha primeiro em um bloco de memória fora da tela e, depois, copia esse bloco para a janela. Essa cópia costuma ser chamada de <i>blit</i>.
</p>

<p>
Então temos duas etapas principais:
</p>

<ol class="org-ol">
<li>Descobrir o tamanho da área de desenho da janela.</li>
<li>Criar uma memória de pixels com esse tamanho e copiá-la para a tela quando necessário.</li>
</ol>

<p>
Essa é a continuação natural depois de criar a janela e pintar a área cliente com <code>PatBlt</code>. Agora, em vez de pedir para o GDI pintar um retângulo preto direto na janela, vamos controlar cada pixel manualmente.
</p>
<div id="outline-container-org58541eb" class="outline-2">
<h2 id="org58541eb">Área cliente da janela</h2>
<div class="outline-text-2" id="text-org58541eb">
<p>
A janela do Windows possui bordas, barra de título e outros elementos que não fazem parte da área real de desenho.
</p>

<p>
Para um jogo, normalmente queremos o tamanho interno da janela. Ou seja, a área onde nossos pixels realmente serão exibidos.
</p>

<p>
Para isso usamos <code>GetClientRect</code>.
</p>

<div class="org-src-container">
<pre class="src src-cpp">RECT client_rect;
GetClientRect(hwnd, &amp;client_rect);

int width  = client_rect.right - client_rect.left;
int height = client_rect.bottom - client_rect.top;
</pre>
</div>

<p>
O <code>RECT</code> possui quatro campos:
</p>

<ul class="org-ul">
<li><b>left</b>: posição inicial no eixo X;</li>
<li><b>top</b>: posição inicial no eixo Y;</li>
<li><b>right</b>: posição final no eixo X;</li>
<li><b>bottom</b>: posição final no eixo Y.</li>
</ul>

<p>
Como estamos usando <code>GetClientRect</code>, normalmente <code>left</code> e <code>top</code> serão zero. Mesmo assim, calcular <code>right - left</code> e <code>bottom - top</code> deixa a intenção explícita.
</p>

<p>
Faremos essa consulta quando a janela for criada e também quando ela for redimensionada. Se o usuário muda o tamanho da janela, o nosso buffer antigo não representa mais o tamanho correto da tela. Logo, precisamos destruir o bitmap antigo e criar outro.
</p>
</div>
</div>
<div id="outline-container-orga888a0b" class="outline-2">
<h2 id="orga888a0b">Criando o back buffer</h2>
<div class="outline-text-2" id="text-orga888a0b">
<p>
O bloco principal deste artigo é a função abaixo.
</p>

<div class="org-src-container">
<pre class="src src-cpp">internal HBITMAP bitmap_handle;
internal void *bitmap_memory;
internal BITMAPINFO bmi;

internal void
create_back_buffer(int width, int height)
{
    if (bitmap_handle) {
        DeleteObject(bitmap_handle);
        bitmap_handle = NULL;
        bitmap_memory = NULL;
        printf("Delete memory!\n");
    }

    assert(width &gt; 0);
    assert(height &gt; 0);

    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = width;
    bmi.bmiHeader.biHeight = -height;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;

    bitmap_handle = CreateDIBSection(NULL,
                                     &amp;bmi,
                                     DIB_RGB_COLORS,
                                     &amp;bitmap_memory,
                                     NULL,
                                     0);

    printf("Create memory!\n");

    if (!bitmap_handle) {
        // TODO(tiago): handle error with GetLastError.
        printf("Failed to Create Bitmap Handle\n");
        return;
    }

    unsigned int *memory = (unsigned int *)bitmap_memory;
    for (int y = 0; y &lt; height; y++) {
        for (int x = 0; x &lt; width; x++) {
            *memory = (unsigned int)(0 &lt;&lt; 16 | (unsigned char)y &lt;&lt; 8 | (unsigned char)x);
            memory++;
        }
    }
}
</pre>
</div>

<p>
Aqui estamos criando um bitmap de 32 bits por pixel. Cada pixel ocupa 4 bytes na memória.
</p>

<p>
O valor escrito no loop final gera um gradiente simples. Ele não é o desenho definitivo do jogo. É apenas uma maneira rápida de confirmar se a memória foi criada corretamente e se conseguimos enxergar alguma coisa na tela.
</p>
</div>
</div>
<div id="outline-container-orgd9988c3" class="outline-2">
<h2 id="orgd9988c3">O que é uma DIBSection</h2>
<div class="outline-text-2" id="text-orgd9988c3">
<p>
<code>DIB</code> significa <i>Device Independent Bitmap</i>.
</p>

<p>
Ou seja, é um bitmap independente de dispositivo. Ele não pertence a uma janela específica, nem a um monitor específico, nem ao <code>HWND</code>.
</p>

<p>
Essa parte é importante porque pode parecer estranho chamar <code>CreateDIBSection</code> sem passar o <code>HWND</code> e sem chamar <code>GetDC</code> antes.
</p>

<p>
Mas para esse caso não precisamos disso.
</p>

<div class="org-src-container">
<pre class="src src-cpp">bitmap_handle = CreateDIBSection(NULL,
                                 &amp;bmi,
                                 DIB_RGB_COLORS,
                                 &amp;bitmap_memory,
                                 NULL,
                                 0);
</pre>
</div>

<p>
O primeiro parâmetro é um <code>HDC</code>. Estamos passando <code>NULL</code> porque queremos criar um bitmap independente usando as informações do <code>BITMAPINFO</code>.
</p>

<p>
Como estamos usando:
</p>

<ul class="org-ul">
<li><code>biBitCount = 32</code>;</li>
<li><code>biCompression = BI_RGB</code>;</li>
<li><code>DIB_RGB_COLORS</code>;</li>
</ul>

<p>
o Windows tem informação suficiente para criar a memória de pixels sem depender do formato de uma janela.
</p>

<p>
O parâmetro <code>HDC</code> existe principalmente para casos em que o formato depende do dispositivo, paletas antigas, gerenciamento de cores e outros cenários onde o contexto de desenho influencia a criação do bitmap.
</p>

<p>
Para um back buffer simples de jogo, em 32 bits, ele pode ficar como <code>NULL</code>.
</p>

<p>
Visualmente, podemos pensar assim:
</p>

<div class="org-src-container">
<pre class="src src-console">HBITMAP
    |
    v
+----------------+
| Pixel Memory   |
|                |
| 0x00RRGGBB     |
| 0x00RRGGBB     |
| 0x00RRGGBB     |
+----------------+
</pre>
</div>

<p>
O <code>CreateDIBSection</code> devolve duas coisas importantes:
</p>

<ul class="org-ul">
<li>um <code>HBITMAP</code>, que é o handle usado pelo GDI;</li>
<li>um ponteiro em <code>bitmap_memory</code>, que é onde podemos escrever os pixels diretamente.</li>
</ul>

<p>
Essa combinação é exatamente o que queremos para renderização por software.
</p>

<p>
O nosso código escreve em memória normal, usando ponteiro. Depois o Windows consegue usar o <code>HBITMAP</code> e o <code>BITMAPINFO</code> para entender como copiar esses pixels para a janela.
</p>
</div>
</div>
<div id="outline-container-org5cdd25b" class="outline-2">
<h2 id="org5cdd25b">O que é HBITMAP</h2>
<div class="outline-text-2" id="text-org5cdd25b">
<p>
<code>HBITMAP</code> é um handle para um objeto de bitmap do GDI.
</p>

<p>
Um handle não é o objeto em si. Ele é um identificador opaco que o Windows devolve para o programa. Com esse identificador, podemos pedir para a API operar naquele recurso.
</p>

<p>
Por exemplo:
</p>

<div class="org-src-container">
<pre class="src src-cpp">HBITMAP bitmap_handle = CreateDIBSection(...);
</pre>
</div>

<p>
O tipo <code>HBITMAP</code> não deve ser tratado como um ponteiro para os pixels. Os pixels estão no <code>bitmap_memory</code>.
</p>

<p>
Essa diferença é essencial:
</p>

<ul class="org-ul">
<li><code>HBITMAP</code>: identifica o objeto de bitmap para o GDI;</li>
<li><code>bitmap_memory</code>: aponta para a memória real dos pixels.</li>
</ul>

<p>
Então, para desenhar manualmente, escrevemos em <code>bitmap_memory</code>. Para liberar o recurso do GDI, usamos <code>DeleteObject(bitmap_handle)</code>.
</p>

<div class="org-src-container">
<pre class="src src-cpp">if (bitmap_handle) {
    DeleteObject(bitmap_handle);
    bitmap_handle = NULL;
    bitmap_memory = NULL;
}
</pre>
</div>

<p>
Após chamar <code>DeleteObject</code>, o ponteiro <code>bitmap_memory</code> não deve mais ser usado. Ele apontava para a memória associada ao objeto destruído.
</p>

<p>
Por isso eu limpo os dois valores.
</p>
</div>
</div>
<div id="outline-container-orgb2af594" class="outline-2">
<h2 id="orgb2af594">HBITMAP, HMODULE, HWND, HDC e outros handles</h2>
<div class="outline-text-2" id="text-orgb2af594">
<p>
A Win32 API usa muitos tipos que começam com <code>H</code>.
</p>

<p>
Esse <code>H</code> normalmente significa <i>handle</i>.
</p>

<p>
Alguns exemplos comuns:
</p>

<ul class="org-ul">
<li><code>HWND</code>: handle para uma janela;</li>
<li><code>HDC</code>: handle para um <i>Device Context</i>;</li>
<li><code>HBITMAP</code>: handle para um bitmap do GDI;</li>
<li><code>HMODULE</code>: handle para um módulo carregado no processo;</li>
<li><code>HINSTANCE</code>: historicamente representa uma instância da aplicação, hoje costuma ser equivalente a um <code>HMODULE</code> em muitos contextos.</li>
</ul>

<p>
Apesar de todos serem handles, eles não representam a mesma coisa.
</p>

<p>
Um <code>HWND</code> identifica uma janela. Você usa esse handle com funções como <code>GetClientRect</code>, <code>DestroyWindow</code> ou <code>GetDC</code>.
</p>

<p>
Um <code>HDC</code> identifica um contexto de desenho. O GDI desenha através de um DC. Ele guarda o estado de desenho: superfície alvo, brush, pen, fonte, região de clipping e outras configurações.
</p>

<p>
Um <code>HBITMAP</code> identifica um bitmap. Ele pode ser selecionado em um DC de memória ou usado em operações de cópia, dependendo da função.
</p>

<p>
Um <code>HMODULE</code> identifica um módulo carregado no processo, como o próprio executável ou uma DLL. Ele é usado para encontrar recursos, endereços de funções e informações do módulo.
</p>

<p>
Portanto, mesmo que por baixo dos panos muitos handles sejam implementados como ponteiros ou valores numéricos, você não deve misturá-los.
</p>

<p>
Isto estaria conceitualmente errado:
</p>

<div class="org-src-container">
<pre class="src src-cpp">HMODULE module = (HMODULE)bitmap_handle; // errado
</pre>
</div>

<p>
O compilador pode até aceitar um cast forçado, mas a API não vai interpretar corretamente. Um <code>HBITMAP</code> pertence ao mundo de objetos GDI. Um <code>HMODULE</code> pertence ao carregador de módulos do processo.
</p>

<p>
O tipo do handle comunica qual subsistema do Windows entende aquele valor.
</p>

<p>
Em resumo:
</p>

<div class="org-src-container">
<pre class="src src-console">HWND     -&gt; janela
HDC      -&gt; contexto de desenho
HBITMAP  -&gt; bitmap do GDI
HMODULE  -&gt; executável ou DLL carregada
HINSTANCE -&gt; instância/módulo da aplicação
</pre>
</div>
</div>
</div>
<div id="outline-container-org6270622" class="outline-2">
<h2 id="org6270622">Configurando o BITMAPINFO</h2>
<div class="outline-text-2" id="text-org6270622">
<p>
A estrutura <code>BITMAPINFO</code> descreve como os pixels devem ser interpretados.
</p>

<div class="org-src-container">
<pre class="src src-cpp">bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
</pre>
</div>

<p>
Vamos por partes.
</p>
</div>
<div id="outline-container-orga457429" class="outline-3">
<h3 id="orga457429">biSize</h3>
<div class="outline-text-3" id="text-orga457429">
<p>
O campo <code>biSize</code> informa ao Windows qual cabeçalho estamos usando.
</p>

<div class="org-src-container">
<pre class="src src-cpp">bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
</pre>
</div>

<p>
No caso de <code>BITMAPINFOHEADER</code>, esse tamanho é 40 bytes.
</p>

<p>
Mas por que o Windows precisa disso?
</p>

<p>
Porque historicamente existiram várias versões de cabeçalhos de bitmap:
</p>

<div class="org-src-container">
<pre class="src src-console">BITMAPCOREHEADER   -&gt; 12 bytes
BITMAPINFOHEADER   -&gt; 40 bytes
BITMAPV4HEADER     -&gt; 108 bytes
BITMAPV5HEADER     -&gt; 124 bytes
</pre>
</div>

<p>
Como a função recebe um ponteiro genérico para uma estrutura, ela precisa descobrir como interpretar os próximos campos.
</p>

<p>
O primeiro campo do cabeçalho é justamente o tamanho. Assim, APIs antigas e novas conseguem compartilhar um padrão parecido.
</p>

<p>
Esse padrão aparece em vários pontos da Win32 API: a estrutura carrega o próprio tamanho para a função saber qual versão está recebendo.
</p>
</div>
</div>
<div id="outline-container-org8dc48b3" class="outline-3">
<h3 id="org8dc48b3">biWidth e biHeight</h3>
<div class="outline-text-3" id="text-org8dc48b3">
<p>
<code>biWidth</code> é a largura do bitmap em pixels.
</p>

<p>
<code>biHeight</code> é a altura, mas com um detalhe importante:
</p>

<div class="org-src-container">
<pre class="src src-cpp">bmi.bmiHeader.biHeight = -height;
</pre>
</div>

<p>
O valor negativo cria um bitmap <i>top-down</i>.
</p>

<p>
Isso significa que o primeiro pixel da memória representa o canto superior esquerdo da imagem.
</p>

<p>
Se usássemos altura positiva, o bitmap seria <i>bottom-up</i>. Nesse caso, a primeira linha da memória representaria a parte de baixo da imagem, que é o comportamento histórico dos bitmaps no Windows.
</p>

<p>
Para jogos e buffers manuais, <i>top-down</i> costuma ser mais natural, porque a maioria dos códigos trata <code>(0, 0)</code> como o canto superior esquerdo.
</p>
</div>
</div>
<div id="outline-container-org06503c3" class="outline-3">
<h3 id="org06503c3">biPlanes</h3>
<div class="outline-text-3" id="text-org06503c3">
<p>
Este campo precisa ser <code>1</code>.
</p>

<div class="org-src-container">
<pre class="src src-cpp">bmi.bmiHeader.biPlanes = 1;
</pre>
</div>

<p>
Ele existe por razões históricas. Para o nosso uso, não há decisão a tomar aqui.
</p>
</div>
</div>
<div id="outline-container-orgdf3d644" class="outline-3">
<h3 id="orgdf3d644">biBitCount</h3>
<div class="outline-text-3" id="text-orgdf3d644">
<p>
Aqui definimos quantos bits cada pixel usa.
</p>

<div class="org-src-container">
<pre class="src src-cpp">bmi.bmiHeader.biBitCount = 32;
</pre>
</div>

<p>
Com 32 bits, cada pixel ocupa 4 bytes.
</p>

<p>
Em memória, usando <code>BI_RGB</code>, podemos escrever um pixel no formato:
</p>

<div class="org-src-container">
<pre class="src src-console">0x00RRGGBB
</pre>
</div>

<p>
Na prática, em uma máquina little-endian, esses bytes ficam armazenados na memória como:
</p>

<div class="org-src-container">
<pre class="src src-console">BB GG RR 00
</pre>
</div>

<p>
Isso pode confundir no começo. O valor inteiro que escrevemos no código é <code>0x00RRGGBB</code>, mas a ordem dos bytes na memória depende da arquitetura.
</p>
</div>
</div>
<div id="outline-container-org87552c7" class="outline-3">
<h3 id="org87552c7">biCompression</h3>
<div class="outline-text-3" id="text-org87552c7">
<p>
Para esse exemplo, usamos <code>BI_RGB</code>.
</p>

<div class="org-src-container">
<pre class="src src-cpp">bmi.bmiHeader.biCompression = BI_RGB;
</pre>
</div>

<p>
Apesar do nome falar em RGB, aqui ele significa que o bitmap não usa compressão.
</p>

<p>
Com <code>32 bits</code> e <code>BI_RGB</code>, vamos escrever cada pixel diretamente como um inteiro de 32 bits.
</p>
</div>
</div>
<div id="outline-container-orgbd983e3" class="outline-3">
<h3 id="orgbd983e3">biSizeImage</h3>
<div class="outline-text-3" id="text-orgbd983e3">
<p>
O campo <code>biSizeImage</code> pode ficar zerado nesse caso.
</p>

<p>
Quando usamos <code>BI_RGB</code> sem compressão, o Windows consegue calcular o tamanho da imagem a partir da largura, altura e bits por pixel.
</p>

<p>
Mas o conceito é simples: <code>biSizeImage</code> representa o tamanho do buffer de pixels em bytes.
</p>

<p>
Por exemplo, para uma janela de <code>800 x 600</code> com <code>32 bits</code> por pixel:
</p>

<div class="org-src-container">
<pre class="src src-console">32 bits = 4 bytes

800 * 600 * 4 = 1.920.000 bytes
</pre>
</div>

<p>
Logo, esse buffer teria aproximadamente 1.9 MB.
</p>
</div>
</div>
</div>
<div id="outline-container-org0332e9e" class="outline-2">
<h2 id="org0332e9e">Preenchendo os pixels</h2>
<div class="outline-text-2" id="text-org0332e9e">
<p>
Depois que o <code>CreateDIBSection</code> cria a memória, podemos escrever nela.
</p>

<div class="org-src-container">
<pre class="src src-cpp">unsigned int *memory = (unsigned int *)bitmap_memory;
for (int y = 0; y &lt; height; y++) {
    for (int x = 0; x &lt; width; x++) {
        *memory = (unsigned int)(0 &lt;&lt; 16 |
                                 (unsigned char)y &lt;&lt; 8 |
                                 (unsigned char)x);
        memory++;
    }
}
</pre>
</div>

<p>
Como cada pixel tem 32 bits, fazemos o cast para <code>unsigned int *</code>.
</p>

<p>
Assim, cada incremento em <code>memory++</code> avança 4 bytes, ou seja, um pixel inteiro.
</p>

<p>
O valor do pixel está sendo montado com deslocamento de bits:
</p>

<div class="org-src-container">
<pre class="src src-cpp">0 &lt;&lt; 16              // vermelho
(unsigned char)y &lt;&lt; 8 // verde
(unsigned char)x      // azul
</pre>
</div>

<p>
O cast para <code>unsigned char</code> conserva apenas um byte do valor. Na prática, cada canal fica entre 0 e 255.
</p>

<p>
Para um teste visual, isso é suficiente.
</p>
</div>
</div>
<div id="outline-container-org4f819fd" class="outline-2">
<h2 id="org4f819fd">Recriando o buffer no resize</h2>
<div class="outline-text-2" id="text-org4f819fd">
<p>
Quando a janela muda de tamanho, precisamos recriar o back buffer.
</p>

<p>
No callback da janela, podemos fazer isso em <code>WM_SIZE</code>.
</p>

<div class="org-src-container">
<pre class="src src-cpp">case WM_SIZE: {
    RECT rect;
    GetClientRect(hwnd, &amp;rect);

    int width  = rect.right - rect.left;
    int height = rect.bottom - rect.top;

    if (width &gt; 0 &amp;&amp; height &gt; 0) {
        create_back_buffer(hwnd, 0, 0, width, height);
    }
} break;
</pre>
</div>

<p>
Antes de criar o novo bitmap, a função destrói o anterior:
</p>

<div class="org-src-container">
<pre class="src src-cpp">if (bitmap_handle) {
    DeleteObject(bitmap_handle);
    bitmap_handle = NULL;
    bitmap_memory = NULL;
}
</pre>
</div>

<p>
O <code>CreateDIBSection</code> cria um objeto GDI. Portanto, a função correta para liberar esse recurso é <code>DeleteObject</code>.
</p>

<p>
Não use <code>free</code> em <code>bitmap_memory</code>. Essa memória pertence ao objeto criado pelo GDI.
</p>
</div>
</div>
<div id="outline-container-org59a25ac" class="outline-2">
<h2 id="org59a25ac">Exibindo o buffer na janela</h2>
<div class="outline-text-2" id="text-org59a25ac">
<p>
Criar a DIBSection é só metade do processo.
</p>

<p>
Para enxergar os pixels, precisamos copiar o buffer para o <code>HDC</code> da janela. Podemos fazer isso no <code>WM_PAINT</code>.
</p>

<div class="org-src-container">
<pre class="src src-cpp">internal void
update_window(HDC hdc, int x, int y, int width, int height)
{
    StretchDIBits(hdc,
                  x, y, width, height, // dst
                  x, y, bmi.bmiHeader.biWidth, -bmi.bmiHeader.biHeight, // src
                  bitmap_memory,
                  &amp;bmi,
                  DIB_RGB_COLORS,
                  SRCCOPY);
}
</pre>
</div>

<p>
<code>StretchDIBits</code> copia os pixels de uma DIB para um <code>HDC</code>.
</p>

<p>
O nome começa com <i>Stretch</i> porque ela também pode redimensionar a imagem durante a cópia. Se o tamanho de origem e destino forem iguais, ela apenas copia.
</p>

<p>
Podemos chamar essa função durante o <code>WM_PAINT</code>:
</p>

<div class="org-src-container">
<pre class="src src-cpp">case WM_PAINT: {
    PAINTSTRUCT paint;
    HDC hdc = BeginPaint(hwnd, &amp;paint);

    RECT client_rect;
    GetClientRect(hwnd, &amp;client_rect);

    int width  = client_rect.right - client_rect.left;
    int height = client_rect.bottom - client_rect.top;

    update_window(hdc, 0, 0, width, height);

    EndPaint(hwnd, &amp;paint);
} break;
</pre>
</div>

<p>
Neste ponto, ainda estamos desenhando apenas quando o Windows pede uma repintura ou quando a janela muda de tamanho.
</p>

<p>
Mais adiante, em um jogo, o normal será:
</p>

<ol class="org-ol">
<li>processar input;</li>
<li>atualizar o estado do jogo;</li>
<li>renderizar no back buffer;</li>
<li>copiar o back buffer para a janela.</li>
</ol>

<p>
Esse ciclo acontece dentro do loop principal.
</p>
</div>
</div>
<div id="outline-container-org222acb1" class="outline-2">
<h2 id="org222acb1">Device Context e bitmap</h2>
<div class="outline-text-2" id="text-org222acb1">
<p>
Um detalhe que costuma confundir: o GDI desenha através de <code>HDC</code>.
</p>

<p>
O <code>HDC</code> representa um contexto de desenho. Ele não é apenas uma janela e também não é apenas uma imagem. Ele é uma estrutura que guarda o alvo e o estado do desenho.
</p>

<p>
Quando usamos <code>BeginPaint</code>, recebemos um <code>HDC</code> associado à janela:
</p>

<div class="org-src-container">
<pre class="src src-cpp">HDC hdc = BeginPaint(hwnd, &amp;paint);
</pre>
</div>

<p>
Quando usamos <code>CreateCompatibleDC</code>, criamos um DC em memória:
</p>

<div class="org-src-container">
<pre class="src src-cpp">HDC memory_dc = CreateCompatibleDC(NULL);
</pre>
</div>

<p>
Esse DC em memória pode ter um bitmap selecionado nele com <code>SelectObject</code>.
</p>

<p>
Para este artigo, o caminho mais direto é usar <code>StretchDIBits</code> com o ponteiro <code>bitmap_memory</code> e o <code>BITMAPINFO</code>. Assim não precisamos criar um DC de memória ainda.
</p>
</div>
</div>
<div id="outline-container-org180e32a" class="outline-2">
<h2 id="org180e32a">Conclusão</h2>
<div class="outline-text-2" id="text-org180e32a">
<p>
Com <code>CreateDIBSection</code> conseguimos criar um back buffer simples para renderização por software no Windows.
</p>

<p>
O ponto principal é entender que existem duas visões do mesmo recurso:
</p>

<ul class="org-ul">
<li>o <code>HBITMAP</code>, usado pelo GDI como handle do bitmap;</li>
<li>o <code>bitmap_memory</code>, usado pelo nosso código para escrever pixels diretamente.</li>
</ul>

<p>
O bitmap não pertence à janela. Ele é independente. A janela entra no processo apenas quando copiamos a memória para o <code>HDC</code> dela usando <code>StretchDIBits</code>.
</p>

<p>
Esse é o primeiro passo para desenhar o jogo manualmente. Daqui em diante, a renderização deixa de ser uma chamada como <code>PatBlt</code> e passa a ser uma escrita direta nos pixels.
</p>
</div>
</div>
<div id="outline-container-org51733b6" class="outline-2">
<h2 id="org51733b6">Meu Acesso Rápido</h2>
<div class="outline-text-2" id="text-org51733b6">
<ul class="org-ul">
<li class="off"><input type='checkbox' /> Buscar o tamanho da janela com GetClientRect</li>
<li class="off"><input type='checkbox' /> Criar o back buffer com as definições do BITMAPINFO</li>
<li class="off"><input type='checkbox' /> Gerar pixels de teste no bloco de memória</li>
<li class="off"><input type='checkbox' /> Fazer o blit na janela com StretchDIBits</li>
</ul>
</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><category term="gamedev" /><summary type="html"><![CDATA[Table of Contents Área cliente da janela Criando o back buffer O que é uma DIBSection O que é HBITMAP HBITMAP, HMODULE, HWND, HDC e outros handles Configurando o BITMAPINFO biSize biWidth e biHeight biPlanes biBitCount biCompression biSizeImage Preenchendo os pixels Recriando o buffer no resize Exibindo o buffer na janela Device Context e bitmap Conclusão Meu Acesso Rápido]]></summary></entry><entry><title type="html">2.1 - Criando Uma Janela de Jogo no Windows</title><link href="https://devlog.tiagoaguiar.dev/windows-game-window-api/" rel="alternate" type="text/html" title="2.1 - Criando Uma Janela de Jogo no Windows" /><published>2026-06-06T12:40:12+00:00</published><updated>2026-06-06T12:40:12+00:00</updated><id>https://devlog.tiagoaguiar.dev/windows-game-window-api</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/windows-game-window-api/"><![CDATA[<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#orgc8b59f0">Registrar uma classe</a></li>
<li><a href="#org5651def">Entendendo a flag CS_OWNDC</a></li>
<li><a href="#orgb257b1a">Criar uma janela</a></li>
<li><a href="#org7840207">Procedimento da janela</a>
<ul>
<li><a href="#org033e159">Entendendo o bloco WM_PAINT</a></li>
</ul>
</li>
<li><a href="#orgb6ab5bd">Processar mensagens para o game loop</a></li>
<li><a href="#org1a02b9b">Palavra-chave static e processamento da fila de mensagens</a></li>
<li><a href="#orgc2ac21e">Conclusão</a></li>
<li><a href="#orgc54487a">Meu acesso rápido</a></li>
<li><a href="#org5a9aad5">Referências</a></li>
</ul>
</div>
</div>

<p>
Nas próximas linhas eu vou mostrar como criar uma janela de jogo e configurar o loop principal dele.
</p>

<p>
Todos esses passos exigem seguir a documentação. Eu vou mostrar o código e explicar apenas os pontos principais, assumindo que você irá consultar a documentação em paralelo (como um bom programador o/).
</p>

<p>
A documentação do Windows se chama <a href="https://visualstudio.microsoft.com/pt-br/msdn-platforms/">MSDN</a>.
</p>
<div id="outline-container-orgc8b59f0" class="outline-2">
<h2 id="orgc8b59f0">Registrar uma classe</h2>
<div class="outline-text-2" id="text-orgc8b59f0">
<p>
O primeiro passo é criar uma <code>WindowClass</code>, uma struct chamada <code>WNDCLASS</code>.
</p>

<p>
Essa struct precisa de uma função de callback para lidar com tarefas relacionadas à janela, incluindo eventos de teclado.
</p>

<p>
Precisamos registrar essa struct para criar uma janela corretamente.
</p>

<p>
Vamos ver o código:
</p>

<div class="org-src-container">
<pre class="src src-cpp">int CALLBACK
WinMain(HINSTANCE instance,
        HINSTANCE prev_instance,
        LPSTR cmd_line,
        int show_cmd)
{
        WNDCLASSA window_class = {};
        window_class.style         = CS_VREDRAW|CS_HREDRAW|CS_OWNDC;
        window_class.lpfnWndProc   = window_callback;
        window_class.hInstance     = instance;
        window_class.lpszClassName = "GameClassName";
        // window_class.hIcon   -&gt; load icon
        window_class.hCursor       = LoadCursor(NULL, IDC_ARROW); 

        if (!RegisterClassA(&amp;window_class)) {
            printf("Failed to Register Class A\n");
            return 1;
        }
}
</pre>
</div>

<p>
Os pontos principais são:
</p>

<ul class="org-ul">
<li><b>style</b>: informações em bits que determinam como a janela opera;</li>
<li><b>lpfnWndProc</b>: uma função, que vamos criar depois, para lidar com eventos da janela como redimensionar, criar, destruir, etc;</li>
<li><b>hInstance</b>: handle da instância da aplicação;</li>
<li><b>lpszClassName</b>: nome da classe da janela;</li>
<li><b>CS_VREDRAW</b>: redesenha a janela verticalmente, se necessário, quando o tamanho muda;</li>
<li><b>CS_HREDRAW</b>: redesenha a janela horizontalmente, se necessário, quando o tamanho muda;</li>
<li><b>CS_OWNDC</b>: aloca apenas um <span class="underline">DeviceContext</span> para a janela. O Windows usa o DC para manter o estado do desenho enquanto desenhamos na janela. Inicialmente, ele foi pensado para ser usado junto com brushes. Normalmente, o Windows teria vários device contexts disponíveis. Quando um programa precisa desenhar, ele pega um, usa e depois devolve;</li>
<li><b>RegisterClassA</b>: função necessária para a janela funcionar corretamente.</li>
</ul>

<blockquote>
<p>
Também podemos obter o handle da instância chamando <code>GetModuleHandle(NULL)</code>.
</p>
</blockquote>

<p>
A função <code>OutputDebugStringA</code> serve como saída padrão para o modo de debug, visível apenas dentro do Visual Studio. Se você precisar ver a saída no console, troque pela função <code>printf</code> do arquivo <code>stdio.h</code>, que faz parte da biblioteca padrão de C.
</p>
</div>
</div>
<div id="outline-container-org5651def" class="outline-2">
<h2 id="org5651def">Entendendo a flag CS_OWNDC</h2>
<div class="outline-text-2" id="text-org5651def">
<p>
No começo do código, definimos o estilo da classe da janela assim:
</p>

<div class="org-src-container">
<pre class="src src-cpp">window_class.style = CS_VREDRAW|CS_HREDRAW|CS_OWNDC;
</pre>
</div>

<p>
Esses valores são flags. Uma flag é como uma opção de configuração que podemos ligar ou desligar.
</p>

<p>
O operador <code>|</code> combina várias flags em um único valor. Então essa linha está dizendo: "quero uma janela com <code>CS_VREDRAW</code>, <code>CS_HREDRAW</code> e <code>CS_OWNDC</code> ligados ao mesmo tempo".
</p>

<p>
<code>CS_OWNDC</code> faz com que cada janela criada a partir dessa classe tenha seu próprio <span class="underline">Device Context</span>.
</p>

<p>
O <span class="underline">Device Context</span>, ou DC, é uma estrutura que o Windows usa para guardar o estado de desenho: onde desenhar, quais configurações estão sendo usadas, qual superfície está recebendo o desenho, entre outras informações.
</p>

<p>
Sem <code>CS_OWNDC</code>, o Windows pode emprestar um DC temporário para o programa quando ele precisa desenhar e depois pegar esse DC de volta. Isso é suficiente para muitos programas comuns.
</p>

<p>
Com <code>CS_OWNDC</code>, a janela fica com um DC próprio. Para jogos, isso costuma ser útil porque desenhamos com muita frequência e queremos uma relação mais direta e estável com a superfície da janela.
</p>

<p>
Neste ponto do código, ainda estamos apenas pintando a janela com preto. Mas essa configuração prepara o terreno para os próximos passos, como criar um back buffer e atualizar a tela do jogo continuamente.
</p>
</div>
</div>
<div id="outline-container-orgb257b1a" class="outline-2">
<h2 id="orgb257b1a">Criar uma janela</h2>
<div class="outline-text-2" id="text-orgb257b1a">
<p>
Vamos criar o handle da janela antes de definir a função de callback.
</p>

<div class="org-src-container">
<pre class="src src-cpp">HWND window_handle = CreateWindowA(
    window_class.lpszClassName,
        "Game!",
        WS_OVERLAPPEDWINDOW|WS_VISIBLE,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        960,
        540,
        NULL,
        NULL,
        instance,
        NULL);

if (!window_handle) {
    printf("Failed to Create Window A\n");
    return 1;
}
</pre>
</div>

<p>
Os três parâmetros principais são o nome da classe <code>windowClass.lpszClassName</code>, o título da janela e a própria instância.
</p>

<p>
<code>CW_USEDEFAULT</code> é usado para substituir as coordenadas <code>(x, y)</code> por um valor padrão baseado na tela do usuário.
</p>

<p>
Veja a documentação para entender quais são os outros parâmetros e como usá-los, se precisar.
</p>
</div>
</div>
<div id="outline-container-org7840207" class="outline-2">
<h2 id="org7840207">Procedimento da janela</h2>
<div class="outline-text-2" id="text-org7840207">
<p>
Agora vamos ver como implementar a função de callback.
</p>

<div class="org-src-container">
<pre class="src src-cpp">LRESULT CALLBACK
main_window_callback(HWND hwnd,
                     UINT message,
                     WPARAM lparam,
                     LPARAM wparam)
{
    LRESULT result = 0;
    switch (message) {
        case WM_CREATE: {
            OutputDebugStringA("Window Created.\n");
        } break;

        case WM_PAINT: {
            PAINTSTRUCT paint;
            HDC device_handle = BeginPaint(hwnd, &amp;paint);

            LONG width  = paint.rcPaint.right - paint.rcPaint.left;
            LONG height = paint.rcPaint.bottom - paint.rcPaint.top;

            PatBlt(device_handle, 0, 0, width, height, BLACKNESS);

            EndPaint(hwnd, &amp;paint);
        } break;

        case WM_CLOSE: {
            DestroyWindow(window);
        } break;

        case WM_DESTROY: {
            PostQuitMessage(0);
        } break;

        default: {
            result = DefWindowProcA(hwnd, message, lparam, wparam);
        }
    }
    return result;
}
</pre>
</div>

<p>
O callback devolve parâmetros meio genéricos. Quero dizer: para cada situação da janela, conseguimos obter valores específicos com base nos eventos.
</p>

<p>
Esses valores ficam dentro de <code>WPARAM</code> e <code>LPARAM</code>.
</p>

<p>
No futuro vamos utilizar esses parâmetros para processar eventos de mensagens do teclado.
</p>

<blockquote>
<p>
O último parâmetro da função <code>CreateWindow</code> é um ponteiro void onde podemos definir valores e recuperá-los de <code>LPARAM</code> durante o estado <code>WM_CREATE</code>.
</p>
</blockquote>
</div>
<div id="outline-container-org033e159" class="outline-3">
<h3 id="org033e159">Entendendo o bloco WM_PAINT</h3>
<div class="outline-text-3" id="text-org033e159">
<p>
O bloco <code>WM_PAINT</code> é chamado quando o Windows entende que alguma parte da janela precisa ser desenhada novamente.
</p>

<p>
Isso pode acontecer quando a janela aparece pela primeira vez, quando ela é redimensionada, quando outra janela sai da frente dela ou quando o próprio programa pede para uma área ser redesenhada.
</p>

<p>
Pense na janela como uma folha. Se uma parte dessa folha fica "suja" ou desatualizada, o Windows marca aquela região como uma área que precisa de pintura. Depois ele envia a mensagem <code>WM_PAINT</code> para o programa.
</p>

<p>
No código, essa pintura começa com:
</p>

<div class="org-src-container">
<pre class="src src-cpp">PAINTSTRUCT paint;
HDC device_handle = BeginPaint(hwnd, &amp;paint);
</pre>
</div>

<p>
<code>PAINTSTRUCT</code> é uma struct preenchida pelo Windows com informações sobre a pintura atual. A parte mais importante aqui é <code>paint.rcPaint</code>, que informa o retângulo que precisa ser redesenhado.
</p>

<p>
<code>BeginPaint</code> avisa ao Windows: "eu vou começar a pintar a janela agora". Ela também retorna um <code>HDC</code>, que é o <span class="underline">Device Context</span> usado para desenhar.
</p>

<p>
De forma simples: o <code>HDC</code> é como se fosse a "caneta" ou a "superfície de desenho" que o Windows entrega para o programa. É por meio dele que chamamos funções de desenho.
</p>

<p>
Em seguida calculamos a largura e altura da área que precisa ser pintada:
</p>

<div class="org-src-container">
<pre class="src src-cpp">LONG width  = paint.rcPaint.right - paint.rcPaint.left;
LONG height = paint.rcPaint.bottom - paint.rcPaint.top;
</pre>
</div>

<p>
O <code>rcPaint</code> possui os limites da área inválida: esquerda, topo, direita e base. Subtraindo esses valores, descobrimos o tamanho da região que o Windows pediu para redesenhar.
</p>

<p>
Depois usamos:
</p>

<div class="org-src-container">
<pre class="src src-cpp">PatBlt(device_handle, 0, 0, width, height, BLACKNESS);
</pre>
</div>

<p>
<code>PatBlt</code> preenche uma área retangular usando uma operação de raster. Com <code>BLACKNESS</code>, estamos dizendo para o Windows preencher essa área com preto.
</p>

<p>
Ou seja, nesse exemplo, quando a janela precisa ser redesenhada, nós simplesmente pintamos a área necessária de preto.
</p>

<p>
Por fim:
</p>

<div class="org-src-container">
<pre class="src src-cpp">EndPaint(hwnd, &amp;paint);
</pre>
</div>

<p>
<code>EndPaint</code> avisa ao Windows que terminamos de pintar. Isso é importante porque o Windows limpa a marcação de "área inválida" da janela. Se chamarmos <code>BeginPaint</code>, precisamos chamar <code>EndPaint</code> no final.
</p>

<p>
Para um jogo, esse desenho dentro do <code>WM_PAINT</code> costuma ser apenas um primeiro passo. Mais adiante, normalmente vamos desenhar em um back buffer e copiar o resultado para a janela. Mas, por enquanto, pintar a janela de preto é suficiente para testar se o processo de pintura está funcionando.
</p>
</div>
</div>
</div>
<div id="outline-container-orgb6ab5bd" class="outline-2">
<h2 id="orgb6ab5bd">Processar mensagens para o game loop</h2>
<div class="outline-text-2" id="text-orgb6ab5bd">
<p>
O próximo passo é traduzir e despachar mensagens da fila de mensagens.
</p>

<p>
Essas mensagens incluem mensagens da janela, entrada do teclado, entrada do mouse e outras.
</p>

<p>
Vamos usar <code>PeekMessage</code> para recuperar mensagens da fila.
</p>

<p>
Claro, precisamos executar todo esse processo dentro de um loop principal controlado por uma variável booleana. Caso contrário, a janela vai piscar e fechar instantaneamente.
</p>

<p>
Eu declaro essa variável booleana com o nome <code>should_quit</code>.
</p>
</div>
</div>
<div id="outline-container-org1a02b9b" class="outline-2">
<h2 id="org1a02b9b">Palavra-chave static e processamento da fila de mensagens</h2>
<div class="outline-text-2" id="text-org1a02b9b">
<p>
A variável está no escopo global e é declarada com a palavra-chave <code>static</code>.
</p>

<p>
O significado de <code>static</code> varia dependendo do contexto em que aparece.
</p>

<p>
Por exemplo, se <code>static</code> é usado em uma variável de escopo local, ela se comporta como uma variável local persistente.
</p>

<p>
Quando usado em uma função, restringe a função ao arquivo da unidade de tradução. Em outras palavras, ela se torna uma função <code>internal</code>.
</p>

<p>
Vamos olhar o código:
</p>

<p>
No topo do arquivo, temos uma variável global chamada <code>should_quit</code>.
</p>

<div class="org-src-container">
<pre class="src src-cpp">static bool should_quit;
</pre>
</div>

<p>
Agora abaixo do arquivo:
</p>

<div class="org-src-container">
<pre class="src src-cpp">static void process_message_queue() {
    MSG msg;
    while(PeekMessageA(&amp;msg, NULL, 0, 0, PM_REMOVE)) {
        if (msg.message == WM_QUIT) {
            should_quit = true;
        } 
        TranslateMessage(&amp;msg);
        DispatchMessageA(&amp;msg);
    }
}
</pre>
</div>

<p>
Dentro da função principal, temos:
</p>

<div class="org-src-container">
<pre class="src src-cpp">// ...
while(!should_quit) {
    process_message_queue();
}

OutputDebugStringA("end program!\n");

return 0;
</pre>
</div>

<p>
Lendo o código, podemos observar que a função <code>PeekMessageA</code> preenche a struct <code>Message</code> para nós e, se essa struct não for zero, processamos a mensagem.
</p>

<p>
Quando o usuário clica no botão de fechar, o callback da janela lida com a mensagem <code>WM_CLOSE</code>. Dentro desse bloco, chamamos <code>DestroyWindow</code>, que por sua vez dispara <code>WM_DESTROY</code> para forçar um <code>PostQuitMessage</code>.
</p>

<p>
Como resultado, a próxima mensagem é uma mensagem <code>WM_QUIT</code>, que quebra o loop e encerra o jogo.
</p>

<p>
O passo final é adicionar a biblioteca estática <code>gdi32.lib</code> ao arquivo <code>build.bat</code>.
</p>
</div>
</div>
<div id="outline-container-orgc2ac21e" class="outline-2">
<h2 id="orgc2ac21e">Conclusão</h2>
<div class="outline-text-2" id="text-orgc2ac21e">
<p>
Para criar uma janela, precisamos determinar uma classe de janela que contém título e ícones para a janela. Ela também inclui o procedimento de callback da janela para lidar com a etapa de pintura, criação e fechamento da janela.
</p>

<p>
Depois de definir a classe da janela, precisamos registrar essa classe para usar a janela.
</p>

<p>
Agora, criamos uma janela com coordenadas, título e algumas flags para definir propriedades como bordas, visibilidade etc.
</p>

<p>
Criamos um loop principal para processar a fila de mensagens da thread atual e a fila de mensagens da janela.
</p>

<p>
Esse processo permite traduzir a tecla virtual para uma mensagem de caractere e despachar essa mensagem para o procedimento de callback da janela.
</p>

<p>
Como você pode ver abaixo, o segundo parâmetro de <b>PeekMessageA</b> deve ser nulo para que mensagens da janela e mensagens da thread sejam processadas (<code>WM_QUIT</code> é uma mensagem da thread). Caso contrário, não conseguimos fechar o programa, mesmo depois da janela ser fechada.
</p>

<p>
O próximo passo é alocar um back buffer.
</p>
</div>
</div>
<div id="outline-container-orgc54487a" class="outline-2">
<h2 id="orgc54487a">Meu acesso rápido</h2>
<div class="outline-text-2" id="text-orgc54487a">
<ul class="org-ul">
<li class="off"><input type='checkbox' /> Criar WNDCLASSA</li>
<li class="off"><input type='checkbox' /> Registrar uma classe</li>
<li class="off"><input type='checkbox' /> Criar o procedimento de callback da janela</li>
<li class="off"><input type='checkbox' /> Criar Window</li>
<li class="off"><input type='checkbox' /> Criar GameLoop</li>
<li class="off"><input type='checkbox' /> Processar a fila de eventos com Peek Message</li>
<li class="off"><input type='checkbox' /> Extra: pintar a janela inteira com PatBlit, BeginPaint e EndPaint</li>
</ul>
</div>
</div>
<div id="outline-container-org5a9aad5" class="outline-2">
<h2 id="org5a9aad5">Referências</h2>
<div class="outline-text-2" id="text-org5a9aad5">
<ul class="org-ul">
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassa">WNDCLASSA</a> - contém os atributos da classe da janela registrados pela função RegisterClass</li>
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-defwindowproca">DefWindowProcA</a> - chama o procedimento padrão da janela para fornecer o processamento padrão de qualquer mensagem que a aplicação não processa.</li>
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerclassa">RegisterClassA</a> - registra uma classe de janela para uso posterior em chamadas para CreateWindow</li>
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowa">CreateWindowA</a> - cria uma janela sobreposta, pop-up ou filha</li>
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-peekmessagea">PeekMessageA</a> - despacha mensagens recebidas que não estão na fila, verifica a fila de mensagens da thread em busca de uma mensagem postada e recupera a mensagem, se existir. Usada para operações longas.
<ul class="org-ul">
<li><b>IMPORTANTE</b>: hwnd deve ser NULL para que mensagens da janela e mensagens da thread sejam processadas.</li>
</ul></li>
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-dispatchmessage">DispatchMessageA</a> - despacha uma mensagem para um procedimento de callback da janela.</li>
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-translatemessage">TranslateMessage</a> - traduz a tecla virtual para mensagens de caractere. As mensagens de caractere são postadas na fila de mensagens da thread chamadora, para serem lidas na próxima vez que a thread chamar PeekMessage.</li>
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-destroywindow">DestroyWindow</a> - envia uma mensagem para a janela para desativá-la e remover o foco do teclado.</li>
<li><a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postquitmessage">PostQuitMessage</a> - indica ao sistema que uma thread fez uma solicitação para encerrar.</li>
</ul>
</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><category term="gamedev" /><summary type="html"><![CDATA[Table of Contents Registrar uma classe Entendendo a flag CS_OWNDC Criar uma janela Procedimento da janela Entendendo o bloco WM_PAINT Processar mensagens para o game loop Palavra-chave static e processamento da fila de mensagens Conclusão Meu acesso rápido Referências]]></summary></entry><entry><title type="html">Gerunds and Infinitives</title><link href="https://devlog.tiagoaguiar.dev/gerunds-infinitives/" rel="alternate" type="text/html" title="Gerunds and Infinitives" /><published>2026-05-19T11:09:06+00:00</published><updated>2026-05-19T11:09:06+00:00</updated><id>https://devlog.tiagoaguiar.dev/gerunds-infinitives</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/gerunds-infinitives/"><![CDATA[<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#orgd7fbe66">Gerund (-ing)</a></li>
<li><a href="#org477b3ec">Infinitive</a></li>
<li><a href="#orge48e702">Nuance</a></li>
<li><a href="#org2b406c9">Mais exemplos</a></li>
<li><a href="#org0088823">"He likes reading before bed" vs "He likes to read before bed"</a></li>
<li><a href="#orgfb48aaf">Verbos mais usados no infinitivo</a>
<ul>
<li><a href="#org7de5d7d">want to</a></li>
<li><a href="#orgd7b1c76">need to</a></li>
<li><a href="#orgb03216c">decided to</a></li>
<li><a href="#org6411cd7">hope to</a></li>
<li><a href="#orga456726">outros usados</a></li>
</ul>
</li>
<li><a href="#org1de791c">Verbos OBRIGATÓRIOS no gerundio</a>
<ul>
<li><a href="#org4920043">enjoy + verb-ing</a></li>
<li><a href="#org6404f43">avoid + verb-ing</a></li>
<li><a href="#org7593c63">finish + verb-ing</a></li>
<li><a href="#org9f3cc20">suggest + verb-ing</a></li>
<li><a href="#orgf38fed6">mind + verb-ing</a></li>
<li><a href="#orgf728c3d">keep + verb-ing</a></li>
<li><a href="#org2da807a">outros usados</a></li>
</ul>
</li>
<li><a href="#org8a021f8">Verbos que mudam o significado</a></li>
<li><a href="#org22e3ae0">Verbos com 2 significados</a>
<ul>
<li><a href="#org7b31159">Remember</a></li>
<li><a href="#org1918752">Forget</a></li>
<li><a href="#orgb251a6a">Try</a></li>
<li><a href="#org58b1278">Regret</a></li>
<li><a href="#org1320c4c">Go on</a></li>
<li><a href="#orgd5f7f5f">Mean</a></li>
<li><a href="#orga0fe791">Need</a></li>
<li><a href="#org8b8af2c">Like/Love/Hate/prefer</a></li>
<li><a href="#orgbd92e15">Start/Begin/Continue</a></li>
</ul>
</li>
<li><a href="#orgfa43dd0">Subject = Gerund</a></li>
<li><a href="#org02e1a88">Adjective + infinitive</a></li>
<li><a href="#org8a1c019">Preposition + Gerund</a></li>
<li><a href="#org14502e5">noun/pronoun + infinitive</a></li>
<li><a href="#orgf5ae172">Function</a></li>
<li><a href="#org2a0db27">Lista de verbos</a>
<ul>
<li><a href="#org202f821">Common Verbs Followed by a Gerund</a></li>
<li><a href="#org5d74de4">Common Verbs Followed by an Infinitive</a></li>
<li><a href="#org4aad087">Common Verbs Followed by a Gerund or Infinitive</a></li>
</ul>
</li>
<li><a href="#orgc4f7e40">References</a></li>
<li><a href="#org1833564">Frases comuns para meu contexto</a></li>
</ul>
</div>
</div>

<p>
Qual a diferença em usar:
</p>

<div class="org-src-container">
<pre class="src src-nil">he likes reading.
he likes to read.
</pre>
</div>
<div id="outline-container-orgd7fbe66" class="outline-2">
<h2 id="orgd7fbe66">Gerund (-ing)</h2>
<div class="outline-text-2" id="text-orgd7fbe66">
<p>
Usamos para expressar atividades, experiências, hobbies, hábitos, isto é, o foco é a atividade geral, não a ação/intenção ou escolha.
Por exemplo:
</p>

<div class="org-src-container">
<pre class="src src-nil">He likes reading before bed.
Ele gosta de ler antes de dormir.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">She likes cooking.
Ela gosta de cozinhar.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">They like swimming.
Eles gostam de nadar.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">She finished doing homework.
Ela terminou de fazer a lição.
</pre>
</div>


<p>
Uso comum: Atividades, gostos, conclusões
</p>
</div>
</div>
<div id="outline-container-org477b3ec" class="outline-2">
<h2 id="org477b3ec">Infinitive</h2>
<div class="outline-text-2" id="text-org477b3ec">
<p>
Usamos para ação/intenção ou algo mais específico de sua preferência.
</p>

<div class="org-src-container">
<pre class="src src-nil">He likes to read science fiction.
Ele gosta de ler ficção científica.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">He likes to read in silence.
Ele gosta de ler em silêncio.
</pre>
</div>

<p>
Uso comum: Planos, desejos, necessidades.
</p>
</div>
</div>
<div id="outline-container-orge48e702" class="outline-2">
<h2 id="orge48e702">Nuance</h2>
<div class="outline-text-2" id="text-orge48e702">
<p>
Mais natural para hobby/atividade:
</p>

<p>
<code>I like reading.</code>
</p>

<p>
Mais natural para preferência/comportamento:
</p>

<p>
<code>I like to read at night.</code>
</p>
</div>
</div>
<div id="outline-container-org2b406c9" class="outline-2">
<h2 id="org2b406c9">Mais exemplos</h2>
<div class="outline-text-2" id="text-org2b406c9">
<div class="org-src-container">
<pre class="src src-nil">I like coding.
Eu gosto de programar.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">He likes drawing.
Ele gosta de desenhar.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">We like traveling.
Nós gostamos de viajar.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">I enjoy reading books.
I like reading books.
Eu gosto de ler livros.
</pre>
</div>

<p>
Veja que <code>enjoy reading</code> e <code>like reading</code> pode soar igual, mas enjoy transmite um prazer mais forte, eu realmente aprecio/curto ler livros.
So mais forte, pessoal, emocional. Ou seja, enjoy realmente tem prazer, like é só uma preferência neutra, casual.
</p>

<p>
Exemplo pessoal (pra mim):
</p>

<div class="org-src-container">
<pre class="src src-nil">I enjoy coding.
I like reading books.
</pre>
</div>
</div>
</div>
<div id="outline-container-org0088823" class="outline-2">
<h2 id="org0088823">"He likes reading before bed" vs "He likes to read before bed"</h2>
<div class="outline-text-2" id="text-org0088823">
<p>
Neste exemplo o gerundio enfatiza a experiência/hábito de ler: ele gosta do hábito de leitura antes de dormir, ler antes de dormir faz parte da rotina dele = hobby.
</p>

<p>
Já no infinitive o foco é na ação: ele prefere ler antes de dormir = Ele gosta de ler antes de dormir em vez de fazer outra coisa.
</p>

<p>
Outro exemplo:
</p>

<p>
<code>I like swimming.</code> gosto da atividade.
<code>I like to swim in the morning.</code> preferência de fazer aquilo de manhã.
</p>
</div>
</div>
<div id="outline-container-orgfb48aaf" class="outline-2">
<h2 id="orgfb48aaf">Verbos mais usados no infinitivo</h2>
<div class="outline-text-2" id="text-orgfb48aaf">
</div>
<div id="outline-container-org7de5d7d" class="outline-3">
<h3 id="org7de5d7d">want to</h3>
<div class="outline-text-3" id="text-org7de5d7d">
<div class="org-src-container">
<pre class="src src-nil">I want to study English.
Quero estudar inglês.
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd7b1c76" class="outline-3">
<h3 id="orgd7b1c76">need to</h3>
<div class="outline-text-3" id="text-orgd7b1c76">
<div class="org-src-container">
<pre class="src src-nil">I need to sleep early.
Preciso dormir cedo.
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb03216c" class="outline-3">
<h3 id="orgb03216c">decided to</h3>
<div class="outline-text-3" id="text-orgb03216c">
<div class="org-src-container">
<pre class="src src-nil">She decided to travel.
Ela decidiu viajar.
</pre>
</div>
</div>
</div>
<div id="outline-container-org6411cd7" class="outline-3">
<h3 id="org6411cd7">hope to</h3>
<div class="outline-text-3" id="text-org6411cd7">
<div class="org-src-container">
<pre class="src src-nil">He hopes to learn fast.
Ele espera aprender rápido.
</pre>
</div>
</div>
</div>
<div id="outline-container-orga456726" class="outline-3">
<h3 id="orga456726">outros usados</h3>
<div class="outline-text-3" id="text-orga456726">
<p>
agree, learn, offer, plan, promise
</p>
</div>
</div>
</div>
<div id="outline-container-org1de791c" class="outline-2">
<h2 id="org1de791c">Verbos OBRIGATÓRIOS no gerundio</h2>
<div class="outline-text-2" id="text-org1de791c">
<p>
Os verbos abaixo, por mais que não expressem hábitos, experiências, hobbies ou foco na atividade geral, precisam do -ing. Como o caso do exemplo finish. <code>She finished doing homework</code> poderia soar como <code>Ela terminou de fazer a lição</code> que é uma ação, o que intuitivamente colocariamos <code>She finished to do homework</code>, mas estaria errado. Neste caso específico, esses verbos abaixo exigem que o próximo verbo fique em -<code>ing</code>.
</p>

<p>
Em outras palavras, não pode ter uma frase como <code>I enjoy to read books.</code>
</p>
</div>
<div id="outline-container-org4920043" class="outline-3">
<h3 id="org4920043">enjoy + verb-ing</h3>
<div class="outline-text-3" id="text-org4920043">
<div class="org-src-container">
<pre class="src src-nil">I enjoy reading books.
Gosto de ler livros.
</pre>
</div>
</div>
</div>
<div id="outline-container-org6404f43" class="outline-3">
<h3 id="org6404f43">avoid + verb-ing</h3>
<div class="outline-text-3" id="text-org6404f43">
<div class="org-src-container">
<pre class="src src-nil">He avoids eating fast food.
Ele evita comer fast food.
</pre>
</div>
</div>
</div>
<div id="outline-container-org7593c63" class="outline-3">
<h3 id="org7593c63">finish + verb-ing</h3>
<div class="outline-text-3" id="text-org7593c63">
<div class="org-src-container">
<pre class="src src-nil">She finished doing homework.
Ela terminou de fazer a lição.
</pre>
</div>
</div>
</div>
<div id="outline-container-org9f3cc20" class="outline-3">
<h3 id="org9f3cc20">suggest + verb-ing</h3>
<div class="outline-text-3" id="text-org9f3cc20">
<div class="org-src-container">
<pre class="src src-nil">They suggest studying more.
Eles sugerem estudar mais.
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf38fed6" class="outline-3">
<h3 id="orgf38fed6">mind + verb-ing</h3>
<div class="outline-text-3" id="text-orgf38fed6">
<div class="org-src-container">
<pre class="src src-nil">I don't mind waiting.
Eu não me importo em esperar.

She doesn’t mind working late.
Ela não se importa em trabalhar até tarde.
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf728c3d" class="outline-3">
<h3 id="orgf728c3d">keep + verb-ing</h3>
<div class="outline-text-3" id="text-orgf728c3d">
<div class="org-src-container">
<pre class="src src-nil">He keeps talking.
Ele continua falando.

She kept studying all night.
Ela continou estudando a noite toda.

They keep asking the same question.
Eles continuam perguntando a mesma coisa.
</pre>
</div>
</div>
</div>
<div id="outline-container-org2da807a" class="outline-3">
<h3 id="org2da807a">outros usados</h3>
<div class="outline-text-3" id="text-org2da807a">
<p>
consider, discuss, imagine, recommend, practice, miss, postpone, delay, quit, risk, admit, deny
</p>
</div>
</div>
</div>
<div id="outline-container-org8a021f8" class="outline-2">
<h2 id="org8a021f8">Verbos que mudam o significado</h2>
<div class="outline-text-2" id="text-org8a021f8">
<p>
O mais famoso <code>stop</code>.
</p>

<div class="org-src-container">
<pre class="src src-nil">I stopped smoking.
Parei de fumar. (abandonei o hábito)
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">I stopped to smoke.
Parei para fumar. (Interrompi algo pra fumar)
</pre>
</div>
</div>
</div>
<div id="outline-container-org22e3ae0" class="outline-2">
<h2 id="org22e3ae0">Verbos com 2 significados</h2>
<div class="outline-text-2" id="text-org22e3ae0">
</div>
<div id="outline-container-org7b31159" class="outline-3">
<h3 id="org7b31159">Remember</h3>
<div class="outline-text-3" id="text-org7b31159">
<div class="org-src-container">
<pre class="src src-nil">I remember locking the door.
Lembro de ter trancado a porta. (memória)
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">Remember to lock the door.
Lembre-se de trancar a porta. (tarefa)
</pre>
</div>
</div>
</div>
<div id="outline-container-org1918752" class="outline-3">
<h3 id="org1918752">Forget</h3>
<div class="outline-text-3" id="text-org1918752">
<div class="org-src-container">
<pre class="src src-nil">I'll never forget meeting her.
Nunca esquecerei de tê-la conhecido. (memória)
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">I forgot to meet her.
Esqueci de encontrá-la. (tarefa)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb251a6a" class="outline-3">
<h3 id="orgb251a6a">Try</h3>
<div class="outline-text-3" id="text-orgb251a6a">
<div class="org-src-container">
<pre class="src src-nil">Try calling him. (experimento/teste)
Tente ligar para ele.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">Try to call him. (fazer esforço)
Tente ligar para ele.
</pre>
</div>
</div>
</div>
<div id="outline-container-org58b1278" class="outline-3">
<h3 id="org58b1278">Regret</h3>
<div class="outline-text-3" id="text-org58b1278">
<div class="org-src-container">
<pre class="src src-nil">I regret telling you (arrepender do passado)
Me arrependo de ter te contado.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">I regret to inform you (lamentar anunciar/formal)
Lamento informar.
</pre>
</div>
</div>
</div>
<div id="outline-container-org1320c4c" class="outline-3">
<h3 id="org1320c4c">Go on</h3>
<div class="outline-text-3" id="text-org1320c4c">
<div class="org-src-container">
<pre class="src src-nil">He went on talking (fazendo a mesma coisa)
Ele continou falando.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">He went on to talk about politics (passar fazer algo diferente)
Ele passou a falar sobre política.
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd5f7f5f" class="outline-3">
<h3 id="orgd5f7f5f">Mean</h3>
<div class="outline-text-3" id="text-orgd5f7f5f">
<div class="org-src-container">
<pre class="src src-nil">This means studying hard (significar)
Isso significa estudar muito.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">I didn't mean to hurt you (ter intenção de)
Não tive intenção de machucar.
</pre>
</div>
</div>
</div>
<div id="outline-container-orga0fe791" class="outline-3">
<h3 id="orga0fe791">Need</h3>
<div class="outline-text-3" id="text-orga0fe791">
<div class="org-src-container">
<pre class="src src-nil">The house needs painting (algo precisa ser feito(
A casa precisa ser pintada.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">I need to paint the house (alguém precisa fazer algo)
Preciso pintar a casa.
</pre>
</div>
</div>
</div>
<div id="outline-container-org8b8af2c" class="outline-3">
<h3 id="org8b8af2c">Like/Love/Hate/prefer</h3>
<div class="outline-text-3" id="text-org8b8af2c">
<div class="org-src-container">
<pre class="src src-nil">I like dancing (gostar da atividade, habito)
Gosto de dançar
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">I like to dance tonight (ocasião especifica)
Gosto de dançar hoje à noite.
</pre>
</div>
</div>
</div>
<div id="outline-container-orgbd92e15" class="outline-3">
<h3 id="orgbd92e15">Start/Begin/Continue</h3>
<div class="outline-text-3" id="text-orgbd92e15">
<div class="org-src-container">
<pre class="src src-nil">She started studying (iniciar/continuar ação)
Ela começou a estudar.
</pre>
</div>

<div class="org-src-container">
<pre class="src src-nil">She started to study (mesmo significado)
Ela começou a estudar.
</pre>
</div>

<p>
Pequena diferença de nuance: <code>She started studying.</code> soa mais natural na conversa e mais focado no processo -&gt; "ela entrou na atividade de estudar", enquanto <code>She started to study.</code> soa mais formal e mais focado na decisão -&gt; "ela começou a estudar".
</p>

<p>
-ing: a atividade/processo importa mais.
to + verb: existe intenção, decisão ou mudança de ação.
</p>
</div>
</div>
</div>
<div id="outline-container-orgfa43dd0" class="outline-2">
<h2 id="orgfa43dd0">Subject = Gerund</h2>
<div class="outline-text-2" id="text-orgfa43dd0">
<p>
<code>Gardering</code> is my favorite hobby.
<code>Meeting</code> new people isn't always easy.
<code>Reading</code> helps me relax.
<code>Singing always cheers me up.</code>
</p>
</div>
</div>
<div id="outline-container-org02e1a88" class="outline-2">
<h2 id="org02e1a88">Adjective + infinitive</h2>
<div class="outline-text-2" id="text-org02e1a88">
<p>
Depois de um adjetivo, geralmente usamos um verbo no infinitivo.
</p>

<p>
I was <code>sad to see</code> my test score.
Is it <code>difficult to make</code> a cake?
</p>
</div>
</div>
<div id="outline-container-org8a1c019" class="outline-2">
<h2 id="org8a1c019">Preposition + Gerund</h2>
<div class="outline-text-2" id="text-org8a1c019">
<p>
I tought <code>about taking</code> piano lessons.
Did you plan <code>on calling</code> me back?
</p>
</div>
</div>
<div id="outline-container-org14502e5" class="outline-2">
<h2 id="org14502e5">noun/pronoun + infinitive</h2>
<div class="outline-text-2" id="text-org14502e5">
<p>
The librarian told the <code>students to be</code> quiet.
We asked <code>them to go</code> to the beach with us.
</p>
</div>
</div>
<div id="outline-container-orgf5ae172" class="outline-2">
<h2 id="orgf5ae172">Function</h2>
<div class="outline-text-2" id="text-orgf5ae172">
<p>
Os gerúndios e infinitivos combinam o significado de ação de um verbo com a função gramatical de um substantivo. Eles atuam como substantivos (sujeitos e objetos) em uma frase.
</p>

<div class="org-src-container">
<pre class="src src-nil">Speaking in front of a crowd can be scary.
Falar na frente de uma multidão pode ser assustador.
</pre>
</div>

<p>
<code>Speaking</code> vem do verbo speak, mantém ideia de ação mas está funcionando como substantivo porque está na posição de sujeito. Isto é, o sujeito da frase é speaking in front of a crowd. E o verbo principal é o can be, e scary é o adjetivo.
</p>


<div class="org-src-container">
<pre class="src src-nil">Do you want to come with us?
Você quer vir conosco?
</pre>
</div>

<p>
Sujeito = you
verbo principal = want
objeto = to come with us
</p>

<p>
to come funciona como substantivo p orque ele é a "coisa desejada".
</p>

<p>
Gerunds e infinitives parecem verbos no significado, mas se comportam como substantivos na frase.
</p>
</div>
</div>
<div id="outline-container-org2a0db27" class="outline-2">
<h2 id="org2a0db27">Lista de verbos</h2>
<div class="outline-text-2" id="text-org2a0db27">
</div>
<div id="outline-container-org202f821" class="outline-3">
<h3 id="org202f821">Common Verbs Followed by a Gerund</h3>
<div class="outline-text-3" id="text-org202f821">
<ul class="org-ul">
<li>admit</li>
<li>advise</li>
<li>appreciate</li>
<li>avoid</li>
<li>complete</li>
<li>consider</li>
<li>deny</li>
<li>discuss</li>
<li>dislike</li>
<li>enjoy</li>
<li>finish</li>
<li>imagine</li>
<li>keep</li>
<li>mention</li>
<li>mind</li>
<li>miss</li>
<li>practice</li>
<li>quit</li>
<li>recommend</li>
<li>suggest</li>
</ul>
</div>
</div>
<div id="outline-container-org5d74de4" class="outline-3">
<h3 id="org5d74de4">Common Verbs Followed by an Infinitive</h3>
<div class="outline-text-3" id="text-org5d74de4">
<ul class="org-ul">
<li>afford</li>
<li>agree</li>
<li>appear</li>
<li>ask</li>
<li>decide</li>
<li>expect</li>
<li>hope</li>
<li>intend</li>
<li>learn</li>
<li>mean</li>
<li>need</li>
<li>offer</li>
<li>plan</li>
<li>prepare</li>
<li>promise</li>
<li>refuse</li>
<li>seem</li>
<li>volunteer</li>
<li>wait</li>
<li>want</li>
</ul>
</div>
</div>
<div id="outline-container-org4aad087" class="outline-3">
<h3 id="org4aad087">Common Verbs Followed by a Gerund or Infinitive</h3>
<div class="outline-text-3" id="text-org4aad087">
<ul class="org-ul">
<li>begin</li>
<li>continue</li>
<li>hate</li>
<li>like</li>
<li>love</li>
<li>prefer</li>
<li>start</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-orgc4f7e40" class="outline-2">
<h2 id="orgc4f7e40">References</h2>
<div class="outline-text-2" id="text-orgc4f7e40">

<div id="org21c525d" class="figure">
<p><img src="../assets/elli-gerunds.png" alt="elli-gerunds.png" />
</p>
</div>


<div id="org133aba8" class="figure">
<p><img src="../assets/elli-infinitive.png" alt="elli-infinitive.png" />
</p>
</div>
</div>
</div>
<div id="outline-container-org1833564" class="outline-2">
<h2 id="org1833564">Frases comuns para meu contexto</h2>
<div class="outline-text-2" id="text-org1833564">
<div class="org-src-container">
<pre class="src src-nil">I enjoy watching horror movies because they have a lot of cinematic scenes.
I like playing puzzle games because they are really fun, help me think better, and challenge my brain.
I hate cleaning my home office because it gets dirty again very quickly.
</pre>
</div>
</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><category term="english" /><summary type="html"><![CDATA[Table of Contents Gerund (-ing) Infinitive Nuance Mais exemplos "He likes reading before bed" vs "He likes to read before bed" Verbos mais usados no infinitivo want to need to decided to hope to outros usados Verbos OBRIGATÓRIOS no gerundio enjoy + verb-ing avoid + verb-ing finish + verb-ing suggest + verb-ing mind + verb-ing keep + verb-ing outros usados Verbos que mudam o significado Verbos com 2 significados Remember Forget Try Regret Go on Mean Need Like/Love/Hate/prefer Start/Begin/Continue Subject = Gerund Adjective + infinitive Preposition + Gerund noun/pronoun + infinitive Function Lista de verbos Common Verbs Followed by a Gerund Common Verbs Followed by an Infinitive Common Verbs Followed by a Gerund or Infinitive References Frases comuns para meu contexto]]></summary></entry><entry><title type="html">Porque Você Não Consegue Emprego de Programador</title><link href="https://devlog.tiagoaguiar.dev/emprego-programador-2026/" rel="alternate" type="text/html" title="Porque Você Não Consegue Emprego de Programador" /><published>2026-05-12T13:00:00+00:00</published><updated>2026-05-12T13:00:00+00:00</updated><id>https://devlog.tiagoaguiar.dev/emprego-programador-2026</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/emprego-programador-2026/"><![CDATA[<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org1e71ab7">Um Dado Que Parece Contraditório</a></li>
<li><a href="#orgb93ce78">A Armadilha Clássica</a></li>
<li><a href="#org5d133b1">Problema 1: Vagas Júnior Que Não São Júnior de Verdade</a></li>
<li><a href="#orged1ebb4">Problema 2: Tutorial Hell</a></li>
<li><a href="#orgf4c0e53">Problema 3: Falta de Network</a></li>
<li><a href="#org518b047">O Que o Recrutador Vê em 30 Segundos</a></li>
<li><a href="#orgd02f55f">Solução 1: Saia do Tutorial Hell com Projetos Reais</a></li>
<li><a href="#org0a7b2df">Solução 2: Domine o Ecossistema Certo</a></li>
<li><a href="#orgc3485fd">Solução 3: Mentalidade Analítica e Soft Skills</a></li>
<li><a href="#orgf436563">Solução 4: Inglês e o Mercado Internacional</a></li>
<li><a href="#orgf633440">Como Construir Network do Zero</a></li>
<li><a href="#orgebb363b">Como Montar um Portfólio Que Chama Atenção</a></li>
<li><a href="#org4f4820c">O Problema Não é a Falta de Vaga</a></li>
</ul>
</div>
</div>


<p>
Você se dedicou meses aprendendo a programar, enviou o currículo para mais de 100 vagas e sabe quantas entrevistas vieram? Nenhuma. Zero.
</p>

<p>
E o pior: quando você abre a internet, aparece gente de todo lado falando que a área de TI é uma das maiores oportunidades do mundo, que programador é a profissão do futuro, que nunca houve tanto espaço para entrar na área.
</p>

<p>
Mas na vida real você estuda, aplica e manda currículo sem parar, e nada acontece. Você começa a duvidar de si mesmo. Será que não tenho talento? Será que escolhi a área errada? Será que é tarde demais?
</p>

<p>
Não é nada disso.
</p>

<p>
Hoje eu quero compartilhar o que realmente pode estar acontecendo com você, e mais importante: o que você pode fazer para mudar esse cenário de verdade.
</p>
<div id="outline-container-org1e71ab7" class="outline-2">
<h2 id="org1e71ab7">Um Dado Que Parece Contraditório</h2>
<div class="outline-text-2" id="text-org1e71ab7">
<p>
Segundo uma pesquisa da <a href="https://forbes.com.br/carreira/2026/03/quase-7-em-cada-10-empresas-no-brasil-vao-aumentar-contratacoes-de-tecnologia-em-2026/">Forbes</a>, <b>68% das empresas no Brasil planejam aumentar as contratações de tecnologia em 2026</b>.
</p>

<p>
Rachel Garcia, líder de talentos da Century na América Latina, disse o seguinte:
</p>

<blockquote>
<p>
Praticamente todas as áreas terão que contratar e desenvolver mais gente para lidar com dados e inteligência artificial. Sem profissionais preparados para desenhar, integrar, operar e evoluir soluções de automação e digitalização de processos com qualidade, os ganhos de produtividade não vão se sustentar.
</p>
</blockquote>

<p>
Ou seja, as vagas existem. E em quantidade.
</p>

<p>
Então por que você se candidata e não recebe resposta?
</p>

<p>
A resposta é simples, mas dói ouvir: faltam devs qualificados. Há um excesso de iniciantes sem preparo suficiente para o que o mercado exige hoje. O problema não está na demanda. Está na oferta. Tem muita gente tentando entrar ao mesmo tempo, mas pouca gente chegando preparada do jeito que as empresas precisam.
</p>

<p>
Isso cria uma situação paradoxal: empresas com vagas abertas há meses sem conseguir preencher, e desenvolvedores mandando currículo sem conseguir resposta. Os dois lados frustrados, mas por razões completamente diferentes.
</p>
</div>
</div>
<div id="outline-container-orgb93ce78" class="outline-2">
<h2 id="orgb93ce78">A Armadilha Clássica</h2>
<div class="outline-text-2" id="text-orgb93ce78">
<p>
Isso cria um ciclo vicioso que paralisa muita gente.
</p>

<p>
Sem experiência, ninguém te chama. E se ninguém te chama, você não ganha experiência.
</p>

<p>
E por que isso ficou tão difícil? Porque <b>a linha de corte ficou muito mais rígida nos últimos anos</b>.
</p>

<p>
Lá por 2017, 2018, 2019, se você soubesse o básico de Kotlin, conseguia uma vaga Android. A empresa te contratava e ensinava o restante internamente. Esse mercado existiu de verdade, e eu vi isso acontecer com vários alunos e conhecidos que entraram na área nessa época sem precisar de muito mais do que vontade e um conhecimento inicial sólido.
</p>

<p>
Mas aí veio 2020 e 2021, e o setor forçou contratações em massa. Muita empresa contratando rápido e sem filtro rigoroso, porque precisava crescer. Em seguida, 2022 e 2023 trouxeram as demissões em lote das bigtechs como Amazon, Meta e Google. Dezenas de milhares de devs experientes jogados no mercado ao mesmo tempo. A régua subiu muito. Saber o básico hoje é o mínimo, e ele não te destaca mais.
</p>

<p>
O que era nível pleno virou requisito de entrada. O que era diferencial virou obrigação. E quem não percebeu essa mudança continua tentando entrar com o padrão de 2019 num mercado de 2026.
</p>

<p>
Com isso, surgiram três problemas que provavelmente estão te afetando agora.
</p>
</div>
</div>
<div id="outline-container-org5d133b1" class="outline-2">
<h2 id="org5d133b1">Problema 1: Vagas Júnior Que Não São Júnior de Verdade</h2>
<div class="outline-text-2" id="text-org5d133b1">
<p>
A descrição da vaga pede Kotlin, Jetpack Compose, arquitetura MVVM, integração com API REST, Firebase e ainda inglês.
</p>

<p>
Isso não é exagero. É o que o mercado espera de um júnior hoje.
</p>

<p>
Vou te dar um exemplo real de requisitos que aparecem em vagas "júnior" de Android no Brasil agora:
</p>

<ul class="org-ul">
<li>Experiência com Kotlin e corrotinas</li>
<li>Conhecimento de Jetpack Compose</li>
<li>Entendimento de arquitetura MVVM ou MVI</li>
<li>Familiaridade com injeção de dependências (Hilt ou Koin)</li>
<li>Consumo de APIs REST com Retrofit</li>
<li>Versionamento com Git</li>
<li>Inglês para leitura de documentação</li>
</ul>

<p>
E em alguns casos ainda adicionam: testes unitários, CI/CD, Firebase, publicação na Play Store.
</p>

<p>
Isso é o que chamam de vaga júnior. Não é uma vaga para quem está aprendendo. É uma vaga para quem já aprendeu um volume considerável de coisa e consegue trabalhar com autonomia mínima desde o primeiro dia.
</p>

<p>
As empresas recebem centenas de candidatos por vaga. O recrutador não tem tempo de ler currículo por currículo com atenção. Quem não apresenta um pacote completo de conhecimento simplesmente é descartado antes mesmo de chegar na entrevista. Às vezes de forma automatizada, por palavras-chave que o sistema de triagem não encontrou no seu currículo.
</p>

<p>
Não é pessoal. É volume.
</p>
</div>
</div>
<div id="outline-container-orged1ebb4" class="outline-2">
<h2 id="orged1ebb4">Problema 2: Tutorial Hell</h2>
<div class="outline-text-2" id="text-orged1ebb4">
<p>
O segundo problema é que você sabe copiar código, mas não sabe programar de verdade. E isso não te destaca.
</p>

<p>
Você termina um curso de Kotlin. Depois faz um de Jetpack Compose. Depois acha um tutorial de MVVM no YouTube. Depois começa outro curso porque esse parecia mais completo. No final, não consegue criar nada do zero, sozinho, sem seguir um passo a passo.
</p>

<p>
Na programação, isso tem nome: <b>tutorial hell</b>, o inferno dos tutoriais.
</p>

<p>
O que acontece psicologicamente é o seguinte: enquanto você assiste a aula, tudo parece fazer sentido. O instrutor digita, o código funciona, você entende a lógica. Você sente que está aprendendo. Dá aquela sensação boa de progresso.
</p>

<p>
Mas aí você fecha o vídeo, abre o Android Studio numa tela em branco e trava.
</p>

<p>
Você não sabe por onde começar. Não sabe quais arquivos criar. Não sabe como estruturar o projeto. A sensação de entendimento que você tinha era real, mas era entendimento do que o instrutor estava fazendo, não da capacidade de fazer sozinho.
</p>

<p>
Isso tem um nome científico também: <b>ilusão de competência</b>. Você confunde reconhecimento com capacidade de execução. São coisas completamente diferentes.
</p>

<p>
O mercado quer alguém que saiba resolver problemas. Assistir tutoriais e resolver problemas são coisas completamente diferentes. Na entrevista técnica, ninguém vai pedir para você assistir uma aula e repetir o que o professor fez. Vão te dar um problema e pedir para você resolver.
</p>
</div>
</div>
<div id="outline-container-orgf4c0e53" class="outline-2">
<h2 id="orgf4c0e53">Problema 3: Falta de Network</h2>
<div class="outline-text-2" id="text-orgf4c0e53">
<p>
A maioria das vagas nunca chega a ser publicada. As empresas contratam muito por indicação.
</p>

<p>
Quando você manda currículo pelo LinkedIn, você entra na fila disputando atenção na camada mais superficial do processo. Você compete com centenas de pessoas sem nenhuma vantagem além do papel.
</p>

<p>
Quem já tem conexões dentro da empresa chega antes mesmo da vaga existir. O dev que faz parte da comunidade, que já interagiu com aquele tech lead no GitHub ou no Discord, que apareceu no radar de alguém da empresa, tem uma vantagem enorme sobre quem manda currículo frio para o e-mail de RH.
</p>

<p>
Não é injusto. É como o mundo funciona. Em todas as áreas, não só em tecnologia.
</p>

<p>
O problema é que a maioria das pessoas que estão aprendendo a programar ficam 100% focadas no técnico e ignoram completamente a construção de presença. Estudam sozinhas, sem interagir com comunidade, sem mostrar o que estão construindo, sem aparecer em nenhum lugar que as pessoas da área frequentam.
</p>
</div>
</div>
<div id="outline-container-org518b047" class="outline-2">
<h2 id="org518b047">O Que o Recrutador Vê em 30 Segundos</h2>
<div class="outline-text-2" id="text-org518b047">
<p>
Antes de falar das soluções, preciso te contar uma coisa sobre como funciona o processo seletivo na prática.
</p>

<p>
Um recrutador em uma empresa de médio porte pode receber de 200 a 500 currículos para uma vaga. O tempo dedicado a cada currículo na triagem inicial é, em média, de 7 a 30 segundos.
</p>

<p>
Nesse tempo, ele vai olhar para três coisas:
</p>

<ul class="org-ul">
<li>Você tem os projetos e tecnologias que a vaga pede no currículo?</li>
<li>Tem algo no GitHub ou portfólio que mostre código funcionando?</li>
<li>O currículo é legível, objetivo e sem informação irrelevante?</li>
</ul>

<p>
Se qualquer uma dessas três perguntas tiver resposta negativa, seu currículo vai para o descarte. Sem leitura aprofundada, sem chance de explicar no telefone, sem nada.
</p>

<p>
Isso muda completamente o que você precisa focar. Não adianta ter estudado muito se isso não estiver visível e comprovável de forma imediata no seu currículo e no seu GitHub.
</p>
</div>
</div>
<div id="outline-container-orgd02f55f" class="outline-2">
<h2 id="orgd02f55f">Solução 1: Saia do Tutorial Hell com Projetos Reais</h2>
<div class="outline-text-2" id="text-orgd02f55f">
<p>
O tutorial é uma ferramenta boa, mas você provavelmente não está usando ele da melhor forma.
</p>

<p>
O passo que falta é este: <b>pare de acumular cursos e comece a construir algo real com o que você já aprendeu</b>.
</p>

<p>
Não precisa ser nada complexo. Um app de agendamento de barbearia. Um sistema de controle de estoque para uma loja. Um gerenciador de tarefas pessoais. Um app de acompanhamento de gastos. Qualquer coisa que resolva um problema real e que obrigue você a tomar decisões técnicas sozinho.
</p>

<p>
O ponto mais importante é sair da posição passiva de quem assiste e entrar na posição ativa de quem constrói.
</p>

<blockquote>
<p>
Você não precisa de carteira assinada para ter experiência. Você constrói algo que funciona, resolve um problema real e toma decisões técnicas. Isso sim é experiência.
</p>
</blockquote>

<p>
A diferença entre um projeto de tutorial e um projeto de portfólio é essa: no tutorial, você seguiu as instruções de outra pessoa. No projeto próprio, você encarou um problema, tomou decisões de arquitetura, resolveu bugs sem ter a resposta pronta, e fez funcionar. Isso é o que o entrevistador quer ver.
</p>

<p>
Quando você constrói algo do zero, inevitavelmente vai esbarrar em situações que o tutorial não cobriu. E é exatamente nesses momentos que você aprende de verdade: como ler a documentação oficial, como pesquisar erros no Stack Overflow, como entender a mensagem de erro e inferir a solução. Essa capacidade de resolver problemas sem depender de alguém é o que o mercado paga.
</p>

<p>
Para sair do tutorial hell de vez, você precisa de um treinamento que te faça praticar desde o início, não só assistir aulas. Por isso eu criei minhas formações de <a href="https://tiagoaguiar.dev/android-compose?utm_source=blog&amp;utm_medium=artigo&amp;utm_term=por-que-nao-consigo-emprego">Android</a> e <a href="https://tiagoaguiar.dev/ios-developer?utm_source=blog&amp;utm_medium=artigo&amp;utm_term=por-que-nao-consigo-emprego">iOS</a>, com dezenas de módulos, centenas de aulas práticas e projetos reais que vão do zero à publicação na loja.
</p>
</div>
</div>
<div id="outline-container-org0a7b2df" class="outline-2">
<h2 id="org0a7b2df">Solução 2: Domine o Ecossistema Certo</h2>
<div class="outline-text-2" id="text-org0a7b2df">
<p>
Tem gente desperdiçando meses em tecnologias que quase ninguém usa no mercado.
</p>

<p>
Kotlin lidera o volume de vagas Android. Swift ainda domina o iOS. Mas a linguagem sozinha não basta, e é aqui que a maioria das pessoas erra a estratégia de estudo: para em saber a sintaxe da linguagem e acha que está pronto para se candidatar.
</p>

<p>
O mercado quer quem sabe trabalhar com o ecossistema completo. Para Android, isso significa:
</p>

<ul class="org-ul">
<li><b>Jetpack Compose</b> para construção de interfaces declarativas</li>
<li><b>Arquitetura MVVM</b> para separar responsabilidades e manter o código testável</li>
<li><b>Hilt ou Koin</b> para injeção de dependências</li>
<li><b>Retrofit</b> para consumo de APIs REST</li>
<li><b>Room</b> para persistência de dados local</li>
<li><b>Coroutines e Flow</b> para operações assíncronas</li>
<li><b>Git</b> para versionamento, porque trabalho em equipe exige isso</li>
<li><b>Publicação na Play Store</b>, porque mostra que você vai até o fim</li>
</ul>

<p>
Para iOS, o equivalente é Swift com SwiftUI, arquitetura MVVM ou Clean Architecture, Combine ou async/await, URLSession ou Alamofire para APIs, CoreData ou SwiftData para persistência local e publicação na App Store.
</p>

<p>
O que eu aconselho é escolher uma dessas plataformas, ir fundo, e dominar esse conjunto de ferramentas de verdade antes de tentar diversificar. Profundidade numa área vale muito mais do que superficialidade em várias.
</p>
</div>
</div>
<div id="outline-container-orgc3485fd" class="outline-2">
<h2 id="orgc3485fd">Solução 3: Mentalidade Analítica e Soft Skills</h2>
<div class="outline-text-2" id="text-orgc3485fd">
<p>
O que as empresas mais buscam hoje não é só quem sabe programar. É quem sabe <b>pensar</b>.
</p>

<p>
Na prática, o problema chega como uma regra de negócio: o cliente precisa de X. A sua função é traduzir isso em código pensando no impacto para o negócio. Mas entre o pedido do cliente e a linha de código existe um gap enorme, e preencher esse gap é o que diferencia um dev que só executa de um dev que resolve problemas.
</p>

<p>
Treine isso nos seus projetos com uma prática simples: antes de abrir o editor de código, escreva num papel ou num arquivo de texto:
</p>

<ul class="org-ul">
<li>Qual problema este app resolve?</li>
<li>Quem é o usuário que vai usar isso?</li>
<li>O que ele precisa conseguir fazer em menos de 3 cliques?</li>
<li>Qual seria o fluxo mais simples possível para resolver esse problema?</li>
</ul>

<p>
Isso muda completamente a qualidade do que você vai construir. E muda a qualidade das respostas que você dá numa entrevista quando o recrutador pergunta: "me conta um projeto que você fez e qual problema ele resolvia".
</p>

<p>
A maioria dos candidatos responde com tecnologia: "fiz um app com Retrofit e MVVM". O candidato que se destaca responde com problema e solução: "criei um app para uma barbearia que perdia clientes por falta de agendamento organizado, e desenvolvi um sistema que permite ao cliente agendar pelo celular em menos de um minuto".
</p>

<p>
Pare de pensar só como desenvolvedor. <b>Pense como dono do produto.</b>
</p>
</div>
</div>
<div id="outline-container-orgf436563" class="outline-2">
<h2 id="orgf436563">Solução 4: Inglês e o Mercado Internacional</h2>
<div class="outline-text-2" id="text-orgf436563">
<p>
Essa solução pode mudar bastante seu jogo financeiro, e ela é mais acessível do que a maioria das pessoas imagina.
</p>

<p>
Um dev Android ou iOS com inglês consegue trabalhar para empresas nos Estados Unidos e na Europa sem sair de casa. Plataformas como Toptal, Turing, Contra e Arc têm projetos mobile pagando em dólar o tempo todo. A diferença salarial entre um dev que atende só o mercado brasileiro e um que atende o mercado internacional pode ser de 3x a 5x, dependendo da senioridade e da empresa.
</p>

<p>
Além disso, a maioria das documentações oficiais do Android e do iOS, os fóruns técnicos, as conferências e os conteúdos mais aprofundados estão em inglês. Quem não entende inglês técnico sempre fica um passo atrás, porque vai depender de alguém que já leu a fonte original e traduziu, com todos os filtros e atrasos que isso implica.
</p>

<p>
E você não precisa ser fluente. Comece pelo inglês técnico com materiais que você já usa:
</p>

<ul class="org-ul">
<li>Documentação oficial em developers.android.com e developer.apple.com</li>
<li>Stack Overflow</li>
<li>Vídeos e canais em inglês no YouTube sobre Android e iOS</li>
<li>Servidores no Discord da comunidade de desenvolvimento mobile</li>
<li>Changelog das releases do Kotlin, Swift e das ferramentas que você usa</li>
</ul>

<p>
Com 30 minutos por dia dedicados ao inglês técnico, em seis meses você já consegue ler documentação sem dificuldade. Em um ano, consegue participar de entrevistas em inglês. A diferença salarial vai aparecer mais rápido do que você imagina.
</p>
</div>
</div>
<div id="outline-container-orgf633440" class="outline-2">
<h2 id="orgf633440">Como Construir Network do Zero</h2>
<div class="outline-text-2" id="text-orgf633440">
<p>
Voltando ao terceiro problema: a falta de network.
</p>

<p>
A boa notícia é que nunca foi tão fácil construir presença e conexões genuínas na área de tecnologia como é hoje, sem precisar de uma empresa, de um evento físico ou de qualquer investimento financeiro.
</p>

<p>
O que funciona na prática:
</p>

<p>
<b>GitHub ativo</b>. Coloque seus projetos no GitHub, mesmo que sejam simples. Um perfil com projetos commitados regularmente mostra que você está trabalhando, evoluindo e tem código para mostrar. Um perfil vazio ou com apenas um repositório diz o contrário.
</p>

<p>
<b>LinkedIn com conteúdo</b>. Você não precisa postar todo dia. Mas postar uma vez por semana sobre o que você está aprendendo ou construindo te coloca no radar de pessoas da área. Recrutadores monitoram perfis que produzem conteúdo. É diferente de mandar candidatura fria.
</p>

<p>
<b>Comunidades no Discord e Telegram</b>. Existem servidores dedicados a desenvolvimento Android, iOS e mobile em geral com milhares de devs ativos. Participar, tirar dúvidas, responder dúvidas dos outros te constrói reputação ao longo do tempo. Pessoas que te conhecem numa comunidade podem te indicar para uma vaga que nem chegou a ser publicada.
</p>

<p>
<b>Comentar e contribuir</b>. Quando você aprende algo novo a partir de um artigo ou vídeo, comentar com uma observação genuína ou uma dúvida real gera visibilidade e começa relacionamentos. Isso funciona no YouTube, no LinkedIn e no próprio GitHub.
</p>

<p>
Network não é distribuir cartão de visita digital. É aparecer consistentemente em lugares onde as pessoas da sua área estão, agregar valor com o que você sabe e pedir ajuda com o que ainda não sabe. As indicações vêm naturalmente depois disso.
</p>
</div>
</div>
<div id="outline-container-orgebb363b" class="outline-2">
<h2 id="orgebb363b">Como Montar um Portfólio Que Chama Atenção</h2>
<div class="outline-text-2" id="text-orgebb363b">
<p>
O portfólio é o que transforma todo o esforço das soluções anteriores em algo que o recrutador consegue avaliar em 30 segundos.
</p>

<p>
Não precisa de um site elaborado, embora ter um seja um diferencial. O que realmente importa é o GitHub bem organizado com projetos que mostram domínio do ecossistema que você escolheu.
</p>

<p>
Para cada projeto no seu portfólio, você precisa de:
</p>

<p>
<b>README completo</b>. Descreva o que o app faz, qual problema ele resolve, quais tecnologias você usou e por que escolheu cada uma. Coloque screenshots ou um GIF mostrando o app funcionando. Isso mostra que você pensa além do código, que consegue comunicar o que construiu.
</p>

<p>
<b>Arquitetura visível</b>. Organize o projeto em camadas claras (data, domain, presentation). Quem abre o repositório precisa entender a estrutura em menos de um minuto. Um projeto organizado comunica que você entende de boas práticas, mesmo sem ler uma linha de código.
</p>

<p>
<b>Histórico de commits coerente</b>. Commits com mensagens como "fix" ou "update" não dizem nada. Commits com mensagens como "add Room database for offline caching" ou "refactor ViewModel to use StateFlow instead of LiveData" mostram que você entende o que está fazendo e por quê.
</p>

<p>
<b>App publicado quando possível</b>. Um link para o app na Play Store ou App Store no README é um diferencial enorme. Mostra que você foi até o fim, que o projeto é real e que você sabe como funciona o processo completo de publicação.
</p>

<p>
Dois ou três projetos bem feitos valem muito mais do que dez projetos abandonados ou clones de tutorial sem nenhuma personalização.
</p>
</div>
</div>
<div id="outline-container-org4f4820c" class="outline-2">
<h2 id="org4f4820c">O Problema Não é a Falta de Vaga</h2>
<div class="outline-text-2" id="text-org4f4820c">
<p>
O mercado não está fácil, é fato. Mas os dados mostram que as vagas existem e em quantidade.
</p>

<p>
O que falta não é oferta de emprego. O que falta são profissionais que chegam preparados do jeito certo, com projetos reais para mostrar, com o ecossistema dominado, com alguma presença na comunidade e com capacidade de resolver problemas de forma independente.
</p>

<p>
A linha de corte mudou, infelizmente. Mas quem entende isso e age de acordo sai na frente de 90% dos concorrentes, porque a maioria ainda está tentando entrar no mercado com a estratégia de 2019.
</p>

<p>
Se você seguir os caminhos que apresentei aqui, vai estar muito mais perto da sua primeira vaga como dev do que a maioria dos candidatos que manda currículo todo dia sem nenhuma estratégia:
</p>

<ul class="org-ul">
<li>Construa projetos reais que resolvem problemas reais</li>
<li>Domine o ecossistema completo da plataforma que escolheu</li>
<li>Pense como dono do produto, não só como executor de código</li>
<li>Invista no inglês técnico de forma consistente</li>
<li>Apareça na comunidade e construa presença ao longo do tempo</li>
<li>Monte um portfólio que fala por você antes da entrevista acontecer</li>
</ul>

<p>
Conseguir a primeira vaga como dev não vai ser simples. Mas é totalmente possível, e tem acontecido com pessoas que saíram do zero e seguiram um caminho estruturado e consistente.
</p>

<p>
O problema nunca foi falta de vaga. Foi falta de preparo que chegasse ao nível que o mercado passou a exigir.
</p>

<hr />

<p>
<i>Se quiser um caminho estruturado para dominar Android ou iOS com projetos reais do zero à publicação na loja, conheça meus treinamentos de <a href="https://tiagoaguiar.dev/android-compose?utm_source=blog&amp;utm_medium=artigo&amp;utm_term=por-que-nao-consigo-emprego">Android</a> e <a href="https://tiagoaguiar.dev/ios-developer?utm_source=blog&amp;utm_medium=artigo&amp;utm_term=por-que-nao-consigo-emprego">iOS</a>. São as formações que eu criaria para mim mesmo se estivesse começando hoje.</i>
</p>


<a href="//tiagoaguiar.dev/android-compose?utm_campaign=ac&utm_source=blog&utm_medium=article&utm_term=emprego-programador-2026"><img style="border: solid 1px #0dcaf0;" src="https://cdn.tiagoaguiar.dev/blog/img/blog-banner-android-compose.jpg" class="" /></a>


</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><category term="carreira" /><category term="dev" /><summary type="html"><![CDATA[Table of Contents Um Dado Que Parece Contraditório A Armadilha Clássica Problema 1: Vagas Júnior Que Não São Júnior de Verdade Problema 2: Tutorial Hell Problema 3: Falta de Network O Que o Recrutador Vê em 30 Segundos Solução 1: Saia do Tutorial Hell com Projetos Reais Solução 2: Domine o Ecossistema Certo Solução 3: Mentalidade Analítica e Soft Skills Solução 4: Inglês e o Mercado Internacional Como Construir Network do Zero Como Montar um Portfólio Que Chama Atenção O Problema Não é a Falta de Vaga]]></summary></entry><entry><title type="html">Porque o Site é Simples e Porque Sua Vida Também Deveria Ser</title><link href="https://devlog.tiagoaguiar.dev/programacao-minimalista/" rel="alternate" type="text/html" title="Porque o Site é Simples e Porque Sua Vida Também Deveria Ser" /><published>2026-05-05T21:10:00+00:00</published><updated>2026-05-05T21:10:00+00:00</updated><id>https://devlog.tiagoaguiar.dev/programacao-minimalista</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/programacao-minimalista/"><![CDATA[<p>
Se você chegou aqui esperando um site cheio de animações, efeitos, transições sofisticadas e um CSS ultra elaborado, talvez tenha estranhado um pouco.
</p>

<p>
E a resposta é simples: <i>isso foi proposital</i>.
</p>

<p>
Este site é minimalista porque eu quero focar no que importa.
</p>

<p>
O que importa aqui não é o brilho da interface. Não é o efeito no botão. Não é a sombra perfeita no card. O que importa aqui é o conteúdo, a clareza da ideia, o aprendizado e principalmente o <b>ato de programar</b>.
</p>

<p>
Eu poderia gastar horas ajustando detalhes cosméticos do layout (como já fiz muito no passado). Poderia reinventar a navegação, criar mais camadas visuais, adicionar mais componentes e encher tudo de ornamentos. Mas aí entra uma pergunta que todo programador deveria se fazer:
</p>

<blockquote>
<p>
Isso realmente melhora o essencial ou só me distrai do trabalho principal?
</p>
</blockquote>
<div id="outline-container-org439b33e" class="outline-2">
<h2 id="org439b33e">Keep it Simple, Stupid</h2>
<div class="outline-text-2" id="text-org439b33e">
<p>
Você talvez já tenha lido meu texto sobre <a href="/kiss-programador">KISS</a> O princípio continua o mesmo:
</p>

<p>
<i>Keep it simple, stupid.</i>
</p>

<p>
Quanto mais simples, mais claro. Quanto mais claro, mais fácil de manter. Quanto mais fácil de manter, mais energia sobra para construir o que realmente tem valor&#x2026; <b>o conteúdo</b>!
</p>

<p>
Este próprio site é uma aplicação prática disso.
</p>

<p>
Eu não quero transformar o blog em um projeto paralelo de decoração digital. Quero que ele seja uma ferramenta direta para publicar ideias, ensinar programação e compartilhar experiência real de quem escreve software há anos.
</p>

<p>
Se o texto carrega a mensagem, se o código do site é fácil de manter e se o leitor consegue chegar rapidamente ao conteúdo, então o objetivo foi cumprido.
</p>

<p>
Nem todo projeto precisa de uma arquitetura visual exuberante ou de uma solução sofisticada. Em muitos casos, a solução simples não é apenas suficiente. Ela é superior.
</p>
</div>
</div>
<div id="outline-container-orgbb93d01" class="outline-2">
<h2 id="orgbb93d01">You Aren't Gonna Need It.</h2>
<div class="outline-text-2" id="text-orgbb93d01">
<p>
Outro princípio que conversa diretamente com essa decisão é o <b><i>YAGNI</i></b>:
</p>

<p>
<i>You Aren't Gonna Need It</i> - Você Não Vai Precisar Disso.
</p>

<p>
Traduzindo para a prática: não adicione agora aquilo que não resolve um problema real agora. 
</p>

<p>
Isso vale para código. Vale para arquitetura. Vale para features. E vale também para layout.
</p>

<p>
Eu não preciso de vinte efeitos visuais para ensinar alguém a programar uma tela no Android ou estruturar uma lógica no Swift.
</p>

<p>
Eu não preciso de uma experiência visual carregada para explicar orientação a objetos, estado, listas ou arquitetura de software.
</p>

<p>
Se algo não aumenta a clareza, não melhora a leitura e não ajuda o aluno a avançar, existe uma boa chance de ser excesso.
</p>

<p>
Excesso custa caro.
</p>

<p>
Custa tempo. Custa energia. Custa manutenção. Custa foco.
</p>

<p>
E o pior: muitas vezes ele dá uma falsa sensação de progresso.
</p>

<p>
Você passa a tarde inteira mexendo em detalhes superficiais e no fim do dia não escreveu uma linha melhor de código, não aprendeu nada novo de lógica e não terminou nenhum programa.
</p>
</div>
</div>
<div id="outline-container-org13ebd9e" class="outline-2">
<h2 id="org13ebd9e">O Que Aprendi Com Meu Mentor</h2>
<div class="outline-text-2" id="text-org13ebd9e">
<p>
Eu aprendi isso cedo com um mentor oriental que marcou bastante a minha forma de pensar.
</p>

<p>
Ele era o tipo de pessoa extremamente disciplinada, objetiva e econômica em palavras. Não falava mais do que precisava. Não complicava o que podia ser direto. E me ensinou uma coisa que ficou comigo:
</p>

<blockquote>
<p>
Quando o essencial está fraco, o enfeite vira distração.
</p>
</blockquote>

<p>
Isso não era só sobre programação. Era sobre postura profissional.
</p>

<ul class="org-ul">
<li>Antes de querer impressionar, entregue;</li>
<li>Antes de embelezar, faça funcionar;</li>
<li>Antes de sofisticar, simplifique;</li>
<li>Antes de expandir, domine o básico.</li>
</ul>

<p>
Essa mentalidade mudou minha forma de construir software.
</p>

<p>
Eu parei de admirar soluções complicadas só porque pareciam inteligentes. Passei a respeitar muito mais a solução que funciona, é legível, é enxuta e continua fácil de evoluir meses depois.
</p>

<p>
E honestamente, isso também me ajudou fora do código.
</p>

<p>
Hoje eu prefiro uma rotina mais simples, ferramentas mais diretas e processos mais leves quando o objetivo é produzir melhor.
</p>

<p>
<b>Menos teatro. Mais entrega.</b>
</p>
</div>
</div>
<div id="outline-container-org37768d1" class="outline-2">
<h2 id="org37768d1">Movimento vs. Progresso</h2>
<div class="outline-text-2" id="text-org37768d1">
<p>
Se você está aprendendo a programar, eu quero te passar uma ideia muito prática:
</p>

<p>
Não confunda movimento com progresso.
</p>

<p>
Trocar tema do editor toda semana não é programar.
</p>

<p>
Ficar obcecado com setup perfeito não é programar.
</p>

<p>
Assistir infinitos vídeos sobre programação sem construir nada, você já sabe&#x2026; também não é programar.
</p>

<p>
Programar é sentar e escrever código. É testar. É errar. É depurar. É melhorar aos poucos. É criar um programa, mesmo pequeno, e terminar.
</p>

<p>
Muita gente se perde nas bordas da profissão.
</p>

<p>
Quer o melhor teclado, a melhor fonte, o melhor tema, a melhor linguagem, o melhor framework, a melhor stack, a melhor metodologia, o melhor segundo cérebro, o melhor plugin, a melhor IA, o melhor roadmap.
</p>

<p>
Mas evita o principal: <b>abrir o projeto e fazer o trabalho</b>.
</p>

<p>
Se você levar KISS e YAGNI a sério, muita coisa desnecessária cai por terra.
</p>

<p>
Você para de enfeitar o que ainda nem existe e para de construir complexidade antes da hora.
</p>

<p>
Assim, você não gasta energia tentando parecer programador e começa, de fato, a programar.
</p>
</div>
</div>
<div id="outline-container-org994583d" class="outline-2">
<h2 id="org994583d">Simplicidade Não é Pobreza</h2>
<div class="outline-text-2" id="text-org994583d">
<p>
Simplicidade não significa descuido, fazer qualquer coisa ou abandonar qualidade.
</p>

<p>
Simplicidade de verdade exige critério. Exige intenção. Exige saber dizer “não” para muita coisa que até poderia entrar, mas não deveria entrar.
</p>

<p>
Este site é simples porque ele foi pensado para ser assim.
</p>

<p>
Eu, Tiago, quero focar no que importa: escrever, ensinar, programar e construir coisas úteis.
</p>

<p>
E você, leitor, pode aplicar a mesma lógica na sua jornada.
</p>

<p>
Comece retirando vaidade técnica, distrações ou enfeite prematuro.
</p>

<p>
E aplique mais prática, código, projetos terminados e foco no essencial.
</p>

<p>
No fim, é isso que faz alguém evoluir de verdade.
</p>

<hr />

<p>
Se este texto te ajudou a refletir, continue acompanhando os conteúdos. A proposta aqui é exatamente essa: menos fumaça e mais conteúdo útil para você aprender a criar software de verdade.
</p>


<a href="//tiagoaguiar.dev/android-compose?utm_campaign=ac&utm_source=blog&utm_medium=article&utm_term=programacao-minimalista"><img style="border: solid 1px #0dcaf0;" src="https://cdn.tiagoaguiar.dev/blog/img/blog-banner-android-compose.jpg" class="" /></a>


</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><category term="carreira" /><category term="dev" /><summary type="html"><![CDATA[Se você chegou aqui esperando um site cheio de animações, efeitos, transições sofisticadas e um CSS ultra elaborado, talvez tenha estranhado um pouco.]]></summary></entry><entry><title type="html">Projetos de Alunos</title><link href="https://devlog.tiagoaguiar.dev/projetos-alunos/" rel="alternate" type="text/html" title="Projetos de Alunos" /><published>2026-05-05T00:00:00+00:00</published><updated>2026-05-05T00:00:00+00:00</updated><id>https://devlog.tiagoaguiar.dev/projetos-alunos</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/projetos-alunos/"><![CDATA[<div id="outline-container-org7e370e2" class="outline-2">
<h2 id="org7e370e2">Conheça os Top aplicativos desenvolvidos pelos nossos alunos.</h2>
<div class="outline-text-2" id="text-org7e370e2">
<p>
<b>Os alunos podem ser de diferentes turmas e cursos, contudo todos aplicaram os conhecimentos adquiridos nas aulas para construir seus aplicativos.</b>
</p>

<p>
<b>A ordem dos projetos não significa um ranking, apenas uma linha do tempo da publicação mais recente para mais antiga de cada projeto.</b>
</p>
</div>
</div>
<div id="outline-container-org0e5a33f" class="outline-2">
<h2 id="org0e5a33f">App KingBurguer</h2>
<div class="outline-text-2" id="text-org0e5a33f">
<blockquote>
<p>
Bom dia Tiago! Depois dá uma olhada no app que eu concluí no iOS legacy&#x2026; projeto final do curso
</p>

<p>
&#x2014; <b>Maxwell Farias</b> - Aluno
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/maxwell-aluno.jpg" width="150" />

<iframe
  class="embed-video youtube"
  loading="lazy"
  src="https://www.youtube.com/embed/eu-2YMX40g0"
  title="YouTube video player"
  frameborder="0"
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  allowfullscreen
></iframe>


<p>
A finalidade do aplicativo é trazer uma lista de produtos em que o usuário pode fazer a recuperação de um cupom. E ao fazer a compra deste produto, conseguir um desconto na loja.
</p>
</div>
</div>
<div id="outline-container-org8409e8b" class="outline-2">
<h2 id="org8409e8b">My Habits</h2>
<div class="outline-text-2" id="text-org8409e8b">
<blockquote>
<p>
Muito bom o curso.
</p>

<p>
&#x2014; <b>Adriano Valumin</b> - Aluno
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/foto_perfil_aluno_adriano.jpg" width="150" />


<div id="org11e78f5" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/app-adriano.png" alt="app-adriano.png" />
</p>
</div>

<p>
Este aplicativo foi criado para que todos possam criar seus hábitos diários.
</p>
</div>
</div>
<div id="outline-container-orgc7656f0" class="outline-2">
<h2 id="orgc7656f0">Haffit</h2>
<div class="outline-text-2" id="text-orgc7656f0">
<blockquote>
<p>
&#x2014; <b>Heverson Assunção</b> - Aluno
</p>

<p>
Opa Tiago depois de alguns dias batendo cabeça consegui dar um jeito e finalizar o app apesar de simples foi trabalhoso ainda mais pra mim que estou começando, mas novamente sem suas dicas e ajuda eu não estaria aqui, obrigado novamente e vamos para o terceiro app!
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/heverson-aluno.jpeg" width="150" />


<div id="orgd0b77a2" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/heverson-app-full.png" alt="heverson-app-full.png" />
</p>
</div>

<p>
Aplicativo que ajuda você à monitorar os principais indicadores de saúde como consumo de água, taxas metabólicas e farmácias próximas.
</p>
</div>
</div>
<div id="outline-container-org7cd4fda" class="outline-2">
<h2 id="org7cd4fda">Ajude-se</h2>
<div class="outline-text-2" id="text-org7cd4fda">
<blockquote>
<p>
&#x2014; <b>Ygor Doring</b> - Aluno
</p>

<p>
Fala Tiagão, tudo certo? Gostaria de agradecer por mais esse módulo e dizer que estou a ponto de conseguir minha primeira oportunidade como android developer em uma big tech. Graças a você e ao conteúdo de primeira que temos no curso! Agradeço imensamente pelo conhecimento e boa vontade em ajudar!.
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/ygor-doring.jpeg" width="150" />


<div id="orgbca8b8a" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/app-ygor-doring.png" alt="app-ygor-doring.png" />
</p>
</div>

<iframe
  class="embed-video youtube"
  loading="lazy"
  src="https://www.youtube.com/embed/D4LPcLmdkYE"
  title="YouTube video player"
  frameborder="0"
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  allowfullscreen
></iframe>


<p>
Aplicativo que ajuda você à monitorar os principais indicadores de saúde como consumo de água, taxas metabólicas e farmácias próximas.
</p>
</div>
</div>
<div id="outline-container-orgc3ecfbb" class="outline-2">
<h2 id="orgc3ecfbb">Elevus</h2>
<div class="outline-text-2" id="text-orgc3ecfbb">
<blockquote>
<p>
&#x2014; <b>Sérgio Silveira</b> - Aluno
</p>

<p>
Tiago, primeiro de tudo quero agradecer imensamente todo o suporte dado durante o curso com minhas dúvidas, estou colocando meus projetos em um outro patamar, graças as técnicas, recursos e o conhecimento compartilhado por você e toda sua equipe. Obrigado mais uma vez, o Curso Android Express de fato foi um divisor de águas na minha carreira profissional&#x2026; estou apaixonado pelo kotlin. Obrigado e vamos em frente.
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/olinto.jpeg" width="150" />

<iframe
  class="embed-video youtube"
  loading="lazy"
  src="https://www.youtube.com/embed/LVSWurWeDFg"
  title="YouTube video player"
  frameborder="0"
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  allowfullscreen
></iframe>


<p>
Aplicativo de vendas da Empresa.
</p>
</div>
</div>
<div id="outline-container-org0e4ce3c" class="outline-2">
<h2 id="org0e4ce3c">Desterro Mairiporã</h2>
<div class="outline-text-2" id="text-org0e4ce3c">
<blockquote>
<p>
&#x2014; <b>Felipe Matheus</b> - Aluno
</p>

<p>
Boa tarde pessoal, tenho orgulho de vir aqui publicar que graças as habilidades que aprendi durante o curso, pude fechar uma parceria com a principal igreja da minha cidade e desenvolver o app Desterro Mairiporã.
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/felipe-alunoo.png" width="150" />


<div id="orgec8fdcd" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/app-felipem.png" alt="app-felipem.png" />
</p>
<p><span class="figure-number">Figure 1: </span>projeto aluno Felipe Matheus</p>
</div>

<iframe
  class="embed-video youtube"
  loading="lazy"
  src="https://www.youtube.com/embed/R6UPyk_fzYk"
  title="YouTube video player"
  frameborder="0"
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  allowfullscreen
></iframe>


<p>
Este é o aplicativo da Igreja de Mairiporã.
</p>
</div>
</div>
<div id="outline-container-org95f7f23" class="outline-2">
<h2 id="org95f7f23">InfoBus Mairiporã</h2>
<div class="outline-text-2" id="text-org95f7f23">
<blockquote>
<p>
&#x2026;Para quem mora em Mairiporã vai adorar o controle dos transportes..
</p>

<p>
&#x2014; <b>Felipe Ferreira</b> - Aluno
</p>
</blockquote>


<div id="org8f43dd4" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/app-felipe-ferreira.png" alt="app-felipe-ferreira.png" />
</p>
<p><span class="figure-number">Figure 2: </span>projeto aluno Felipe Ferreira</p>
</div>

<p>
Esse aplicativo controla os transportes na palma da mão e ajuda você a se programar melhor durante a semana :)
</p>
</div>
</div>
<div id="outline-container-org59423b5" class="outline-2">
<h2 id="org59423b5">Emprego Azul</h2>
<div class="outline-text-2" id="text-org59423b5">
<blockquote>
<p>
&#x2014; <b>Leandro Modena</b> - Aluno
</p>

<p>
Tiago, estou super feliz, depois do seu curso e com muita dedicação e estudo terminei meu app que está na loja (Emprego Azul +500 downloads), consegui vários serviços de freelance e amanhã será meu primeiro dia com carteira registrada como Desenvolvedor Android.
</p>
</blockquote>


<div id="orgdb77885" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/leandro-aluno.png" alt="leandro-aluno.png" />
</p>
<p><span class="figure-number">Figure 3: </span>projeto aluno Leandro Modena</p>
</div>

<p>
O aplicativo ajuda a encontrar empregos e serviços em gerais.
</p>
</div>
</div>
<div id="outline-container-org94b6e33" class="outline-2">
<h2 id="org94b6e33">Saúde K.L.Q</h2>
<div class="outline-text-2" id="text-org94b6e33">
<blockquote>
<p>
&#x2014; <b>Thiago Oliveira</b> - Aluno
</p>
</blockquote>


<div id="orgd4c77d2" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/thigous-app.png" alt="thigous-app.png" />
</p>
<p><span class="figure-number">Figure 4: </span>projeto aluno Thiago Oliveira</p>
</div>

<p>
O aplicativo ajuda a monitorar alguns indicadores importantes para a saúde do indivíduo.
</p>
</div>
</div>
<div id="outline-container-orgcfb11fc" class="outline-2">
<h2 id="orgcfb11fc">Block Puzzle</h2>
<div class="outline-text-2" id="text-orgcfb11fc">
<blockquote>
<p>
..Subi um jogo na Google play&#x2026; consegui com os conhecimentos do curso
</p>

<p>
&#x2014; <b>Flazion Lima</b> - Aluno
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/aluno-flazion.jpg" width="150" />


<div id="org455c66d" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/flazion-aluno.png" alt="flazion-aluno.png" />
</p>
<p><span class="figure-number">Figure 5: </span>projeto aluno Flazion Lima</p>
</div>

<p>
Um simples mas desafiador jogo de quebra-cabeças de blocos de jóias! Block Puzzle 2020 é um quebra-cabeça totalmente gratuito. Você pode apreciá-lo em qualquer lugar, sempre, sem necessidade online. Este jogo offline tem um jogo muito simples: basta arrastar, soltar e preencher toda a grade
</p>
</div>
</div>
<div id="outline-container-org6cef459" class="outline-2">
<h2 id="org6cef459">HemersonFlix</h2>
<div class="outline-text-2" id="text-org6cef459">
<blockquote>
<p>
Fala,Tiago Blz? Pessoal da empresa deu um retorno. Fui contratado como Programador Jr. Valeu pela força.
</p>

<p>
&#x2014; <b>Hemerson Silva</b> - Aluno
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/hemerson-aluno.jpg" width="150" />


<div id="org0b46b28" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/hemersonflix-aluno.png" alt="hemersonflix-aluno.png" />
</p>
<p><span class="figure-number">Figure 6: </span>projeto aluno Hemerson Silva</p>
</div>

<p>
O aplicativo agrega uma coleção de filmes onde você poderá favoritar para serem assistidos futuramente.
</p>
</div>
</div>
<div id="outline-container-org40f78a8" class="outline-2">
<h2 id="org40f78a8">Pajeú Contra a Covid-19</h2>
<div class="outline-text-2" id="text-org40f78a8">
<blockquote>
<p>
Segue um app que fiz pra ajudar no combate a COVID-19 na região onde moro. O app informa o boletim das 18 cidades da região.
</p>

<p>
&#x2014; <b>Hemerson Silva</b> - Aluno
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/hemerson-aluno.jpg" width="150" />


<div id="org9bcc2b5" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/hemerson-app-covid.png" alt="hemerson-app-covid.png" />
</p>
<p><span class="figure-number">Figure 7: </span>projeto aluno Hemerson Silva</p>
</div>

<p>
O aplicativo faz um boletim das 18 cidades de Pajeú com status da pandemia.
</p>
</div>
</div>
<div id="outline-container-org06e92df" class="outline-2">
<h2 id="org06e92df">AL Turismo</h2>
<div class="outline-text-2" id="text-org06e92df">
<blockquote>
<p>
Com o seu curso eu pude de fato aprender algo com um cronograma e mesmo nas aulas básicas eu sempre vejo coisas que se eu já soubesse iria facilitar muito a minha vida. Por isso não pulo nenhuma aula e vejo todas desde os fundamentos. Por isso a importância de se começar com calma e ir avançando gradativamente.
</p>

<p>
&#x2014; <b>Ângelo Robson</b> - Aluno
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/aluno-angelo.jpeg" width="150" />


<div id="orgb35ef40" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/aluno-al-turismo.jpg" alt="aluno-al-turismo.jpg" />
</p>
<p><span class="figure-number">Figure 8: </span>projeto aluno Ângelo Robson</p>
</div>

<p>
Encontre um ponto turístico mais próximo de você e conheça as belezas naturais do estado de Alagoas. Com o AL Turismo você poderá analisar fotos, distância e rotas até o destino desejado.
</p>
</div>
</div>
<div id="outline-container-orgb09482b" class="outline-2">
<h2 id="orgb09482b">Covid-19 Report</h2>
<div class="outline-text-2" id="text-orgb09482b">
<blockquote>
<p>
Boa tarde pessoal, sou aluno do curso também. Desenvolvi um APP que consome dados de uma API que extrai os dados do ministério da saúde quanto ao status do covid-19.
</p>

<p>
&#x2014; <b>Ângelo Robson</b> - Aluno
</p>
</blockquote>

<img src="https://cdn.tiagoaguiar.dev/images/img/aluno-angelo.jpeg" width="150" />


<div id="org92c40c0" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/aluno-2.jpg" alt="aluno-2.jpg" />
</p>
<p><span class="figure-number">Figure 9: </span>projeto aluno Angelo Robson</p>
</div>

<p>
Aplicativo desenvolvido para fornecer informações confiáveis ​​sobre o status do vírus.
</p>

<p>
_\_Devido ao assunto delicado do Covid-19, o o Google Play não aceita apps neste gênero, exceto de instituições oficiais de saúde. Contudo, você pode acompanhar pelo código-fonte aberta pelo desenvolvedor.*
</p>
</div>
</div>
<div id="outline-container-org6aa906f" class="outline-2">
<h2 id="org6aa906f">Tracker Roubo e Furtos</h2>
<div class="outline-text-2" id="text-org6aa906f">
<blockquote>
<p>
Estou passando aqui para agradecer seus videos, pois comprei seu curso fora o que fiz de graça no youtube, então especialmente este que usa a API do Google Maps. Depois de concluído resolvi criar meu portfólio. Estou pra upar na google play um Segundo App que fiz estudando seu curso.
</p>

<p>
&#x2014; <b>Paulo Soares</b> - Aluno
</p>
</blockquote>


<div id="org538c9ae" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/images/img/aluno-1.jpg" alt="aluno-1.jpg" />
</p>
<p><span class="figure-number">Figure 10: </span>projeto aluno Paulo Soares</p>
</div>

<p>
Este aplicativo foi criado para que todos possam saber em tempo real onde teve Roubos e Assaltos na região onde você estar, com ele será possível fazer o mapeamento da cidade e saber qual região com maior índice de roubos, somos um aplicativo novo e totalmente independente apenas com intuito de ajudar as pessoas a quem sabe encontrar seus bens ou inibir algum roubo seja de celular, veículo ou qualquer outra coisa.
</p>
</div>
<div id="outline-container-org26d4353" class="outline-3">
<h3 id="org26d4353"><b>Já é nosso aluno? Que tal ter o seu projeto aqui também, entre os melhores!</b></h3>
<div class="outline-text-3" id="text-org26d4353">
<p>
<b>Nos envie uma mensagem neste <a href="https://ig.me/m/tiagoaguiar.oficial">link aqui</a> contando a sua história e do seu aplicativo</b>.
</p>

<p>
(Se você já enviou seu projeto, fique tranquilo que logo logo ele irá aparecer por aqui também ^{})
</p>
</div>
</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><summary type="html"><![CDATA[Conheça os Top aplicativos desenvolvidos pelos nossos alunos. Os alunos podem ser de diferentes turmas e cursos, contudo todos aplicaram os conhecimentos adquiridos nas aulas para construir seus aplicativos.]]></summary></entry><entry><title type="html">Além dos Bytes: A Minha Jornada na Programação</title><link href="https://devlog.tiagoaguiar.dev/sobre/" rel="alternate" type="text/html" title="Além dos Bytes: A Minha Jornada na Programação" /><published>2026-05-05T00:00:00+00:00</published><updated>2026-05-05T00:00:00+00:00</updated><id>https://devlog.tiagoaguiar.dev/sobre</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/sobre/"><![CDATA[<div id="orgf8b5e0a" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/blog/img/tiago-aguiar-sobre-header.jpg" alt="tiago-aguiar-sobre-header.jpg" />
</p>
</div>

<p>
👋 Opa!
</p>

<p>
Eu sou Tiago Aguiar, desenvolvedor há mais de 15 anos.
</p>

<p>
Hoje crio aplicativos móveis, mas minha jornada passou pelo front-end e back-end antes de me especializar em mobile.
</p>

<p>
Minha paixão por programação começou em 2009, quando escrevi minha primeira linha de código em Assembly para microcontroladores. Desde então, transformei curiosidade em carreira e acumulei uma sólida experiência no desenvolvimento de software.
</p>

<p>
Além de Senior Mobile Developer (Android &amp; iOS), também sou empreendedor, criador de conteúdo, Indie Dev, mentor de programadores e fundador do projeto <a href="https://tiagoaguiar.dev">tiagoaguiar.dev</a>.
</p>

<p>
Com isso, pude ajudar milhares de pessoas a conquistarem seu primeiro emprego na programação e outras tantas a evoluírem para níveis pleno e sênior.
</p>

<p>
Mas, como em qualquer trajetória, a estrada nem sempre foi fácil.
</p>
<div id="outline-container-org4e4f447" class="outline-2">
<h2 id="org4e4f447">Ato #1 - Como me tornei um programador</h2>
<div class="outline-text-2" id="text-org4e4f447">
<p>
Minha trajetória teve início em meio a uma família simples, permeada pelo ofício de eletricistas. Meu pai, irmãos e primos, todos trilhavam esse caminho, e tudo apontava para o fato de que eu seguiria a mesma rota.
</p>

<p>
E, de fato, assim aconteceu.
</p>

<p>
Com uma formação em eletroeletrônica pelo SENAI, meu conhecimento tecnológico estava inicialmente atrelado a hardware, diodos, transistores e resistores.
</p>

<p>
Contudo, foi quando dei meu primeiro mergulho na programação que tudo mudou, utilizando uma linguagem de baixo nível: o <b>Assembly</b>.
</p>

<p>
Iniciei minha jornada aprendendo a programar em Assembly, explorando a criação e automação de tarefas com microcontroladores da família 8051. Mais tarde, adentrei o universo da linguagem C, especialmente voltada para microcontroladores PIC.
</p>

<p>
O ato de escrever um programa de computador fez meu coração cantar e acendeu o desejo de me tornar um <b>desenvolvedor de software</b>.
</p>

<p>
Ao ingressar na Universidade São Judas Tadeu, em São Paulo, como bolsista pelo programa Prouni, escolhi a Ciência da Computação como meu campo de estudo.
</p>

<p>
Após intensa dedicação, conquistei meu primeiro emprego em uma fábrica de software, onde desenvolvi soluções utilizando a linguagem Java após passar por três entrevistas técnicas desafiadoras.
</p>

<p>
Em um ponto crucial, optei por trilhar um caminho diferente, largando a universidade, apesar de já estar atuando como desenvolvedor backend. Ao adquirir experiências notáveis em empresas de renome, como a LATAM, continuei minha jornada, focando no desenvolvimento web.
</p>

<p>
Após alguns anos, vivi um momento decisivo que marcou uma verdadeira <b>virada como programador</b>.
</p>
</div>
</div>
<div id="outline-container-org9de6f61" class="outline-2">
<h2 id="org9de6f61">Ato #2 - Me reinventando como programador: Uma nova jornada</h2>
<div class="outline-text-2" id="text-org9de6f61">
<p>
O ano era 2013.
</p>

<p>
Trabalhava em uma empresa de telemetria onde tive contato com algumas pessoas que estavam embarcando no universo mobile.
</p>

<p>
Aquilo parecia mágico 🎩.
</p>

<p>
Com isso, decidi mudar drasticamente de especialização e seguir uma nova jornada para me tornar um desenvolvedor mobile com <b>Android</b> e trabalhar como freelancer e desenvolvedor independente, criando meus próprios aplicativos, empreendendo.
</p>

<p>
Criei diversos aplicativos em diversos nichos de mercado:
</p>

<ul class="org-ul">
<li>e-commerce</li>
<li>financeiro</li>
<li>imobiliários</li>
<li>CRM</li>
<li>jogos de azar</li>
<li>educaional</li>
<li>fitness</li>
<li>infantil</li>
<li>streams</li>
<li>redes sociais</li>
</ul>

<p>
Vivi alguns anos somente com a renda dos meus próprios aplicativos Android. Mas em um determinado momento, eu senti que precisava ir para outro nível. Eu precisava me tornar um <b>desenvolvedor mobile completo</b>, com Android e iOS.
</p>

<p>
De 2015 à 2018, fui coordenador de um time de desenvolvimento e em paralelo comecei a "respirar" somente iOS - dia e noite.
</p>

<p>
Com essa vontade irrazoável em aprender e me tornar um desenvolvedor mobile completo, agora no universo iOS, crio minha própria oportunidade e lanço um desafio de 90 dias para meu CTO.
</p>

<blockquote>
<p>
Modernizar um aplicativo de Objective-C para Swift.
</p>
</blockquote>

<p>
Este era o aplicativo iOS principal da empresa que foi categorizado como os top aplicativos do setor <b>imobiliário</b>.
</p>

<p>
Esse processo precisava ser feito do absoluto zero e em até 90 dias.
</p>

<p>
Só tinha um <b>pequeno problema</b>, eu não sabia ABSOLUTAMENTE nada de Objective-C ou Swift. Muito menos instalar o Xcode 😱.
</p>

<p>
Mas eu sabia resolver problemas, sabia aprender e sabia que era capaz e teria êxito!
</p>

<p>
Tudo isso enquanto trabalhava e cuidava de outras coisas na empresa, afinal, nada pode parar não é mesmo?
</p>

<p>
Toquei este projeto sozinho e para a felicidade de todos, <b>88 dias</b> depois (2 dias a menos do prazo estipulado) o projeto estava pronto e publicado na App Store.
</p>

<p>
Tudo isso foi possível por causa do meu desejo irrazoável de <b>fazer acontecer</b> e de querer levar minhas habilidades para o próximo nível.
</p>


<div id="org750c47b" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/blog/img/35993327_6091865754803_1409021793057898496_n.png" alt="35993327_6091865754803_1409021793057898496_n.png" />
</p>
</div>
</div>
</div>
<div id="outline-container-org0fd5acf" class="outline-2">
<h2 id="org0fd5acf">Ato #3 - O próximo nível: Transformando vidas</h2>
<div class="outline-text-2" id="text-org0fd5acf">
<p>
Em 2018, decidi compartilhar no Youtube os meus conhecimentos sobre desenvolvimento Android e iOS nativos.
</p>

<p>
Hoje, esse canal possui <b>+4.0 milhões</b> de Views e <b>+69.000</b> seguidores (e contando).
</p>

<blockquote>
<p>
Este é considerado o maior canal sobre desenvolvimento Android e iOS nativo do Brasil.
</p>
</blockquote>

<p>
E a pedido de milhares de inscritos, eu comecei um novo projeto ministrando treinamentos online para transformar os aspirantes à programadores (iniciantes), assim como eu fui um dia, em desenvolvedores profissionais.
</p>

<p>
Com esse projeto, eu já ajudei mais de <b>4.000 alunos</b> a aprenderem a programar de verdade com meus treinamentos online.
</p>

<p>
Hoje, minha missão é ajudar ainda mais pessoas como você, através das minhas experiências reais a se tornarem desenvolvedores mobile extraordinários.
</p>

<p>
Além disto, através de artigos do blog, e-books e <a href="https://tiagoaguiar.dev/materiais-educativos">materiais</a> gratuitos, irei compartilhar a minha experiência e o que eu faço no dia-a-dia para desenvolver aplicativos Android e iOS e espero que isso possa te ajudar.
</p>

<hr />

<p>
Eu acredito que qualquer pessoa tem o potencial de se tornar um <b>desenvolvedor extraordinário</b> capaz de criar uma obra de arte na forma de produto/software.
</p>

<p>
De fato, estou frustrado com a falta de conhecimento, comprometimento e prática de muitos programadores que preferem se manter na média ao invés de evoluir para o próximo nível buscando a excelência do seu trabalho e da sua vida.
</p>

<p>
Espero que você esteja em busca de se destacar no mercado e não ser mais um no meio da multidão de outros programadores.
</p>

<p>
Se você, assim como eu e diversos alunos de sucesso, quiser sair da sua zona de conforto para mudar de vida e de carreira, eu te convido a mergulhar de cabeça e fazer uma imersão nesse universo Android ou iOS.
</p>

<p>
Eu criei o caminho mais efetivo possível depois de anos de experiência, onde você pode aprender de verdade como criar aplicativos profissionais com nossos treinamentos online.
</p>

<p>
<a href="https://tiagoaguiar.dev/?utm_source=blog&amp;utm_source=sobre#projects-2">Clique aqui para saber mais.</a>
</p>

<blockquote>
<p>
Seguir um mentor, deixará a sua trajetória mais fácil e te economizará muito tempo e dinheiro.
</p>
</blockquote>

<p>
<i>"Mas Tiago, ainda estou com algumas dúvidas:"</i>
</p>

<ul class="org-ul">
<li>O que é preciso para evoluir minhas habilidades como desenvolvedor mobile?</li>
<li>O que preciso saber para trabalhar exclusivamente como um programador que cria aplicativos diferenciados?</li>
<li>Como ser reconhecido no mercado e ter uma carreira de programador de sucesso?</li>
<li>Como começar?</li>
<li>Mas é difícil?</li>
</ul>
</div>
</div>
<div id="outline-container-orgdcc8a04" class="outline-2">
<h2 id="orgdcc8a04">A arte de desenvolver aplicativos: Navegando pelos 3 pilares essenciais</h2>
<div class="outline-text-2" id="text-orgdcc8a04">
<p>
Criar aplicativos é mais simples que você possa imaginar, mas isso não significa que é fácil ou que você não vai precisar se dedicar.
</p>

<p>
Há um passo a passo que você pode aprender, alguns desses passos inclui:
</p>

<ul class="org-ul">
<li>Arquiteturas de software</li>
<li>Produtividade</li>
<li>Ferramentas e métodos</li>
<li>Concepção de ideias para aplicativos</li>
</ul>

<p>
A boa notícia é que existe um <b>método assertivo</b> para aprender tudo isso, de forma estruturada e organizada.
</p>

<p>
Olhando de uma visão bem ampla, temos 3 grandes tópicos para aprender:
</p>

<ol class="org-ol">
<li>Linguagem de Programação</li>
<li>Android ou iOS SDK</li>
<li>Método/Processos</li>
</ol>

<p>
Esses são os <b>3 pilares</b> para se aprender qualquer tecnologia, incluindo criar aplicativos.
</p>

<p>
Dentro dos meus treinamentos online, eu mostro passo a passo como aprender cada um desses pilares.
</p>

<p>
<a href="https://tiagoaguiar.dev/?utm_source=blog&amp;utm_source=sobre#projects-2">Clique aqui para saber mais.</a>
</p>
</div>
</div>
<div id="outline-container-orgdf00024" class="outline-2">
<h2 id="orgdf00024">O que dizem sobre o Tiago Aguiar</h2>
<div class="outline-text-2" id="text-orgdf00024">
<p>
<b>Aprender a programar</b> e <b>criar aplicativos</b> pode ser difícil para muita gente. Agora, compartilhar o conhecimento de forma clara pode ser mais difícil ainda!
</p>

<p>
Por isso, ao invés de eu mesmo falar sobre os resultados que gerei e as vidas que já pude transformar, vou deixar aqui os relatos de pessoas que confiaram no meu trabalho e hoje estão decolando em suas carreiras.
</p>

<blockquote>
<p>
Veja o que algumas das milhares de pessoas que já passaram pelos nossos <a href="https://tiagoaguiar.dev?utm_source=blog&amp;utm_source=sobre">cursos online de programação</a> dizem sobre.
</p>
</blockquote>

<p>
<img src="https://cdn.tiagoaguiar.dev/blog/img/gratidao_00011.png" alt="gratidao_00011.png" />
<img src="https://cdn.tiagoaguiar.dev/blog/img/1663730628.png" alt="1663730628.png" />
<img src="https://cdn.tiagoaguiar.dev/blog/img/1663728771.png" alt="1663728771.png" />
<img src="https://cdn.tiagoaguiar.dev/blog/img/1663729998.png" alt="1663729998.png" />
<img src="https://cdn.tiagoaguiar.dev/blog/img/gratidao-0001.png" alt="gratidao-0001.png" />
<img src="https://cdn.tiagoaguiar.dev/blog/img/gratidao_0005.png" alt="gratidao_0005.png" />
<img src="https://cdn.tiagoaguiar.dev/blog/img/1663362494.png" alt="1663362494.png" />
</p>

<hr />

<p>
Ao reconhecer a distinção entre simples "programadores" e verdadeiros profissionais, você abrirá caminho para se destacar e alcançar o reconhecimento merecido. Este é o primeiro passo para conquistar aquilo que verdadeiramente merece.
</p>

<p>
O conceito de ganhar pouco ou muito é subjetivo, variando de mil a dez mil reais conforme as perspectivas individuais.
</p>

<p>
A quantia que almeja no mercado e em sua carreira é uma decisão pessoal que recai exclusivamente sobre você.
</p>

<p>
É fundamental compreender que todo indivíduo que atingiu o sucesso, conforme sua própria definição, iniciou sua trajetória a partir do zero. Portanto, seja você, eu ou qualquer outra pessoa, temos a capacidade de começar do zero e construir nosso caminho.
</p>

<p>
Posso assegurar que trilhar o caminho de desenvolvedor mobile pode proporcionar uma qualidade de vida incrível.
</p>


<div id="org4e3705c" class="figure">
<p><img src="https://cdn.tiagoaguiar.dev/blog/img/lifestyle.jpg" alt="lifestyle.jpg" />
</p>
</div>

<p>
Eu acredito verdadeiramente que, depois de 15 anos de experiência como desenvolvedor eu possa te ajudar de alguma forma a evoluir na sua carreira mobile.
</p>

<p>
Espero que você aprenda muito por aqui e que meu conteúdo possa te ajudar a ir para o próximo nível.
</p>

<p>
Se você deseja me contactar:
</p>

<ul class="org-ul">
<li><a href="https://instagram.com/tiagoaguiar.oficial">Instagram</a></li>
<li><a href="https://youtube.com/tiagoaguiar">Youtube</a></li>
<li><a href="https://facebook.com/tiagoaguiar.oficial">Facebook</a></li>
</ul>
</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://devlog.tiagoaguiar.dev/img/tiago-aguiar-sobre-header.jpg" /><media:content medium="image" url="https://devlog.tiagoaguiar.dev/img/tiago-aguiar-sobre-header.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Aprenda Kotlin 2026: Guia Completo para Iniciantes</title><link href="https://devlog.tiagoaguiar.dev/aprenda-kotlin/" rel="alternate" type="text/html" title="Aprenda Kotlin 2026: Guia Completo para Iniciantes" /><published>2026-05-04T03:00:00+00:00</published><updated>2026-05-04T03:00:00+00:00</updated><id>https://devlog.tiagoaguiar.dev/aprenda-kotlin</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/aprenda-kotlin/"><![CDATA[<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org87276c5">Etapa 1: Introdução ao Kotlin</a>
<ul>
<li><a href="#orgfd2cd89">1.1 O primeiro programa na linguagem Kotlin</a></li>
<li><a href="#org94985eb">1.2 println() — Exibindo saída do seu código</a></li>
<li><a href="#orgdf562af">1.3 Variáveis e Constantes: Memória do seu Código</a></li>
<li><a href="#orgb923f47">1.4 Tipos de dados que ajudam o programador</a></li>
<li><a href="#orgfda5b79">1.5 Interpolação de strings: misturando variáveis e texto</a></li>
</ul>
</li>
<li><a href="#orgb85139a">Etapa 2: Tomando Decisões</a>
<ul>
<li><a href="#org1643588">2.1 Operadores de comparação</a></li>
<li><a href="#org15bec5d">2.2 if / else if / else</a></li>
<li><a href="#org5ce7c35">2.3 Operadores lógicos (&amp;&amp; || !)</a></li>
<li><a href="#org59eff78">2.4 Expressões com when</a></li>
</ul>
</li>
<li><a href="#org9754280">Etapa 3: Repetindo Coisas</a>
<ul>
<li><a href="#orgc032306">3.1 for loop</a></li>
<li><a href="#org13ccd61">3.3 while loop</a></li>
<li><a href="#orga1ade79">3.4 break e continue</a></li>
<li><a href="#org4cc6872">3.5 nested loops</a></li>
<li><a href="#org1b80915">Etapa 3 Recap: O Que Você Aprendeu</a></li>
</ul>
</li>
<li><a href="#org81c5f20">Novas aulas em breve&#x2026;</a></li>
</ul>
</div>
</div>

<p>
<i>Um guia estruturado, lição por lição, para aprender a <b>linguagem de programação Kotlin</b>. Cada lição leva cerca de 30 minutos e inclui código real que você pode executar e finalizar com um desafio para testar você mesmo.</i>
</p>

<p>
&#x2014;
</p>

<p>
Começar em programação parece mais difícil do que realmente é. No início, tudo soa novo: linguagem, editor, projeto, execução, saída no console. A boa notícia é que você não precisa entender tudo de uma vez. Basta dar o primeiro passo na ordem certa.
</p>

<p>
Este guia foi pensado para quem está começando do <b>absoluto zero</b> com Kotlin. A ideia é construir uma base sólida, sem pular etapas, para que você entenda o que está fazendo sem copiar código sem contexto.
</p>

<p>
Ao longo deste começo, você vai aprender o essencial para sair do <i>"não sei por onde começar"</i> e chegar ao <i>"consigo escrever meus primeiros programas Kotlin"</i>.
</p>

<p>
Cada lição foi planejada para levar <b>cerca de 30 minutos</b> e termina com um pequeno desafio para você testar o que acabou de aprender.
</p>

<blockquote>
<p>
<b>Importante:</b> Cada etapa se apoia na anterior. Siga na ordem certa e você terá uma base sólida em Kotlin, pronta para o desenvolvimento de aplicativos reais.
</p>
</blockquote>
<div id="outline-container-org87276c5" class="outline-2">
<h2 id="org87276c5">Etapa 1: Introdução ao Kotlin</h2>
<div class="outline-text-2" id="text-org87276c5">
<p>
Todo desenvolvedor começou exatamente onde você está agora. Os primeiros passos não precisam ser perfeitos, eles só precisam ser claros. Nesta primeira etapa, o foco é <b>entender o ambiente</b>, escrever sua primeira linha de código e reconhecer como o Kotlin se comporta.
</p>

<p>
Você não precisa de formação em computação para acompanhar. Precisa apenas de uma ferramenta para escrever e executar código Kotlin, como o <i>Playground</i> Kotlin, Android Studio ou uma IDE compatível com Kotlin. O importante agora é ter um lugar para testar ideias rapidamente.
</p>

<blockquote>
<p>
<b>IDE: Integrated Development Environment</b>. É o Ambiente de Desenvolvimento Integrado, isto é, a ferramenta que fornece um kit para o programador programar.
</p>
</blockquote>

<p>
No fim desta etapa, você vai entender como um programa Kotlin é organizado, como o código é executado e por que os primeiros exemplos parecem simples, mas são a base de tudo o que vem depois.
</p>
</div>
<div id="outline-container-orgfd2cd89" class="outline-3">
<h3 id="orgfd2cd89">1.1 O primeiro programa na linguagem Kotlin</h3>
<div class="outline-text-3" id="text-orgfd2cd89">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=N2tzyQjsMIs">Assista o video desta lição</a>
</p>
</blockquote>
</div>
<div id="outline-container-org403f990" class="outline-4">
<h4 id="org403f990">O que é Kotlin?</h4>
<div class="outline-text-4" id="text-org403f990">
<p>
Kotlin é uma linguagem de programação moderna, criada para ser clara, concisa e produtiva. Muito usada nos dias atuais para aplicativos e outros softwares.
</p>

<p>
Em termos simples, uma linguagem de programação é uma forma organizada de dar instruções para o computador. Você escreve essas instruções em uma sintaxe que a ferramenta entende e, depois, a máquina executa o que foi pedido.
</p>

<p>
Pense em uma receita. Uma receita tem formato, ordem e instruções objetivas porque precisa ser lida e seguida corretamente. Kotlin funciona do mesmo jeito: ele oferece uma estrutura para você expressar lógica de forma que o computador consiga interpretar.
</p>

<p>
Hoje, Kotlin é amplamente usado no desenvolvimento Android, mas também pode ser aplicado em outras áreas, como backend e aplicações multiplataforma. Quando você aprende Kotlin, está aprendendo uma linguagem que o ecossistema Android adotou oficialmente e que é muito valorizada no mercado.
</p>

<p>
Como iniciante, você tem algumas opções, mas duas delas se destacam:
</p>

<p>
<b>Kotlin Playground</b>
</p>

<p>
É uma opção no navegador, em <a href="https://play.kotlinlang.org/">play.kotlinlang.org</a>, onde você pode escrever Kotlin e ver o resultado imediatamente, sem instalação. Se você quer começar rápido e testar exemplos sem configurar nada, essa é a escolha mais simples.
</p>

<p>
<b>IntelliJ IDEA</b>
</p>

<p>
É uma IDE muito forte para Kotlin, especialmente fora do contexto Android. Ela também é bastante usada em projetos backend e em estudos mais avançados da linguagem. Para quem quer praticar Kotlin com liberdade, é uma excelente opção.
</p>

<p>
Se você estiver começando agora, o caminho mais natural é usar o Kotlin Playground para "brincar". Ele já traz tudo o que você precisa para escrever código Kotlin, testar exemplos e evoluir sem instalar nada no começo. E depois, para se profissionalizar, com certeza você vai precisar <a href="https://www.jetbrains.com/idea/download/">instalar o IntelliJ</a>.
</p>
</div>
</div>
<div id="outline-container-orgbf36ff6" class="outline-4">
<h4 id="orgbf36ff6">Como se parece um programa Kotlin?</h4>
<div class="outline-text-4" id="text-orgbf36ff6">
<p>
O exemplo mais simples possível é uma linha que imprime texto no console:
</p>

<blockquote>
<p>
<b>Console:</b> É a área onde o programa mostra o resultado da execução. Quando você usa <code>println()</code>, é ali que a saída aparece.
</p>
</blockquote>

<div class="org-src-container">
<pre class="src src-kotlin">fun main() {
    println("Olá, mundo!")
}
</pre>
</div>

<p>
Esse trecho diz ao computador: execute a função principal e mostre a mensagem no console. Quando você roda esse código em um projeto Kotlin, essa saída aparece imediatamente.
</p>

<div class="org-src-container">
<pre class="src src-console">Olá mundo!
</pre>
</div>

<p>
Vamos quebrar isso em partes:
</p>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">PARTE</th>
<th scope="col" class="org-left">SIGNIFICADO</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>fun main()</b></td>
<td class="org-left">É o ponto de entrada do programa, a ignição (falaremos disso mais à frente).</td>
</tr>

<tr>
<td class="org-left"><b>{ }</b></td>
<td class="org-left">Delimitam o bloco/escopo de código que será executado.</td>
</tr>

<tr>
<td class="org-left"><b>println("Olá, mundo!")</b></td>
<td class="org-left">Escreve texto na saída padrão e pula uma linha ao final.</td>
</tr>
</tbody>
</table>

<blockquote>
<p>
Um erro muito comum de iniciante é esquecer aspas ao escrever texto. Se você digitar algo como <code>println(Olá)</code> em vez de <code>println("Olá")</code>, o Kotlin vai interpretar o <code>Olá</code> como um identificador de código - uma instrução - não como uma frase. Aspas dizem ao compilador que aquilo é texto literal, não instrução de máquina.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-orgc626fc1" class="outline-4">
<h4 id="orgc626fc1">Como o Kotlin executa o código?</h4>
<div class="outline-text-4" id="text-orgc626fc1">
<p>
Quando você aperta executar , o Kotlin processa o código na ordem em que ele foi escrito. Em exemplos simples isso parece óbvio, mas essa ideia fica muito importante quando os programas começam a ter várias linhas, funções e decisões condicionais.
</p>

<blockquote>
<p>
<b>Compilador:</b> É a ferramenta que traduz seu código Kotlin para algo que o computador consiga executar. Se houver um erro de sintaxe, ele interrompe a compilação e mostra onde está o problema.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org10856ec" class="outline-4">
<h4 id="org10856ec">A importância dos comentários.</h4>
<div class="outline-text-4" id="text-org10856ec">
<p>
Agora, se você quiser por notas no seu código para lembrar ou documentar ele, você pode usar comentários que informam ao compilador para ignorar estes textos, pois eles não fazem parte do código como instrução. Veja o exemplo abaixo:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">/*
  Este é um bloco de comentário
  E o compilador vai ignorar/descartar
  Então, não haverá erros aqui.
 */
fun main() {
    // Este é um comentário também só que em 1 linha
    println("Olá, mundo!")
}
</pre>
</div>

<p>
No exemplo acima, existe o bloco de comentários onde tudo o que estiver dentro de <code>/* */</code> será ignorado em multiplas linhas ou se for uma únicado linha, tudo após <code>//</code>.
</p>
</div>
</div>
<div id="outline-container-org6f60767" class="outline-4">
<h4 id="org6f60767">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org6f60767">
<p>
Crie um pequeno programa Kotlin que imprima três linhas sobre você: Diga <b>seu nome</b>, <b>sua cidade</b> e <b>o motivo pelo qual você quer aprender Kotlin</b>.
</p>

<p>
Use três chamadas separadas de <code>println()</code>, cada uma em sua própria linha. Rode o programa e confira se as três mensagens aparecem corretamente na saída do console.
</p>
</div>
</div>
<div id="outline-container-org45f7132" class="outline-4">
<h4 id="org45f7132">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-org45f7132">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Explique em português simples o que acontece quando eu aperto executar em um Kotlin Playground. O que o computador faz com meu código?
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Sou iniciante em Kotlin. Qual é a diferença entre Kotlin, IntelliJ IDEA e Kotlin Playground? Explique primeiro, antes de mostrar exemplos de código.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo em Kotlin que use <code>println()</code> de 5 formas diferentes: texto, números, várias coisas ao mesmo tempo e linhas em branco. Adicione um comentário em cada linha explicando o que ela faz, para alguém que nunca programou.
</p>
</blockquote>


<hr>
</div>
</div>
</div>
<div id="outline-container-org94985eb" class="outline-3">
<h3 id="org94985eb">1.2 println() — Exibindo saída do seu código</h3>
<div class="outline-text-3" id="text-org94985eb">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=rrK6mQdb7n4">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Você já usou <code>println()</code> na última aula. Agora é hora de entender de verdade o que ela faz.
</p>

<p>
Essa é provavelmente a ferramenta mais importante para quem está começando, porque permite enxergar exatamente o que está acontecendo dentro do código.
</p>

<p>
<code>println()</code> faz mais do que mostrar texto. Pode mostrar números, resultados de cálculos e até múltiplos valores ao mesmo tempo.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Imprimindo texto (texto precisa estar entre aspas)
println("Estou aprendendo Kotlin")

// Imprimindo um número
println(42)

// Imprimindo resultado de cálculo
println(10 + 5)

// Imprimindo múltiplos valores
// Maneira 1
println("A resposta é " + 42 + " da minha prova")
// Maneira 2
println("O jeito elegante de ${2026} para textos")

// Linha em branco
println()
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Estou aprendendo Kotlin
42
15
A resposta é 42 da minha prova
O jeito elegante de 2026 para textos

</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">O que você escreveu</th>
<th scope="col" class="org-left">O que Kotlin faz</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>println("Estou aprendendo Kotlin")</b></td>
<td class="org-left">Mostra exatamente o texto entre aspas</td>
</tr>

<tr>
<td class="org-left"><b>println(42)</b></td>
<td class="org-left">Mostra o número 42</td>
</tr>

<tr>
<td class="org-left"><b>println(10 + 5)</b></td>
<td class="org-left">Calcula primeiro e imprime 15</td>
</tr>

<tr>
<td class="org-left"><b>println("A resposta é " + 42 + " da minha prova")</b></td>
<td class="org-left">Une os valores (concatenar)</td>
</tr>

<tr>
<td class="org-left"><b>println("O jeito elegante de ${2026} para textos")</b></td>
<td class="org-left">Faz interpolação do conjunto de caracteres</td>
</tr>

<tr>
<td class="org-left"><b>println()</b></td>
<td class="org-left">Imprime uma linha vazia</td>
</tr>
</tbody>
</table>

<blockquote>
<p>
<b>Concatenação</b> é quando você junta pedaços de texto manualmente.
</p>

<p>
Na concatenação, você pega uma coisa e cola na outra. Fica como se fosse: "Olá," + "Kotlin", e o resultado vira "Olá, Kotlin".
</p>

<p>
É basicamente isso: pegar partes separadas e unir em uma frase só.
</p>
</blockquote>

<blockquote>
<p>
<b>Interpolação</b> faz a mesma coisa, mas de um jeito mais natural.
Em vez de ficar juntando pedaço por pedaço, você escreve a frase normalmente e coloca o que muda dentro dela.
</p>

<p>
É como escrever: "Olá, nome", e o Kotlin automaticamente troca "nome" pelo valor real, por exemplo "Tiago".
</p>
</blockquote>
</div>
<div id="outline-container-org587e3a6" class="outline-4">
<h4 id="org587e3a6">Comentários: notas dentro do código</h4>
<div class="outline-text-4" id="text-org587e3a6">
<p>
Você viu linhas começando com <code>//</code>. Já falamos sobre comentários.
</p>

<p>
Eles servem para deixar notas para você mesmo ou para outros programadores.
</p>

<p>
O compilador simplesmente ignora comentários.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Esta linha é um comentário
println("Essa linha executa") // comentário ao lado
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Essa linha executa
</pre>
</div>

<p>
Crie o hábito de comentar seu código.
</p>

<p>
No começo parece desnecessário, mas depois de alguns dias você vai agradecer por ter explicado para si mesmo o que estava fazendo.
</p>
</div>
</div>
<div id="outline-container-orgb7e4afb" class="outline-4">
<h4 id="orgb7e4afb">Matemática básica dentro do println()</h4>
<div class="outline-text-4" id="text-orgb7e4afb">
<p>
Kotlin entende operadores matemáticos normalmente:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">println(10 + 3) // Soma -&gt; 13
println(10 - 3) // Subtração -&gt; 7
println(10 * 3) // Multiplicação -&gt; 30
println(10 / 3) // Divisão inteira -&gt; 3
println(10 % 3) // Resto -&gt; 1
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">13
7
30
3
1
</pre>
</div>

<blockquote>
<p>
<b>NOTA:</b> Por que <code>10 / 3</code> vira <code>3</code>?
</p>

<p>
Porque ambos são inteiros (<code>Int</code>).
</p>

<p>
Quando você divide dois números inteiros em Kotlin, o resultado também será inteiro.
</p>

<p>
A parte decimal é descartada.
</p>
</blockquote>

<p>
Se quiser preservar casas decimais:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">println(10.0 / 3)
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">3.3333333333333335
</pre>
</div>
</div>
</div>
<div id="outline-container-org60b1841" class="outline-4">
<h4 id="org60b1841">Use println() para debug</h4>
<div class="outline-text-4" id="text-org60b1841">
<p>
Programadores usam <code>println()</code> o tempo inteiro.
</p>

<p>
Quando algo quebra, imprimir valores intermediários ajuda muito a entender: o valor que chegou, onde mudou e onde deu errado. Debug começa com <code>println()</code>. Sempre.
</p>

<blockquote>
<p>
<b>Debug</b> é o processo de descobrir o que está acontecendo no seu código quando algo não funciona como esperado.
</p>

<p>
Programar é dar instruções para o computador. Às vezes você acha que pediu uma coisa, mas na real cometeu um erro na lógica. O debug existe para investigar isso.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org0e9c95f" class="outline-4">
<h4 id="org0e9c95f">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org0e9c95f">
<p>
Imagine que você comprou 3 itens: Um produto de 12 reais, outro produto de 8 reais e outro produto de 25 reais. Agora, crie um programa Kotlin que imprima cada valor em uma linha, deixe uma linha em branco e por fim, imprima o total calculado.
</p>

<p>
Não digite o total manualmente.
</p>

<p>
Faça o Kotlin calcular.
</p>

<p>
A saída aproximada seria algo como:
</p>

<div class="org-src-container">
<pre class="src src-console">Produto 1 = 12
Produto 2 = 8
Produto 3 = 25

Total a pagar = 45
</pre>
</div>
</div>
</div>
<div id="outline-container-org325020c" class="outline-4">
<h4 id="org325020c">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-org325020c">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Acabei de aprender println() em Kotlin.
Me faça perguntas, uma de cada vez, sobre o que println() faz em diferentes situações.
Se eu errar, explique o motivo.
</p>
</blockquote>

<p>
<b>Comentários no código</b>
</p>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Estou aprendendo Kotlin e entendi que // <code>/**/</code> inicia um comentário.
Explique quando eu realmente devo comentar meu código.
Mostre exemplos de comentários úteis e comentários inúteis.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo curto em Kotlin mostrando 6 formas diferentes de usar println():
texto, número, cálculo, interpolação, linha vazia e algo criativo. ainda não use variáveis.
Mostre as pegadinhas.
</p>

<p>
Comente cada linha explicando o que ela faz.
</p>

<p>
Escreva para um iniciante absoluto.
</p>
</blockquote>


<hr>
</div>
</div>
</div>
<div id="outline-container-orgdf562af" class="outline-3">
<h3 id="orgdf562af">1.3 Variáveis e Constantes: Memória do seu Código</h3>
<div class="outline-text-3" id="text-orgdf562af">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=h5uf7KmiZks">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Até aqui, você já usou valores diretamente no código, digitou números e textos sem pensar muito sobre onde eles ficam guardados.
Mas programas reais precisam armazenar informação e reutilizá-la em vários lugares.
É exatamente para isso que servem variáveis e constantes.
</p>
</div>
<div id="outline-container-org11f2923" class="outline-4">
<h4 id="org11f2923">Pense como uma caixa com etiqueta</h4>
<div class="outline-text-4" id="text-org11f2923">
<p>
Imagine uma caixa de papelão com uma etiqueta na frente.
Você coloca algo dentro e, quando precisar de novo, se refere a essa caixa pelo nome da etiqueta em vez de olhar o conteúdo toda hora.
</p>

<p>
Variáveis e constantes funcionam assim: você dá um nome para uma informação e usa esse nome ao longo do código, como referência para o conteúdo.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Cria uma variável chamada limite e coloca 0 dentro dela
var limite = 0

// Usa o valor armazenado em limite
println(limite)

// Altera o valor guardado em limite
limite = 10
println(limite)

// Você pode fazer conta usando a variável
limite = limite + 5
println(limite)
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">0
10
15
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">O que você escreveu</th>
<th scope="col" class="org-left">O que Kotlin faz</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>var limite = 0</b></td>
<td class="org-left">Cria uma nova variável chamada <b>limite</b> e guarda o valor 0 nela. O <b>var</b> diz ao Kotlin que esse valor pode mudar depois.</td>
</tr>

<tr>
<td class="org-left"><b>println(limite)</b></td>
<td class="org-left">O Kotlin procura o valor armazenado em <b>limite</b> e imprime esse valor. Repare que não há aspas, porque <b>limite</b> é uma variável, não texto.</td>
</tr>

<tr>
<td class="org-left"><b>limite = 10</b></td>
<td class="org-left">Troca o valor atual da variável. O 0 sai e o 10 entra no lugar.</td>
</tr>

<tr>
<td class="org-left"><b>limite = limite + 5</b></td>
<td class="org-left">Lê o valor atual de <b>limite</b>, soma 5 e guarda o novo resultado de volta na mesma variável.</td>
</tr>
</tbody>
</table>

<p>
Agora, as vezes você tem informação que não deveria mudar.
Por exemplo, o número de dias em uma semana ou a sua data de nascimento.
Nesses casos, use <b>val</b> em vez de <b>var</b>.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Uma constante - esse valor não vai mudar
val diasDaSemana = 7

println(diasDaSemana)

// Isto causaria erro - você não pode alterar uma constante:
// diasDaSemana = 8
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">7
</pre>
</div>

<p>
Se você tentar mudar uma constante, o Kotlin não vai deixar o programa compilar.
Isso é uma proteção útil para evitar mudanças acidentais em valores que deveriam permanecer fixos.
</p>

<blockquote>
<p>
<b>var vs val:</b> uma boa regra para iniciantes é começar com <b>val</b>.
Se o Kotlin reclamar que você precisa alterar o valor, aí você troca para <b>var</b>.
Na prática, desenvolvedores Kotlin preferem <b>val</b> sempre que possível porque isso deixa o código mais seguro e mais fácil de entender.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org2365e1b" class="outline-4">
<h4 id="org2365e1b">Nomeando suas variáveis</h4>
<div class="outline-text-4" id="text-org2365e1b">
<p>
Nomes de variáveis podem ser quase qualquer coisa, mas existem regras e boas práticas importantes:
</p>

<p>
Se o nome da sua variável for em português como <b>preço</b>, use <b>preco</b> no lugar.
</p>

<p>
Porque a programação funciona em inglês, e caracteres como acentos e cedilha não existem no idioma. Ou seja, sempre que precisar declarar algo que remeta à lingua portuguesa, remova os acentos e caracteres especiais.
</p>

<p>
<b>camelCase:</b> é o padrão de escrever nomes compostos começando com letra minúscula e colocando a próxima palavra com inicial maiúscula, como <b>nomeDoJogador</b> ou <b>limiteMaximo</b>.
Se você seguir isso desde o começo, seu código vai ficar muito mais legível.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Bons nomes - claros e descritivos
var nomeDoJogador = "Tiago"
var limiteMaximo = 1500
val totalPontos = 3

// Kotlin usa camelCase - sem espaços e com cada nova palavra começando em maiúscula
var itensNoCarrinho = 0

// Estes exemplos causariam erro:
// var 1jogador = "Tiago"    // não pode começar com número
// var nome do jogador = "Tiago" // não pode ter espaços
</pre>
</div>
</div>
</div>
<div id="outline-container-orgfdf123e" class="outline-4">
<h4 id="orgfdf123e">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-orgfdf123e">
<p>
Crie uma variável chamada <b>pontos</b> e comece com o valor 0.
Depois, simule um jogo em que o jogador ganha 10 pontos, perde 3 pontos e ganha mais 7 pontos.
Após cada mudança, imprima o valor atual.
</p>

<p>
No final, use uma constante para guardar o nome do jogador e imprima uma mensagem final com o nome e a pontuação total.
</p>

<p>
A saída deve mostrar quatro valores diferentes da pontuação, incluindo o valor inicial, e depois uma linha final com o nome do jogador e a pontuação final.
</p>

<p>
Exemplo de saída:
</p>

<div class="org-src-container">
<pre class="src src-console">10
7
14
Tiago tem 14 pontos
</pre>
</div>
</div>
</div>
<div id="outline-container-orge96589d" class="outline-4">
<h4 id="orge96589d">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-orge96589d">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Acabei de aprender var e val em Kotlin.
Me faça perguntas, uma de cada vez, sobre quando eu deveria usar cada um.
Se eu errar, explique o motivo.
</p>
</blockquote>

<p>
<b>var vs. val no código</b>
</p>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Em Kotlin, por que é importante usar `var` ou `val` se eu sou o único que está escrevendo o código? Explique os motivos práticos pelos quais um iniciante deveria se importar com essa distinção.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo curto em Kotlin mostrando 3 situações com var e val:
uma variável que muda, uma constante e um cálculo usando a variável.
Mostre também um exemplo de nome ruim e um de nome bom.
Comente cada linha explicando o que ela faz.
Escreva para um iniciante absoluto.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-orgb923f47" class="outline-3">
<h3 id="orgb923f47">1.4 Tipos de dados que ajudam o programador</h3>
<div class="outline-text-3" id="text-orgb923f47">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=qcHuScAe7zY">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Quando você cria uma variável, o Kotlin precisa saber <b>que tipo de valor</b> ela vai guardar.
É texto? Um número inteiro? Um número com casas decimais? Verdadeiro ou falso?
Cada um desses casos é um <b>tipo de dado</b> diferente, e o Kotlin trata cada um de um jeito.
</p>

<p>
Na aula anterior, você criou variáveis sem escrever o tipo explicitamente.
Isso funciona porque o Kotlin consegue descobrir muita coisa sozinho.
Agora vamos entender o que está acontecendo por baixo dos panos.
</p>
</div>
<div id="outline-container-org05b2c4a" class="outline-4">
<h4 id="org05b2c4a">Os quatro tipos mais importantes</h4>
<div class="outline-text-4" id="text-org05b2c4a">
<p>
Esses são os tipos que você vai usar o tempo todo no começo:
</p>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Tipo</th>
<th scope="col" class="org-left">Serve para</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>String</b></td>
<td class="org-left">Texto, como nomes, mensagens e frases</td>
</tr>

<tr>
<td class="org-left"><b>Int</b></td>
<td class="org-left">Números inteiros, sem casas decimais</td>
</tr>

<tr>
<td class="org-left"><b>Double</b></td>
<td class="org-left">Números com casas decimais</td>
</tr>

<tr>
<td class="org-left"><b>Boolean</b></td>
<td class="org-left">Valores de verdadeiro ou falso</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-org082153d" class="outline-4">
<h4 id="org082153d">String</h4>
<div class="outline-text-4" id="text-org082153d">
<p>
<b>String</b> é qualquer texto: uma palavra, uma frase, ou até um caractere solto.
Em Kotlin, texto sempre fica entre aspas.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val nome: String = "Tiago"
val cidade = "São Paulo"   // Kotlin descobre que isso é String
val textoVazio = ""     // String vazia ainda é String
</pre>
</div>

<p>
Uma <b>String</b> é como uma sequência de caracteres.
Se tem aspas e representa texto, o Kotlin entende que é String.
</p>
</div>
</div>
<div id="outline-container-orgc2c6ef6" class="outline-4">
<h4 id="orgc2c6ef6">Int</h4>
<div class="outline-text-4" id="text-orgc2c6ef6">
<p>
<b>Int</b> é abreviação de <b>integer</b>, ou seja, número inteiro.
Use esse tipo quando o valor não precisa de casas decimais.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val idade: Int = 28
val pontos = 1500      // Kotlin entende que isso é Int
val temperatura = -5   // números negativos também funcionam
</pre>
</div>

<p>
<b>Int</b> serve bem para idade, contagem, pontuação e quantidade de itens.
</p>
</div>
</div>
<div id="outline-container-org46ca5df" class="outline-4">
<h4 id="org46ca5df">Double</h4>
<div class="outline-text-4" id="text-org46ca5df">
<p>
<b>Double</b> é usado para números com casas decimais.
É a escolha certa quando você quer guardar valores como preço, altura ou média.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val preco: Double = 9.99
val altura = 1.75
val pi = 3.14159
</pre>
</div>

<p>
Se o valor tem ponto decimal, o Kotlin normalmente entende como <b>Double</b>.
</p>
</div>
</div>
<div id="outline-container-org266e12d" class="outline-4">
<h4 id="org266e12d">Boolean</h4>
<div class="outline-text-4" id="text-org266e12d">
<p>
<b>Boolean</b> só aceita dois valores: <b>true</b> ou <b>false</b>.
Ele é útil para representar estados e condições.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val usuarioLogado: Boolean = false
val compraAprovada = true
val admin = false
</pre>
</div>

<p>
Você vai usar <b>Boolean</b> o tempo todo em programas reais:
o usuário está logado? o carrinho tem itens? a tarefa foi concluída?
</p>
</div>
</div>
<div id="outline-container-orga0a55e0" class="outline-4">
<h4 id="orga0a55e0">Inferência de tipos: o Kotlin é esperto</h4>
<div class="outline-text-4" id="text-orga0a55e0">
<p>
Na maioria das vezes, você não precisa escrever o tipo à mão.
O Kotlin consegue inferir o tipo a partir do valor que você atribui.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Com tipo explícito
val nome: String = "Tiago"
val preco: Double = 4.99

// Sem escrever o tipo
val sobrenome = "Aguiar"   // Kotlin vê aspas e entende String
val desconto = 4.99      // Kotlin vê número decimal e entende Double
val idade = 36        // Kotlin vê número inteiro e entende Int
val vendido = true      // Kotlin vê true/false e entende Boolean
</pre>
</div>

<p>
Os dois estilos funcionam.
No começo, muita gente prefere deixar o Kotlin descobrir sozinho porque isso reduz a quantidade de coisas para digitar e ler.
</p>
</div>
</div>
<div id="outline-container-org5520123" class="outline-4">
<h4 id="org5520123">Por que você não pode misturar tipos</h4>
<div class="outline-text-4" id="text-org5520123">
<p>
Depois que uma variável recebe um tipo, ela continua com esse tipo.
Você não pode guardar texto em uma variável criada para números.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">var pontos = 100   // pontos é Int

// Isto causaria erro:
// pontos = "cem"

// Isto funciona:
pontos = 200
</pre>
</div>

<p>
Se você tentou colocar um valor do tipo errado, o Kotlin não vai compilar.
Isso é uma proteção útil, porque evita bugs bobos e deixa o código mais previsível.
</p>

<blockquote>
<p>
<b>Regra prática:</b> se o valor é texto, use <b>String</b>.
Se é número inteiro, use <b>Int</b>.
Se tem casa decimal, use <b>Double</b>.
Se é uma decisão de sim ou não, use <b>Boolean</b>.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org22fdcc1" class="outline-4">
<h4 id="org22fdcc1">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org22fdcc1">
<p>
Crie um conjunto de variáveis para representar um usuário fictício em um app.
Você precisa guardar:
</p>

<ul class="org-ul">
<li>o nome</li>
<li>a idade</li>
<li>o saldo da conta</li>
<li>se a pessoa é premium ou não</li>
</ul>

<p>
Use o tipo mais apropriado para cada valor e decida se cada um deve ser <b>var</b> ou <b>val</b>.
Depois, imprima todos os valores.
</p>

<p>
Exemplo de saída:
</p>

<div class="org-src-container">
<pre class="src src-console">Ana
28
1540.75
true
</pre>
</div>
</div>
</div>
<div id="outline-container-orga53ec8a" class="outline-4">
<h4 id="orga53ec8a">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-orga53ec8a">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Acabei de aprender sobre String, Int, Double e Boolean em Kotlin.
Me faça perguntas, uma de cada vez, sobre que tipo de dado eu deveria usar em cada situação.
Se eu errar, explique o motivo.
</p>
</blockquote>

<p>
<b>Tipos de dados no código</b>
</p>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Em Kotlin, por que é importante escolher o tipo certo de dado se eu sou iniciante? Explique com exemplos simples por que String, Int, Double e Boolean existem.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo curto em Kotlin mostrando 4 variáveis: uma String, um Int, um Double e um Boolean.
Comente cada linha explicando o que ela faz.
Mostre também um exemplo de erro ao tentar colocar texto em uma variável numérica.
Escreva para um iniciante absoluto.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-orgfda5b79" class="outline-3">
<h3 id="orgfda5b79">1.5 Interpolação de strings: misturando variáveis e texto</h3>
<div class="outline-text-3" id="text-orgfda5b79">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=8IbIzI11jBo">Assista o video desta lição</a>
</p>
</blockquote>


<p>
Você já sabe imprimir texto. Já sabe guardar valores em variáveis.
Agora é hora de juntar as duas coisas e montar frases com valores que mudam.
</p>

<p>
Em Kotlin, isso se chama <b>string interpolation</b> ou <b>string templates</b>.
Na prática, você usa um cifrão dentro da string para inserir o valor de uma variável no meio do texto.
</p>
</div>
<div id="outline-container-org00d7c13" class="outline-4">
<h4 id="org00d7c13">O problema que isso resolve</h4>
<div class="outline-text-4" id="text-org00d7c13">
<p>
Sem interpolação, você teria que juntar texto e valor com uma técnica mais manual:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val pontuacao = 150
println("Sua pontuação é " + pontuacao)
</pre>
</div>

<p>
Isso funciona, mas fica menos elegante quando a frase cresce.
Com interpolação, o código fica mais limpo e mais fácil de ler.
</p>
</div>
</div>
<div id="outline-container-orgd249f33" class="outline-4">
<h4 id="orgd249f33">Interpolação de strings: use `$` dentro da string</h4>
<div class="outline-text-4" id="text-orgd249f33">
<p>
Para mostrar o valor de uma variável dentro de uma frase, escreva o nome dela depois do cifrão:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val pontuacao = 150
val nomeJogador = "Ana"

println("Sua pontuação é $pontuacao")
println("Bom trabalho, $nomeJogador!")
println("$nomeJogador tem $pontuacao pontos.")
</pre>
</div>

<blockquote>
<p>
<b>Regra rápida:</b> se for só o nome da variável, use <b>$variavel</b>.
Se precisar de uma expressão ou de mais controle, use <b>${ }</b>.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org487438d" class="outline-4">
<h4 id="org487438d">Você pode colocar expressões dentro de `${ }`</h4>
<div class="outline-text-4" id="text-org487438d">
<p>
Não precisa limitar a interpolação ao nome de variáveis.
Você também pode colocar cálculos e combinações de valores dentro das chaves.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val itens = 3
val precoPorItem = 4.99

println("Total: R$${itens * precoPorItem}")

val primeiroNome = "João"
val sobrenome = "Silva"
println("Nome completo: ${primeiroNome} ${sobrenome}")

val contaPremium = true
println("Conta premium: $contaPremium")
</pre>
</div>

<p>
<b>Observação importante:</b> Se você não quiser aplicar a interpolação e realmente imprimir o símbolo $ e depois o nome da variável, use <b>\$</b> para que o Kotlin não aplique a interpolação.
</p>

<p>
Exemplo:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val dolar = 4.99
println("Dólar: \$dolar $dolar")
</pre>
</div>
<div class="org-src-container">
<pre class="src src-nil">Dólar: $dolar 4.99
</pre>
</div>
</div>
</div>
<div id="outline-container-orga5aac61" class="outline-4">
<h4 id="orga5aac61">O que acontece em cada caso</h4>
<div class="outline-text-4" id="text-orga5aac61">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Sintaxe</th>
<th scope="col" class="org-left">O que faz</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>$pontuacao</b></td>
<td class="org-left">Insere o valor de uma variável simples</td>
</tr>

<tr>
<td class="org-left"><b>$nomeJogador</b></td>
<td class="org-left">Insere o valor de uma String dentro da frase</td>
</tr>

<tr>
<td class="org-left"><b>${primeiroNome} ${sobrenome}</b></td>
<td class="org-left">Junta duas variáveis com um espaço no meio</td>
</tr>

<tr>
<td class="org-left"><b>${itens * precoPorItem}</b></td>
<td class="org-left">Calcula o valor primeiro e depois insere o resultado</td>
</tr>

<tr>
<td class="org-left"><b>\$</b></td>
<td class="org-left">Mostra o símbolo de cifrão como texto normal</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-org898bec9" class="outline-4">
<h4 id="org898bec9">Um erro comum: esquecer as chaves</h4>
<div class="outline-text-4" id="text-org898bec9">
<p>
Se você colocar uma expressão mais complexa sem <b>${ }</b>, o Kotlin não vai entender do jeito certo.
Use chaves sempre que a parte dentro do texto não for só o nome de uma variável.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val itens = 3
val precoPorItem = 4.99

// Correto
println("Total: R$${itens * precoPorItem}")

// Também correto para nomes simples
println("Itens: $itens")
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf290cb2" class="outline-4">
<h4 id="orgf290cb2">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-orgf290cb2">
<p>
Crie um pequeno programa Kotlin para representar um usuário em um app.
Você precisa guardar:
</p>

<ul class="org-ul">
<li>o nome</li>
<li>o nível atual</li>
<li>a quantidade de moedas</li>
<li>se as notificações estão ativadas</li>
</ul>

<p>
Depois, use interpolação de strings para imprimir uma mensagem de boas-vindas natural, como algo que um app realmente mostraria.
O texto final deve ler como uma frase, não como uma lista de valores.
</p>

<p>
Exemplo de saída:
</p>

<div class="org-src-container">
<pre class="src src-console">Bem-vindo de volta, Ana! Você está no nível 7 com 320 moedas. Notificações ativadas: true.
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb60bb98" class="outline-4">
<h4 id="orgb60bb98">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-orgb60bb98">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Acabei de aprender interpolação de strings em Kotlin.
Me faça perguntas, uma de cada vez, para eu descobrir quando devo usar <b>$variavel</b> e quando devo usar <b>${ }</b>.
Se eu errar, explique o motivo.
</p>
</blockquote>

<p>
<b>Interpolação no código</b>
</p>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Em Kotlin, por que interpolação de strings é melhor do que concatenar texto com <b>+</b> em muitos casos?
Explique com exemplos simples e focados em leitura de código.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo curto em Kotlin mostrando interpolação de strings com uma String, um Int, um Double e um Boolean.
Mostre também um exemplo com uma expressão dentro de <b>${ }</b>.
Comente cada linha explicando o que ela faz.
Escreva para um iniciante absoluto.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
</div>
<div id="outline-container-orgb85139a" class="outline-2">
<h2 id="orgb85139a">Etapa 2: Tomando Decisões</h2>
<div class="outline-text-2" id="text-orgb85139a">
<p>
Agora que você já sabe imprimir valores, usar variáveis e entender os tipos básicos, chegou a hora de ensinar o Kotlin a <b>tomar decisões</b>.
</p>

<p>
Na prática, isso começa com uma pergunta simples: um valor é maior que o outro? Dois textos são iguais? Um número passou de um limite? Quando você aprende a responder esse tipo de pergunta, você abre a porta para escrever código que reage ao mundo real e toma decisões com base no usuário.
</p>

<p>
Nesta etapa, você vai aprender a comparar valores e descobrir o que o Kotlin devolve quando faz essas comparações. O resultado quase sempre será um <b>Boolean</b>, ou seja, <b>true</b> ou <b>false</b>.
</p>
</div>
<div id="outline-container-org1643588" class="outline-3">
<h3 id="org1643588">2.1 Operadores de comparação</h3>
<div class="outline-text-3" id="text-org1643588">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=ruDtG2fSy_o">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Antes do seu código conseguir decidir qualquer coisa, ele precisa conseguir <b>comparar</b> valores.
</p>

<p>
Pense em um segurança conferindo um documento. Ele olha a idade da pessoa, compara com a idade mínima permitida e decide se a resposta é sim ou não. O seu código faz a mesma coisa: compara dois valores e devolve um resultado lógico.
</p>

<p>
Em Kotlin, esse resultado é um <b>Boolean</b>. Você já viu esse tipo antes na Etapa 1. Agora vai entender de onde ele aparece de verdade.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val minhaIdade = 20
val idadeMinima = 18

val idadeSuficiente = minhaIdade &gt;= idadeMinima
println(idadeSuficiente)

val souIgual = minhaIdade == idadeMinima
println(souIgual)

val maisNovo = minhaIdade &lt; idadeMinima
println(maisNovo)
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">true
false
false
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left"><b>Expressão</b></th>
<th scope="col" class="org-left"><b>O que ela faz</b></th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>minhaIdade &gt;= idadeMinima</b></td>
<td class="org-left">Verifica se 20 é maior ou igual a 18. Como é, o resultado é <b>true</b>.</td>
</tr>

<tr>
<td class="org-left"><b>minhaIdade == idadeMinima</b></td>
<td class="org-left">Verifica se 20 é exatamente igual a 18. Não é, então o resultado é <b>false</b>.</td>
</tr>

<tr>
<td class="org-left"><b>minhaIdade &lt; idadeMinima</b></td>
<td class="org-left">Verifica se 20 é menor que 18. Não é, então o resultado é <b>false</b>.</td>
</tr>

<tr>
<td class="org-left"><b>idadeSuficiente</b></td>
<td class="org-left">Guarda o resultado de uma comparação. Em Kotlin, comparações sempre retornam <b>Boolean</b>.</td>
</tr>
</tbody>
</table>
</div>
<div id="outline-container-org29ea083" class="outline-4">
<h4 id="org29ea083">Os seis operadores de comparação</h4>
<div class="outline-text-4" id="text-org29ea083">
<p>
Kotlin tem seis operadores principais para comparar valores:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">println(5 == 5)             // true
println(5 != 6)             // true
println(3 &lt; 10)             // true
println(10 &gt; 3)             // true
println(3 &lt;= 5)             // true
println(5 &gt;= 5)             // true
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">true
true
true
true
true
true
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left"><b>Operador</b></th>
<th scope="col" class="org-left"><b>O que ele verifica</b></th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>==</b></td>
<td class="org-left">Dois valores são exatamente iguais?</td>
</tr>

<tr>
<td class="org-left"><b>!=</b></td>
<td class="org-left">Dois valores são diferentes?</td>
</tr>

<tr>
<td class="org-left"><b>&lt;</b></td>
<td class="org-left">O valor da esquerda é menor que o da direita?</td>
</tr>

<tr>
<td class="org-left"><b>&gt;</b></td>
<td class="org-left">O valor da esquerda é maior que o da direita?</td>
</tr>

<tr>
<td class="org-left"><b>&lt;=</b></td>
<td class="org-left">O valor da esquerda é menor ou igual ao da direita?</td>
</tr>

<tr>
<td class="org-left"><b>&gt;=</b></td>
<td class="org-left">O valor da esquerda é maior ou igual ao da direita?</td>
</tr>
</tbody>
</table>

<blockquote>
<p>
<b>Dica de memória:</b> a abertura do símbolo sempre aponta para o número menor.
</p>

<p>
Em <b>3 &lt; 10</b>, a abertura do operador fica virada para o 3, que é o menor valor.
Em <b>10 &gt; 3</b>, a abertura também aponta para o 3, porque ele continua sendo o menor.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org3b03efb" class="outline-4">
<h4 id="org3b03efb">O operador de negação.</h4>
<div class="outline-text-4" id="text-org3b03efb">
<p>
Se você tiver um Boolean e quiser inverter a forma com que você lida com o valor, você pode negar a operação.
</p>

<p>
Por exemplo, ao invés de falar, <b>souNovo</b>, você quer falar, <b>naoSouNovo</b>.
</p>

<p>
Então você faria:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val souNovo = minhaIdade &lt; idadeMinima
println(souNovo)

val naoSouNovo = !souNovo
println(naoSouNovo)
</pre>
</div>

<p>
O sinal <code>!</code> inverte um Boolean. Então se ele é verdadeiro o resultado é falso e se ele é falso o resultado é verdadeiro.
</p>
</div>
</div>
<div id="outline-container-org7090ce5" class="outline-4">
<h4 id="org7090ce5">Um erro muito comum: <code>x = y</code> não é comparação</h4>
<div class="outline-text-4" id="text-org7090ce5">
<p>
Em Kotlin, um sinal de igual sozinho (<b>=</b>) serve para <b>atribuir</b> um valor.
</p>

<p>
Dois sinais de igual (<b>==</b>) servem para <b>comparar</b> dois valores.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val idade = 20
val maiorDeIdade = idade &gt;= 18

println(maiorDeIdade)   // true
</pre>
</div>

<p>
Se você tentar escrever algo como <b>idade = 18</b> em um lugar onde o Kotlin espera uma comparação, vai acabar trocando o valor em vez de testar se ele é igual.
</p>

<blockquote>
<p>
<b>Resumo rápido:</b>
</p>

<ul class="org-ul">
<li><b>=</b> atribui</li>
<li><b>==</b> compara</li>
</ul>
</blockquote>
</div>
</div>
<div id="outline-container-orgbe691d6" class="outline-4">
<h4 id="orgbe691d6">Comparando textos também funciona</h4>
<div class="outline-text-4" id="text-orgbe691d6">
<p>
Os operadores de igualdade também funcionam com <b>String</b>.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">println("Kotlin" == "Kotlin")   // true
println("Kotlin" == "kotlin")   // false
println("casa" != "carro")      // true
</pre>
</div>

<p>
Isso acontece porque Kotlin é sensível a maiúsculas e minúsculas. <b>"Kotlin"</b> e <b>"kotlin"</b> são textos diferentes.
</p>
</div>
</div>
<div id="outline-container-org556466a" class="outline-4">
<h4 id="org556466a">Quando isso começa a ser útil?</h4>
<div class="outline-text-4" id="text-org556466a">
<p>
Comparações aparecem o tempo todo em programas reais:
</p>

<ul class="org-ul">
<li>verificar se a senha tem tamanho suficiente</li>
<li>confirmar se um saldo passou de um limite</li>
<li>descobrir se uma idade permite acesso</li>
<li>comparar notas, preços, quantidades e status</li>
</ul>

<p>
Se algo precisa virar <b>sim</b> ou <b>não</b>, comparação é quase sempre o primeiro passo.
</p>
</div>
</div>
<div id="outline-container-org0e57fb8" class="outline-4">
<h4 id="org0e57fb8">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org0e57fb8">
<p>
Imagine que você está criando um sistema simples de login.
</p>

<p>
O usuário digitou uma senha, e você precisa descobrir:
</p>

<ul class="org-ul">
<li>Se a senha está correta</li>
<li>Como inverter um Boolean usando !</li>
</ul>

<p>
<b>Regras do exercício</b>
</p>

<ul class="org-ul">
<li>Crie uma variável chamada senhaCorreta com o valor "kotlin123".</li>
<li>Crie uma variável chamada senhaDigitada com algum valor qualquer (teste tanto correto quanto errado).</li>
<li>Compare as duas senhas e guarde o resultado em uma variável senhaValida.</li>
<li>Crie uma variável chamada senhaInvalida usando negação (!).</li>
<li><p>
Imprima todos os resultados no terminal.
</p>

<p>
Possíveis saídas esperadas:
</p>

<p>
SUCESSO:
</p>
<div class="org-src-container">
<pre class="src src-nil">Senha é valida: true
A senha digita é kotlin123
A senha é invalida: false
</pre>
</div>

<p>
FALHA:
</p>
<div class="org-src-container">
<pre class="src src-nil">Senha é valida: false
A senha digita é kotlin1234
A senha é invalida: true
</pre>
</div></li>
</ul>
</div>
</div>
<div id="outline-container-orga6868a9" class="outline-4">
<h4 id="orga6868a9">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-orga6868a9">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Explique em português simples o que os operadores de comparação fazem em Kotlin. Use uma analogia do mundo real e depois me faça perguntas uma por uma para eu praticar.
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Qual é a diferença entre = e == em Kotlin? Explique como se eu estivesse confundindo os dois pela primeira vez.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo curto em Kotlin usando todos os seis operadores de comparação <code>==, !=, &lt;, &gt;, &lt;=, &gt;=</code> em um cenário realista. Comente cada linha explicando o que ela faz para um iniciante absoluto.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-org15bec5d" class="outline-3">
<h3 id="org15bec5d">2.2 if / else if / else</h3>
<div class="outline-text-3" id="text-org15bec5d">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=8dJtP80IGc8">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Agora que você já consegue comparar valores e obter um resultado <b>true</b> ou <b>false</b>, precisa de uma forma de agir com base nesse resultado. É exatamente isso que um bloco <code>if</code> faz. Ele permite que o código siga caminhos diferentes dependendo de uma condição.
</p>

<p>
Pense em um semáforo. Quando o sinal está verde, os carros andam. Quando está amarelo, eles reduzem a velocidade. Quando está vermelho, eles param. Cada cor dispara uma ação diferente. Um bloco <code>if</code> funciona do mesmo jeito: <b>se</b> a condição for verdadeira, faça uma coisa; <b>senão</b>, faça outra.
</p>

<p>
Essa é uma das ideias mais importantes de toda a programação. Todo aplicativo usa <code>if</code> o tempo todo para verificar se você está logado, se um formulário foi preenchido, se uma nota é suficiente ou se um preço passou de um limite. Quando você entende isso, começa a escrever código que realmente responde ao que acontece.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val nota = 75            // A nota de um aluno, de 0 a 100

if (nota &gt;= 90) {        // Verifica se a nota é 90 ou maior
    println("A")         // Só executa quando a condição acima é verdadeira
} else if (nota &gt;= 80) { // Só é verificado se a primeira condição for falsa
    println("B")         // Executa quando a nota está entre 80 e 89
} else if (nota &gt;= 70) { // Só é verificado se as anteriores forem falsas
    println("C")         // 75 cai aqui, então este bloco executa
} else {                 // Executa quando nenhuma condição anterior for verdadeira
    println("F")         // Cobre qualquer nota abaixo de 70
}
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Conceito: C
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left"><b>Parte</b></th>
<th scope="col" class="org-left"><b>O que ela faz</b></th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>if (nota &gt;= 90) { }</code></td>
<td class="org-left">A primeira condição que o Kotlin verifica. Se for verdadeira, o código dentro das chaves executa e o restante é ignorado.</td>
</tr>

<tr>
<td class="org-left"><code>else if (nota &gt;= 80) { }</code></td>
<td class="org-left">Só é avaliado se a primeira condição for falsa. Você pode encadear quantos <code>else if</code> precisar.</td>
</tr>

<tr>
<td class="org-left"><code>else { }</code></td>
<td class="org-left">A rede de segurança. Executa quando nenhuma outra condição correspondeu. Não é obrigatório, mas costuma ser uma boa prática.</td>
</tr>

<tr>
<td class="org-left">As chaves <code>{ }</code></td>
<td class="org-left">Tudo entre <code>{</code> e <code>}</code> pertence àquela condição. Esse conjunto de linhas é chamado de <i>bloco</i>.</td>
</tr>
</tbody>
</table>

<blockquote>
<p>
<b>Comportamento-chave:</b> o Kotlin para de verificar assim que encontra a primeira condição verdadeira. No exemplo acima, quando <code>nota &gt;= 70</code> é verdadeira, o bloco <code>else</code> é ignorado completamente. Apenas um ramo executa por vez, mesmo que mais de uma condição possa ser verdadeira.
</p>
</blockquote>
</div>
<div id="outline-container-orgc7c3af6" class="outline-4">
<h4 id="orgc7c3af6">As Três Formas de um if</h4>
<div class="outline-text-4" id="text-orgc7c3af6">
<div class="org-src-container">
<pre class="src src-kotlin">val estaChovendo = true

if (estaChovendo) {                       // Um Boolean já é verdadeiro ou falso, sem precisar de == true
    println("Não esqueça o guarda-chuva!") // Só executa quando estaChovendo é true
}
// Se estaChovendo fosse false, nada seria impresso, e tudo bem
</pre>
</div>

<p>
O formato mais simples. Não precisa de <code>else</code> se você só quer agir quando a condição for verdadeira. Repare que você não escreve <code>estaChovendo == true</code> - um <code>Boolean</code> pode ser usado diretamente.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val estaLogado = false

if (estaLogado) {
    println("Bem-vindo de volta!")   // Executa quando estaLogado é true
} else {
    println("Por favor, entre.")     // Executa quando estaLogado é false
}
</pre>
</div>

<p>
Exatamente um dos dois blocos sempre executa. É perfeito para decisões binárias: logado ou não, dia ou noite, aprovado ou reprovado.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val hora = 14                        // 14h no formato de 24 horas

if (hora &lt; 12) {
    println("Bom dia!")              // Horas de 0 a 11
} else if (hora &lt; 18) {
    println("Boa tarde!")            // Horas de 12 a 17 - 14 entra aqui
} else {
    println("Boa noite!")            // Horas de 18 em diante
}
</pre>
</div>

<p>
Adicione quantos <code>else if</code> quiser. O Kotlin verifica de cima para baixo e para no primeiro caso verdadeiro.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val temIngresso = true
val idade = 16

if (temIngresso) {                     // Primeira verificação: a pessoa tem ingresso?
    if (idade &gt;= 18) {                 // Segunda verificação - só acontece se tiver ingresso
        println("Aproveite o show!")
    } else {
        println("Desculpe, apenas maiores de idade.") // Tem ingresso, mas é menor de 18
    }
} else {
    println("Sem ingresso, sem entrada.")
}
</pre>
</div>

<p>
Você pode aninhar blocos <code>if</code> dentro de outros <code>if</code>. O importante é manter a indentação clara para identificar a qual bloco cada <code>}</code> pertence. Em seguida, você verá uma forma mais limpa de lidar com várias condições ao mesmo tempo usando operadores lógicos.
</p>
</div>
</div>
<div id="outline-container-orgeda4ba5" class="outline-4">
<h4 id="orgeda4ba5">Dica de indentação</h4>
<div class="outline-text-4" id="text-orgeda4ba5">
<p>
O editor geralmente ajusta a indentação quando você pressiona Enter depois de abrir uma chave. Se a estrutura parecer bagunçada, selecione o código e reindente tudo. Uma indentação consistente facilita encontrar bugs.
</p>
</div>
</div>
<div id="outline-container-org2e55ba0" class="outline-4">
<h4 id="org2e55ba0">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org2e55ba0">
<p>
Crie um programa que mostre uma mensagem diferente com base na temperatura.
</p>

<p>
<b>Regras do exercício</b>
</p>

<ul class="org-ul">
<li>Crie uma variável chamada <code>temperaturaC</code> com a temperatura de hoje em Celsius.</li>
<li>Escreva uma cadeia <code>if / else if / else</code> que imprima mensagens diferentes:
<ul class="org-ul">
<li>abaixo de 0: <code>"Congelando! Se agasalhe."</code></li>
<li>de 0 a 14: <code>"Frio. Pegue um casaco."</code></li>
<li>de 15 a 25: <code>"Clima agradável hoje!"</code></li>
<li>acima de 25: <code>"Muito quente! Beba água."</code></li>
</ul></li>
<li>Teste alterando o valor e executando novamente.</li>
</ul>

<p>
<b>Dica:</b> você vai precisar de quatro ramos. Comece do mais frio para o mais quente, de cima para baixo. O Kotlin para no primeiro teste verdadeiro, então a ordem das verificações importa.
</p>
</div>
</div>
<div id="outline-container-orgbb6b46a" class="outline-4">
<h4 id="orgbb6b46a">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-orgbb6b46a">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Explique em português simples o que um bloco if faz em Kotlin. Use um exemplo do mundo real e depois me faça perguntas uma por uma para eu praticar.
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Qual é a diferença entre escrever vários if separados e usar uma cadeia if / else if / else em Kotlin? Explique primeiro o conceito, antes de mostrar código.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo em Kotlin usando if, if / else e if / else if / else em um cenário realista, como mostrar mensagens com base em pontuação ou desconto. Comente cada linha explicando o que ela faz para um iniciante absoluto.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-org5ce7c35" class="outline-3">
<h3 id="org5ce7c35">2.3 Operadores lógicos (&amp;&amp; || !)</h3>
<div class="outline-text-3" id="text-org5ce7c35">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=qDUi7ueETNQ">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Até agora você verificou uma condição por vez. Mas decisões reais geralmente envolvem mais de uma coisa. "Você pode assistir a este filme se tiver 18 anos ou mais E tiver uma assinatura." "Você ganha desconto se for seu aniversário OU se você for membro." Esses são exemplos de várias condições combinadas em uma única decisão.
</p>

<p>
O Kotlin oferece três <b>operadores lógicos</b> para isso. <code>&amp;&amp;</code> significa E, <code>||</code> significa OU, e <code>!</code> significa NÃO. Eles permitem combinar ou inverter valores <code>Boolean</code> para expressar condições mais complexas sem precisar aninhar vários blocos <code>if</code> dentro de outros blocos <code>if</code>.
</p>

<p>
A boa notícia é que esses operadores funcionam como as palavras "e", "ou" e "não". Quando você faz essa conexão, eles ficam muito mais naturais de ler e escrever.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val idade = 20                         // A idade do usuário
val temAssinatura = true               // Se ele tem uma assinatura ativa
val aniversario = false              // Se hoje é o aniversário dele

// E: as duas condições precisam ser verdadeiras
if (idade &gt;= 18 &amp;&amp; temAssinatura) {
    println("Aproveite o conteúdo!")   // Executa: as duas condições são true
}

// OU: pelo menos uma condição precisa ser verdadeira
if (temAssinatura || aniversario) {
    println("Você ganhou um bônus!")   // Executa: temAssinatura é true
}

// NÃO: inverte um Boolean de true para false, ou de false para true
if (!aniversario) {
    println("Sem bônus de aniversário hoje.") // Executa: !false vira true
}
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Aproveite o conteúdo!
Você ganhou um bônus!
Sem bônus de aniversário hoje.
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left"><b>Operador</b></th>
<th scope="col" class="org-left"><b>O que significa</b></th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>&amp;&amp;</code> (E)</td>
<td class="org-left">Os dois lados precisam ser <code>true</code> para o resultado ser <code>true</code>. Se qualquer lado for <code>false</code>, a condição inteira vira <code>false</code>.</td>
</tr>

<tr>
<td class="org-left"><code>II</code> (OU)</td>
<td class="org-left">Pelo menos um lado precisa ser <code>true</code>. A condição inteira só vira <code>false</code> quando os dois lados são <code>false</code>.</td>
</tr>

<tr>
<td class="org-left"><code>!</code> (NÃO)</td>
<td class="org-left">Inverte um <code>Boolean</code>. <code>!true</code> vira <code>false</code>. <code>!false</code> vira <code>true</code>. Coloque diretamente antes do <code>Boolean</code>.</td>
</tr>
</tbody>
</table>
</div>
<div id="outline-container-org1f89cea" class="outline-4">
<h4 id="org1f89cea">&amp;&amp;: E - todas as condições precisam passar</h4>
<div class="outline-text-4" id="text-org1f89cea">
<div class="org-src-container">
<pre class="src src-kotlin">val temDocumento = true
val estaNaLista = false

if (temDocumento &amp;&amp; estaNaLista) {          // Os dois precisam ser true
    println("Pode entrar!")
} else {
    println("Desculpe, você precisa dos dois.") // Executa: estaNaLista é false
}
</pre>
</div>

<p>
Com <code>&amp;&amp;</code>, um único valor falso já é suficiente para tornar a condição inteira falsa. Isso substitui o padrão de <code>if</code> aninhado da aula 2.2 por uma escrita mais limpa e mais próxima da linguagem natural.
</p>
</div>
</div>
<div id="outline-container-org04f50cf" class="outline-4">
<h4 id="org04f50cf">||: OU - qualquer condição verdadeira é suficiente</h4>
<div class="outline-text-4" id="text-org04f50cf">
<div class="org-src-container">
<pre class="src src-kotlin">val estudante = false
val idoso = true

if (estudante || idoso) {              // Pelo menos um precisa ser true
    println("Ingresso com desconto!")      // Executa: idoso é true
} else {
    println("Preço cheio.")
}
</pre>
</div>

<p>
Com <code>||</code>, a condição só falha quando todas as partes são falsas. Mesmo que dez coisas sejam falsas, uma única parte verdadeira faz a condição inteira ser verdadeira.
</p>
</div>
</div>
<div id="outline-container-org0b37638" class="outline-4">
<h4 id="org0b37638">!: NÃO - inverte o valor Boolean</h4>
<div class="outline-text-4" id="text-org0b37638">
<div class="org-src-container">
<pre class="src src-kotlin">var jogoAcabou = false

if (!jogoAcabou) {                         // Leia: "se NÃO jogoAcabou"
    println("Continue jogando!")           // !false vira true, então executa
}
</pre>
</div>

<p>
Coloque <code>!</code> diretamente antes de um <code>Boolean</code>: <code>!jogoAcabou</code>. Muitas vezes isso fica mais limpo do que escrever <code>jogoAcabou == false</code>.
</p>
</div>
</div>
<div id="outline-container-orgd02ec3d" class="outline-4">
<h4 id="orgd02ec3d">Combinando operadores com parênteses</h4>
<div class="outline-text-4" id="text-orgd02ec3d">
<div class="org-src-container">
<pre class="src src-kotlin">val fimDeSemana = true
val temTarefas = false
val amigosDisponiveis = true

// Pode sair se: é fim de semana E (não tem tarefas OU os amigos estão livres)
if (fimDeSemana &amp;&amp; (!temTarefas || amigosDisponiveis)) {
    println("Vamos sair!")                 // Executa: todas as condições foram satisfeitas
}
</pre>
</div>

<p>
Use parênteses para agrupar condições quando misturar operadores. A parte entre parênteses é avaliada primeiro, como na matemática. Sem parênteses, <code>&amp;&amp;</code> tem prioridade maior que <code>||</code>, mas os parênteses deixam sua intenção explícita e tornam o código mais fácil de ler.
</p>

<blockquote>
<p>
<b>Atenção ao !:</b> escreva <code>!jogoAcabou</code>. O operador <code>!</code> deve ficar diretamente antes do valor que ele está invertendo.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org9c57a0c" class="outline-4">
<h4 id="org9c57a0c">Priorize legibilidade</h4>
<div class="outline-text-4" id="text-org9c57a0c">
<p>
Se uma condição estiver ficando longa e difícil de acompanhar, divida em constantes <code>Boolean</code> com nomes claros.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val idade = 19
val temIngresso = true
val podeEntrar = idade &gt;= 18 &amp;&amp; temIngresso

if (podeEntrar) {
    println("Entrada liberada.")
}
</pre>
</div>

<p>
A lógica é a mesma, mas <code>if (podeEntrar)</code> é muito mais fácil de entender de relance.
</p>
</div>
</div>
<div id="outline-container-org42e756c" class="outline-4">
<h4 id="org42e756c">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org42e756c">
<p>
Crie um programa que verifique se uma pessoa pode ir em um brinquedo de parque.
</p>

<p>
<b>Regras do exercício</b>
</p>

<ul class="org-ul">
<li>O brinquedo tem duas regras:
<ul class="org-ul">
<li>a pessoa precisa ter pelo menos 120 cm de altura;</li>
<li>a pessoa não pode ter medo de altura.</li>
</ul></li>
<li>Crie uma variável <code>alturaCm</code> do tipo <code>Int</code>.</li>
<li>Crie uma variável <code>temMedoDeAltura</code> do tipo <code>Boolean</code>.</li>
<li>Escreva um <code>if / else</code> que imprima <code>"Aproveite o brinquedo!"</code> quando os dois requisitos forem atendidos.</li>
<li>Se não puder ir, imprima uma mensagem específica explicando qual requisito não foi atendido.</li>
<li>Tente mostrar uma mensagem diferente para cada cenário de falha.</li>
</ul>

<p>
<b>Dica:</b> para verificar se a pessoa pode ir, você vai combinar <code>&amp;&amp;</code> e <code>!</code>. Para as mensagens de falha, pense em usar ramos <code>else if</code> verificando cada condição individualmente.
</p>
</div>
</div>
<div id="outline-container-org3543345" class="outline-4">
<h4 id="org3543345">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-org3543345">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Explique os operadores &amp;&amp;, || e ! em Kotlin usando uma analogia que não envolva programação, como entrar em um parque, conseguir um desconto ou passar por uma verificação. Depois me faça cinco perguntas de verdadeiro ou falso, uma por vez, para eu descobrir o resultado de combinar dois Booleans.
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Explique o que é avaliação de curto-circuito em Kotlin. Quero entender por que às vezes o Kotlin nem verifica a segunda condição. Explique o conceito em português simples antes de mostrar qualquer código.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo em Kotlin que use &amp;&amp;, || e ! juntos em um cenário realista de aplicativo, como verificar se um usuário pode acessar conteúdo premium ou se uma compra deve receber desconto. Use os três operadores pelo menos uma vez e comente cada linha explicando a lógica para um iniciante.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-org59eff78" class="outline-3">
<h3 id="org59eff78">2.4 Expressões com when</h3>
<div class="outline-text-3" id="text-org59eff78">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=gRONOfKMxoA">Assista o video desta lição</a>
</p>
</blockquote>



<p>
Até agora você usou <code>if / else if / else</code> para lidar com várias condições. Isso funciona muito bem, mas quando você está verificando <b>um valor específico</b> contra uma lista de possibilidades, o Kotlin oferece uma opção mais limpa: <code>when</code>.
</p>

<p>
Pense em uma máquina de salgadinhos. Você digita A1 e recebe batata. Digita B2 e recebe uma bebida. Digita C3 e recebe chocolate. A máquina não precisa explicar uma condição gigante para cada possibilidade; ela olha para o código digitado e escolhe a resposta correspondente. O <code>when</code> funciona com essa mesma ideia.
</p>

<p>
Em outras linguagens, você talvez veja algo chamado <code>switch</code>. Em Kotlin, o equivalente moderno é <code>when</code>. Ele consegue comparar valores exatos, agrupar várias opções, testar intervalos e até retornar um valor.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val dia = "segunda"                    // O valor que queremos verificar

when (dia) {                           // Começa o when usando a variável dia
    "segunda" -&gt; {
        println("De volta aos estudos.") // Executa: dia é "segunda"
    }
    "sexta" -&gt; {
        println("Quase fim de semana!")
    }
    "sábado", "domingo" -&gt; {           // Dois valores podem compartilhar o mesmo bloco
        println("Aproveite o fim de semana!")
    }
    else -&gt; {                          // Cobre qualquer valor que não apareceu acima
        println("Mais um dia comum.")
    }
}
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">De volta aos estudos.
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left"><b>Parte</b></th>
<th scope="col" class="org-left"><b>O que ela faz</b></th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>when (dia) { }</code></td>
<td class="org-left">Diz ao Kotlin qual valor será comparado.</td>
</tr>

<tr>
<td class="org-left"><code>"segunda" -&gt; { }</code></td>
<td class="org-left">Se <code>dia</code> for igual a <code>"segunda"</code>, o bloco depois da seta executa.</td>
</tr>

<tr>
<td class="org-left"><code>"sábado", "domingo" -&gt; { }</code></td>
<td class="org-left">Permite agrupar vários valores que devem produzir a mesma resposta.</td>
</tr>

<tr>
<td class="org-left"><code>else -&gt; { }</code></td>
<td class="org-left">Funciona como o <code>else</code> do <code>if</code>. Executa quando nenhum caso anterior combina.</td>
</tr>
</tbody>
</table>

<blockquote>
<p>
<b>Diferença importante:</b> em Kotlin, você não precisa escrever <code>break</code> no final de cada caso. Quando um ramo do <code>when</code> executa, o Kotlin não continua executando os próximos ramos automaticamente.
</p>
</blockquote>
</div>
<div id="outline-container-orgfb19619" class="outline-4">
<h4 id="orgfb19619">Usando vários valores no mesmo ramo</h4>
<div class="outline-text-4" id="text-orgfb19619">
<p>
Se várias opções devem fazer a mesma coisa, separe os valores por vírgula.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val mes = 2

when (mes) {
    1, 2, 3 -&gt; {
        println("Começo do ano")       // Executa: mes é 2
    }
    4, 5, 6 -&gt; {
        println("Meio do primeiro semestre")
    }
    7, 8, 9 -&gt; {
        println("Segundo semestre começou")
    }
    10, 11, 12 -&gt; {
        println("Fim do ano chegando")
    }
    else -&gt; {
        println("Mês inválido")
    }
}
</pre>
</div>

<p>
Isso evita repetir o mesmo <code>println</code> várias vezes. Um único ramo cobre todas as opções que têm o mesmo significado para o programa.
</p>
</div>
</div>
<div id="outline-container-org9bab205" class="outline-4">
<h4 id="org9bab205">Verificando intervalos com in</h4>
<div class="outline-text-4" id="text-org9bab205">
<p>
O <code>when</code> também consegue testar se um número está dentro de um intervalo usando <code>in</code>.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val nota = 83

when (nota) {
    in 90..100 -&gt; {
        println("Conceito: A")
    }
    in 80..89 -&gt; {
        println("Conceito: B")         // Executa: 83 está entre 80 e 89
    }
    in 70..79 -&gt; {
        println("Conceito: C")
    }
    in 0..69 -&gt; {
        println("Conceito: F")
    }
    else -&gt; {
        println("Nota inválida")
    }
}
</pre>
</div>

<p>
O intervalo <code>80..89</code> significa "de 80 até 89, incluindo os dois números". Para classificações, faixas de preço, idade, nível ou pontuação, isso costuma ficar mais legível do que uma longa cadeia de <code>else if</code>.
</p>
</div>
</div>
<div id="outline-container-org51de700" class="outline-4">
<h4 id="org51de700">Usando when como expressão</h4>
<div class="outline-text-4" id="text-org51de700">
<p>
Uma das partes mais úteis do <code>when</code> é que ele pode <b>devolver um valor</b>. Em vez de apenas executar um <code>println</code>, você pode guardar o resultado em uma variável.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val codigo = "B2"

val produto = when (codigo) {
    "A1" -&gt; "Batata"
    "B2" -&gt; "Refrigerante"             // Executa: produto recebe "Refrigerante"
    "C3" -&gt; "Chocolate"
    else -&gt; "Produto desconhecido"
}

println(produto)
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Refrigerante
</pre>
</div>

<p>
Quando você usa <code>when</code> para preencher uma variável, o Kotlin precisa garantir que sempre haverá algum resultado. Por isso, o ramo <code>else</code> é importante quando nem todas as possibilidades foram cobertas.
</p>
</div>
</div>
<div id="outline-container-org835ce56" class="outline-4">
<h4 id="org835ce56">when sem valor inicial</h4>
<div class="outline-text-4" id="text-org835ce56">
<p>
Você também pode usar <code>when</code> sem colocar uma variável entre parênteses. Nesse formato, cada ramo vira uma condição completa, parecido com <code>if / else if</code>.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">val temperatura = -5

when {
    temperatura &lt; 0 -&gt; {
        println("Congelando: $temperatura graus") // Executa: -5 é menor que 0
    }
    temperatura &gt; 30 -&gt; {
        println("Muito quente: $temperatura graus")
    }
    else -&gt; {
        println("Temperatura agradável: $temperatura graus")
    }
}
</pre>
</div>

<p>
Use esse formato quando você não está apenas comparando um valor contra opções fixas, mas quer escrever condições mais abertas.
</p>
</div>
</div>
<div id="outline-container-org956ac8e" class="outline-4">
<h4 id="org956ac8e">when vs if: quando usar cada um?</h4>
<div class="outline-text-4" id="text-org956ac8e">
<p>
Use <code>when</code> quando você está olhando para uma variável e escolhendo entre várias possibilidades claras: dia da semana, código de produto, status de pedido, nota, mês, tipo de usuário.
</p>

<p>
Use <code>if</code> quando a decisão envolve poucas condições, variáveis diferentes ou uma lógica mais livre.
</p>

<p>
Os dois podem resolver muitos dos mesmos problemas. A melhor escolha é a que deixa o código mais fácil de ler.
</p>
</div>
</div>
<div id="outline-container-orgd583eb1" class="outline-4">
<h4 id="orgd583eb1">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-orgd583eb1">
<p>
Crie um programa que mostre uma curiosidade de gravidade para planetas do sistema solar.
</p>

<p>
<b>Regras do exercício</b>
</p>

<ul class="org-ul">
<li>Crie uma variável chamada <code>planeta</code> do tipo <code>String</code>.</li>
<li>Use <code>when</code> para imprimir uma curiosidade de gravidade para pelo menos cinco planetas.</li>
<li>Exemplo: <code>"Marte: cerca de 0.38x a gravidade da Terra"</code>.</li>
<li>Agrupe dois planetas no mesmo ramo usando vírgula.</li>
<li>Inclua um ramo <code>else</code> que imprima <code>"Planeta desconhecido"</code>.</li>
</ul>

<p>
<b>Dica:</b> cada ramo compara uma <code>String</code>. Para listar dois valores no mesmo ramo, escreva algo como <code>"Mercúrio", "Marte" -&gt; { ... }</code>.
</p>
</div>
</div>
<div id="outline-container-org7ee2277" class="outline-4">
<h4 id="org7ee2277">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-org7ee2277">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Explique o when em Kotlin para um iniciante. Quero entender como ele se compara com uma cadeia if / else if / else e por que ele pode deixar o código mais legível. Use uma analogia do mundo real antes de mostrar código.
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Mostre um exemplo de when em Kotlin com um erro simples, como esquecer o else em uma expressão, usar um intervalo errado ou agrupar valores de forma incorreta. Peça para eu identificar o problema antes de explicar a resposta.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo em Kotlin usando when que demonstre três recursos: comparação com valores exatos, vários valores no mesmo ramo e intervalo com in. Use um cenário realista, como menu de restaurante, dificuldade de jogo ou status de entrega. Comente cada linha explicando o que ela faz para um iniciante absoluto.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
</div>
<div id="outline-container-org9754280" class="outline-2">
<h2 id="org9754280">Etapa 3: Repetindo Coisas</h2>
<div class="outline-text-2" id="text-org9754280">
<p>
Os programas raramente fazem algo apenas uma vez. Os aplicativos reais percorrem listas, repetem ações e processam conjuntos de dados. Nesta etapa, você aprenderá como fazer seu código se repetir e como decidir qual tipo de repetição se adequa à situação.
</p>
</div>
<div id="outline-container-orgc032306" class="outline-3">
<h3 id="orgc032306">3.1 for loop</h3>
<div class="outline-text-3" id="text-orgc032306">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=PsOCfPyLbb0">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Imagine que você precisasse escrever <code>println("Olá!")</code> dez vezes seguidas. Você até conseguiria, mas seria tedioso e sem sentido. Exatamente esse tipo de problema é o que um loop resolve.
</p>

<p>
Um <b>for loop</b> executa um bloco de código um número definido de vezes. Pense em um contador de voltas numa pista de corrida: você decide quantas voltas, o corredor corre, e o contador acompanha para você não precisar fazer isso.
</p>

<p>
Em Kotlin, você diz ao for loop quantas vezes executar dando a ele um <b>range</b> (intervalo), um número inicial e um número final. Veja a versão mais simples:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">for (i in 1..5) {          // executa para i = 1, 2, 3, 4, 5
    println("Volta $i")   // imprime o número da volta atual com interpolação de string
}
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Volta 1
Volta 2
Volta 3
Volta 4
Volta 5
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">PARTE</th>
<th scope="col" class="org-left">O QUE ELA FAZ</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>for</b></td>
<td class="org-left">A palavra-chave que inicia um for loop. O Kotlin entende que repetição está por vir.</td>
</tr>

<tr>
<td class="org-left"><b>i</b></td>
<td class="org-left">Uma variável temporária que guarda o valor atual da contagem. Ela recebe um novo valor automaticamente a cada repetição. Você pode nomear como quiser, <code>numero</code>, <code>contagem</code>, <code>volta</code>, o que fizer sentido.</td>
</tr>

<tr>
<td class="org-left"><b>in</b></td>
<td class="org-left">Conecta a variável ao range. Leia o conjunto como: "para cada valor de i, no intervalo de 1 a 5…"</td>
</tr>

<tr>
<td class="org-left"><b>1..5</b></td>
<td class="org-left">O operador de range fechado. Significa "todo número de 1 até 5, incluindo o 5". Os dois pontos são o operador de range.</td>
</tr>

<tr>
<td class="org-left"><b>{ }</b></td>
<td class="org-left">O corpo do loop. Tudo dentro dessas chaves executa uma vez para cada número do range.</td>
</tr>

<tr>
<td class="org-left"><b>println("Volta $i")</b></td>
<td class="org-left">Usa interpolação de string para imprimir o valor atual de i. Na primeira volta i é 1, depois 2, e assim por diante.</td>
</tr>
</tbody>
</table>

<blockquote>
<p>
<b>Erro comum:</b> iniciantes às vezes escrevem <code>for (i in 1..5)</code> e depois tentam usar <code>i</code> depois da chave de fechamento. Isso não funciona, <code>i</code> só existe dentro do loop. Quando o loop termina, ela desaparece.
</p>
</blockquote>
</div>
<div id="outline-container-org1d4d854" class="outline-4">
<h4 id="org1d4d854">Os dois operadores de range</h4>
<div class="outline-text-4" id="text-org1d4d854">
<p>
Kotlin tem duas formas de escrever um range, e elas diferem em um ponto importante: se o último número é incluído ou não.
</p>

<p>
<b>1..10 — Range fechado — inclui o último número</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">for (i in 1..10) {
    println(i) // imprime 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
}
</pre>
</div>

<p>
O operador de dois pontos (<code>..</code>) cria um range fechado. O loop executa para todo número de 1 até <b>incluindo</b> 10. Use quando quiser incluir o valor final.
</p>

<p>
<b>1 until 10 — Range semi-aberto — exclui o último número</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">for (i in 1 until 10) {
    println(i) // imprime 1, 2, 3, 4, 5, 6, 7, 8, 9 — para antes do 10
}
</pre>
</div>

<p>
A palavra-chave <code>until</code> cria um range semi-aberto. O loop executa até, mas <b>não incluindo</b>, o último número. É muito comum no desenvolvimento Android porque listas começam no índice 0.
</p>

<p>
<b>_ no lugar da variável — quando você não precisa do valor</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">for (_ in 1..3) {
    println("Olá!") // imprime "Olá!" exatamente 3 vezes
}
</pre>
</div>

<p>
Se você só quer executar um bloco de código um certo número de vezes e não precisa do valor atual da contagem, use <code>_</code> no lugar do nome da variável. O Kotlin entende isso como "sei que há um valor aqui, mas não preciso dele".
</p>

<p>
<b>step — contar em passos personalizados ou contar para trás</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Contar de 2 em 2: 0, 2, 4, 6, 8, 10
for (i in 0..10 step 2) {
    println(i)
}

// Contar para trás: 10, 8, 6, 4, 2, 0
for (i in 10 downTo 0 step 2) {
    println(i)
}
</pre>
</div>

<p>
Quando precisar contar em passos diferentes de 1, use <code>step</code>. Para contar de forma decrescente, use <code>downTo</code>. A palavra-chave <code>downTo</code> cria um range que vai do maior para o menor.
</p>

<blockquote>
<p>
<b>Vale saber:</b> o nome <code>i</code> é uma convenção de programação abreviação de "index" (índice) ou "iteration" (iteração). Você vai ver em todo lugar. Mas é só um nome de variável comum, fique à vontade para usar algo mais descritivo como <code>dia</code> ou <code>pontuacao</code> quando isso tornar o código mais fácil de ler.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org8bd0c33" class="outline-4">
<h4 id="org8bd0c33">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org8bd0c33">
<p>
Escreva um for loop que imprima a tabuada do 7, de 7 x 1 até 7 x 12. Cada linha deve ficar assim:
</p>

<div class="org-src-container">
<pre class="src src-console">7 x 1 = 7
</pre>
</div>

<p>
Depois tente um bônus: use um loop com <code>step</code> para imprimir apenas os múltiplos pares do 7 (7 x 2, 7 x 4, 7 x 6, e assim por diante até 7 x 12).
</p>

<blockquote>
<p>
<b>Dica:</b> use interpolação de string dentro do seu println. Você pode fazer contas diretamente dentro de <code>${ }</code> — por exemplo, <code>${7 * i}</code> te dá o resultado de 7 vezes i.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org6fdff19" class="outline-4">
<h4 id="org6fdff19">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-org6fdff19">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Explique a diferença entre o operador de range fechado <code>(1..10)</code> e o range semi-aberto com <code>until (1 until 10)</code> em Kotlin. Dê uma analogia do mundo real para cada um que não envolva programação. Depois me faça uma pergunta para verificar meu entendimento.
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Estou aprendendo for loops em Kotlin e quero ter certeza de que realmente entendi. Sem escrever nenhum código para mim, você pode me fazer 3 perguntas sobre for loops — uma de cada vez — e me dizer se acertei ou errei antes de continuar?
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo de for loop em Kotlin que conta de 10 para 1 e depois imprime "Decolar!" no final. Adicione um comentário em cada linha explicando o que ela faz e por quê — escreva os comentários para um iniciante absoluto que nunca viu um loop antes.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-org13ccd61" class="outline-3">
<h3 id="org13ccd61">3.3 while loop</h3>
<div class="outline-text-3" id="text-org13ccd61">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=wa594mfVeGc">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Um <code>for</code> loop é ótimo quando você sabe de antemão quantas vezes quer repetir algo. Mas e quando você não sabe? E se você quiser continuar até que algo mude?
</p>

<p>
Esse é o papel do <b>while loop</b>. Pense em uma máquina de refrigerante. Ela continua aceitando moedas enquanto o saldo for menor que o preço do item. Ela não sabe de antemão quantas moedas você vai colocar — ela só verifica a cada vez e para quando a condição é satisfeita.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">var moedas = 0      // começa com 0 moedas
val preco = 5       // o item custa 5 moedas

while (moedas &lt; preco) {    // continua enquanto não tiver moedas suficientes
    moedas += 1             // adiciona uma moeda a cada vez
    println("Moedas inseridas: $moedas")
}

println("Comprando!")       // isso executa depois que o loop termina
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Moedas inseridas: 1
Moedas inseridas: 2
Moedas inseridas: 3
Moedas inseridas: 4
Moedas inseridas: 5
Comprando!
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">PARTE</th>
<th scope="col" class="org-left">O QUE ELA FAZ</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>while</b></td>
<td class="org-left">A palavra-chave que inicia um while loop. O Kotlin continua repetindo o corpo do loop enquanto a condição for verdadeira.</td>
</tr>

<tr>
<td class="org-left"><b>moedas &lt; preco</b></td>
<td class="org-left">A condição. O Kotlin verifica isso antes de cada passagem. No momento em que se torna falsa (moedas igual a 5), o loop para imediatamente.</td>
</tr>

<tr>
<td class="org-left"><b>moedas += 1</b></td>
<td class="org-left">É o que muda a condição. Cada passagem adiciona 1 a moedas, então eventualmente a condição se tornará falsa. Sem essa linha, você teria um loop infinito.</td>
</tr>

<tr>
<td class="org-left">Código após o <code>}</code></td>
<td class="org-left">Executa uma vez depois que o loop termina. O loop precisa terminar antes do Kotlin continuar para a próxima instrução.</td>
</tr>
</tbody>
</table>

<blockquote>
<p>
<b>Zona de perigo — loops infinitos:</b> se a condição em um while loop nunca se tornar falsa, o loop executa para sempre e seu app trava. Isso se chama loop infinito. Sempre certifique-se de que algo dentro do loop eventualmente muda a condição. No exemplo acima, <code>moedas += 1</code> é o que eventualmente torna <code>moedas &lt; preco</code> falso.
</p>
</blockquote>
</div>
<div id="outline-container-org3538274" class="outline-4">
<h4 id="org3538274">Variações do while loop</h4>
<div class="outline-text-4" id="text-org3538274">
<p>
<b>do-while — sempre executa pelo menos uma vez antes de verificar a condição</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">var tentativas = 0

do {
    tentativas += 1
    println("Tentativa $tentativas")
} while (tentativas &lt; 3)    // a condição é verificada APÓS cada execução
</pre>
</div>

<p>
Um loop <code>do-while</code> é como um while loop, mas a condição é verificada no final em vez do início. Isso garante que o corpo do loop execute pelo menos uma vez, mesmo que a condição comece falsa. Use quando quiser garantir pelo menos uma tentativa — como exibir uma caixa de diálogo ou fazer uma primeira requisição de rede.
</p>

<p>
<b>while com variável Boolean — use um flag para controlar o loop de qualquer lugar dentro dele</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">var emExecucao = true   // este Boolean controla o loop
var contador = 0

while (emExecucao) {
    contador += 1
    println("Contagem: $contador")
    if (contador == 4) {
        emExecucao = false  // vira o flag para parar o loop
    }
}
</pre>
</div>

<p>
Usar uma variável Boolean como "flag" de condição dá um controle claro e legível. Quando a situação que deve parar o loop ocorrer, vire o flag para false. Isso é especialmente útil quando a condição de parada pode ocorrer em lugares diferentes dentro do corpo do loop.
</p>

<blockquote>
<p>
<b>Quando usar while vs for:</b> use um <code>for</code> loop quando você conhece a contagem exata ou tem uma coleção para percorrer. Use um <code>while</code> loop quando o ponto de parada depende de algo que muda enquanto o loop executa — como entrada do usuário, um estado de jogo ou uma resposta de rede chegando.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org880f3fa" class="outline-4">
<h4 id="org880f3fa">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org880f3fa">
<p>
Você quer economizar R$ 500. Você começa com R$ 0 e adiciona R$ 75 a cada semana. Escreva um while loop que imprima seu saldo de poupança ao final de cada semana e pare quando atingir ou ultrapassar R$ 500. Ao final, imprima também quantas semanas levou.
</p>

<p>
Bônus: tente a mesma coisa usando um loop <code>do-while</code> e veja se a saída é diferente.
</p>

<blockquote>
<p>
<b>Dica:</b> você vai precisar de duas variáveis — uma para o saldo atual e outra para contar as semanas. A variável de saldo precisa ser <code>var</code> porque muda. Pense se sua condição deve ser <code>saldo &lt; 500</code> ou <code>saldo &lt;= 500</code> e qual diferença isso faz.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-orgea92a49" class="outline-4">
<h4 id="orgea92a49">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-orgea92a49">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Explique a diferença entre um while loop e um do-while loop em Kotlin usando uma analogia do mundo real — algo que não envolva código. Depois me diga uma situação específica onde você escolheria do-while em vez de while e explique o porquê.
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Quero entender o que torna um while loop diferente de um for loop em nível conceitual — não apenas sintaticamente. Quando um desenvolvedor experiente usaria um while loop em vez de um for loop? Me dê 3 cenários em português simples antes de mostrar qualquer código.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um while loop em Kotlin que simule um jogo de adivinhação onde o "jogador" continua chutando até acertar o número correto. Use valores fixos, não números aleatórios reais — só faça parecer uma simulação. Adicione um comentário em cada linha para um iniciante.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-orga1ade79" class="outline-3">
<h3 id="orga1ade79">3.4 break e continue</h3>
<div class="outline-text-3" id="text-orga1ade79">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=bTkPXuFOhBg">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Loops nem sempre precisam executar perfeitamente do início ao fim. Às vezes você encontra uma situação em que quer parar o loop inteiro antes da hora. Outras vezes você quer pular apenas uma passagem, mas continuar executando. O Kotlin te dá duas palavras-chave para isso: <code>break</code> e <code>continue</code>.
</p>

<p>
Pense numa esteira de uma fábrica. <code>continue</code> é como dizer "pula esse item com defeito, mas mantém a esteira funcionando". <code>break</code> é como apertar o botão de parada de emergência — a esteira inteira para imediatamente.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// break: para o loop no momento em que encontramos o que precisamos
val alvo = 7

for (numero in 1..10) {
    println("Verificando: $numero")
    if (numero == alvo) {
        println("Encontrei!")
        break    // para o loop inteiro aqui mesmo
    }
}
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Verificando: 1
Verificando: 2
Verificando: 3
Verificando: 4
Verificando: 5
Verificando: 6
Verificando: 7
Encontrei!
</pre>
</div>

<p>
Note que o loop nunca chegou a verificar 8, 9 ou 10 — o <code>break</code> parou tudo no momento em que encontramos o que procurávamos.
</p>

<p>
Agora veja o <code>continue</code> — ele pula o restante da passagem atual e vai direto para a próxima:
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// continue: pula números pares, processa só os ímpares
for (numero in 1..10) {
    if (numero % 2 == 0) {
        continue    // pula este número e vai para o próximo
    }
    println("Ímpar: $numero")
}
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">Ímpar: 1
Ímpar: 3
Ímpar: 5
Ímpar: 7
Ímpar: 9
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">PALAVRA-CHAVE</th>
<th scope="col" class="org-left">O QUE ELA FAZ</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>break</b></td>
<td class="org-left">Sai imediatamente do loop inteiro. O código depois da chave de fechamento do loop continua executando normalmente, mas o loop em si terminou — nenhuma passagem adicional acontece.</td>
</tr>

<tr>
<td class="org-left"><b>continue</b></td>
<td class="org-left">Pula apenas o restante da passagem atual do loop. O loop em si continua executando — ele só vai direto para o próximo item ou próxima contagem, pulando qualquer código abaixo do <code>continue</code>.</td>
</tr>
</tbody>
</table>
</div>
<div id="outline-container-org468ea9a" class="outline-4">
<h4 id="org468ea9a">Mais padrões com break e continue</h4>
<div class="outline-text-4" id="text-org468ea9a">
<p>
<b>break em while — sai de um while loop quando uma condição interna é satisfeita</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">var energia = 100

while (true) {
    energia -= 15
    println("Energia restante: $energia")
    if (energia &lt;= 0) {
        println("Sem energia!")
        break    // sai do loop while true
    }
}
</pre>
</div>

<p>
<code>break</code> também funciona em while loops. Quando combinado com <code>while true</code>, é a única forma de parar o loop. Esse é um padrão limpo quando a lógica de parada é complexa — coloque a condição de saída onde fizer mais sentido no corpo do loop.
</p>

<p>
<b>continue para filtrar — use continue para processar apenas valores que atendem a uma condição</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">for (numero in 1..20) {
    if (numero % 3 != 0) {    // se o número não for múltiplo de 3
        continue               // pula ele
    }
    println("Múltiplo de 3: $numero")
}
</pre>
</div>

<p>
<code>continue</code> é ótimo para filtrar — pule os valores que não te interessam e processe apenas os que importam.
</p>

<p>
<b>break com label — saia de um loop externo específico de dentro de um loop aninhado</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">loopExterno@ for (i in 1..3) {
    for (j in 1..3) {
        if (i == 2 &amp;&amp; j == 2) {
            println("Parando tudo em ($i, $j)")
            break@loopExterno    // sai do loop externo, não só do interno
        }
        println("($i, $j)")
    }
}
</pre>
</div>

<p>
Sem um label, <code>break</code> só sai do loop mais interno. Adicione um label (um nome seguido de <code>@</code>) ao loop externo e use <code>break@nomeDoLabel</code> para sair daquele loop específico. Isso é menos comum, mas útil em situações de loops aninhados que você vai ver na próxima lição.
</p>

<blockquote>
<p>
<b>Confusão comum:</b> <code>break</code> sai do loop, <code>continue</code> pula uma passagem. Um erro muito comum é usar <code>break</code> quando você queria <code>continue</code>, o que para o loop inteiro quando você só queria pular um item. Releia a saída com cuidado quando algo parecer errado.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org48e91d0" class="outline-4">
<h4 id="org48e91d0">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-org48e91d0">
<p>
Escreva um loop que percorra os números de 1 a 50 e:
</p>

<ul class="org-ul">
<li>Pule qualquer número que seja múltiplo de 3 usando <code>continue</code> (não imprima nada para ele)</li>
<li>Imprima o número para qualquer outro caso</li>
<li>Pare o loop inteiro (com <code>break</code>) no momento em que encontrar um número maior que 30 que também seja múltiplo de 7</li>
</ul>

<blockquote>
<p>
<b>Dica:</b> verifique primeiro a condição de parada com um <code>if</code> e <code>break</code>. Depois verifique o múltiplo de 3 e use <code>continue</code>. Tudo que ainda estiver executando depois dessas verificações é um caso normal.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-orgaf2fe55" class="outline-4">
<h4 id="orgaf2fe55">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-orgaf2fe55">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Acabei de aprender sobre break e continue em loops do Kotlin. Você pode me dar 4 cenários curtos (descritos em português simples, sem código) e me pedir para decidir em cada um se break, continue, ou nenhum dos dois seria a ferramenta certa? Me diga se acertei ou errei e explique o porquê.
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Em Kotlin, o que acontece exatamente quando break é executado dentro de um loop aninhado? Ele sai de todos os loops ou só do interno? E o continue — ele pula para a próxima passagem do loop interno ou do externo? Explique com um exemplo claro antes de mostrar qualquer código.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo em Kotlin que percorre um range de números e usa tanto break quanto continue — break quando uma condição específica é satisfeita, continue para pular certos valores pelo caminho. Adicione um comentário em cada linha para um iniciante, e inclua um comentário explicando exatamente quando e por que a execução salta nas linhas de break e continue.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-org4cc6872" class="outline-3">
<h3 id="org4cc6872">3.5 nested loops</h3>
<div class="outline-text-3" id="text-org4cc6872">
<blockquote>
<p>
Prefere assistir ao video? <a href="https://www.youtube.com/watch?v=71aE6vHLfcU">Assista o video desta lição</a>
</p>
</blockquote>

<p>
Um <b>nested loop</b> (loop aninhado) é simplesmente um loop dentro de outro loop. O loop externo executa uma passagem, e para cada passagem do loop externo, o loop interno inteiro executa do começo ao fim. Depois o loop externo avança para a próxima passagem, e o loop interno executa tudo de novo, do zero.
</p>

<p>
Pense num relógio. O ponteiro de minutos (loop externo) avança uma vez por hora. A cada vez que ele avança, o ponteiro de segundos (loop interno) completa um ciclo inteiro de 60 segundos. Para cada 1 passo do loop externo, o loop interno dá 60 passos.
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Imprime uma grade simples de multiplicação (3x3)
for (linha in 1..3) {        // loop externo: linhas
    for (coluna in 1..3) {   // loop interno: colunas
        println("$linha x $coluna = ${linha * coluna}")
    }
    println("---")          // executa depois de cada loop interno completo
}
</pre>
</div>

<p>
Resultado:
</p>

<div class="org-src-container">
<pre class="src src-console">1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
---
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
---
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
---
</pre>
</div>

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">PARTE</th>
<th scope="col" class="org-left">O QUE ELA FAZ</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><b>for (linha in 1..3)</b></td>
<td class="org-left">O loop externo. Ele executa 3 vezes — para linha = 1, linha = 2 e linha = 3.</td>
</tr>

<tr>
<td class="org-left"><b>for (coluna in 1..3)</b></td>
<td class="org-left">O loop interno. Para cada valor de linha, esse loop inteiro executa 3 vezes — para coluna = 1, 2 e 3.</td>
</tr>

<tr>
<td class="org-left">Total de iterações</td>
<td class="org-left">O loop externo executa 3 vezes. O loop interno executa 3 vezes por passagem externa. Total: 3 × 3 = 9 iterações. Com loops aninhados, o trabalho total multiplica rapidamente.</td>
</tr>

<tr>
<td class="org-left"><b>println("&#x2014;")</b> (depois do loop interno)</td>
<td class="org-left">Essa linha está dentro do loop externo, mas fora do loop interno. Ela executa apenas uma vez por passagem externa — depois que o loop interno termina para aquela linha.</td>
</tr>
</tbody>
</table>
</div>
<div id="outline-container-orgb5f0075" class="outline-4">
<h4 id="orgb5f0075">Padrões práticos de loops aninhados</h4>
<div class="outline-text-4" id="text-orgb5f0075">
<p>
<b>Percorrer uma grade — combine duas variáveis para endereçar cada posição</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Simula verificar cada assento de um cinema (5 fileiras, 8 assentos cada)
for (fileira in 1..5) {
    for (assento in 1..8) {
        println("Fileira $fileira, Assento $assento")
    }
}
// Total: 40 iterações (5 x 8)
</pre>
</div>

<p>
Loops aninhados se encaixam naturalmente em qualquer dado organizado em grade — tabuleiros de jogos, planilhas, mapas de assentos, grades de pixels. Cada posição é identificada de forma única combinando a variável do loop externo com a do loop interno.
</p>

<blockquote>
<p>
<b>Aviso de performance:</b> cada camada de aninhamento multiplica o número total de iterações. Um loop de 100 dentro de outro loop de 100 executa 10.000 vezes. Adicione um terceiro loop de 100 e você chega a 1.000.000 de iterações. Isso pode deixar seu app lento ou travar. Se você se encontrar escrevendo três ou mais loops aninhados, isso é um forte sinal para parar e pensar numa abordagem diferente.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org3829477" class="outline-4">
<h4 id="org3829477">Quando não usar loops aninhados</h4>
<div class="outline-text-4" id="text-org3829477">
<p>
Loops aninhados são uma ferramenta legítima, mas também são uma das formas mais fáceis de escrever código lento por acidente. Aqui está uma situação para ficar atento:
</p>

<p>
<b>Padrão a evitar — não aninhe sem necessidade, às vezes um loop é suficiente</b>
</p>

<div class="org-src-container">
<pre class="src src-kotlin">// Aninhamento desnecessário — isso só adiciona complexidade sem motivo

// Ruim: isso imprime cada saturação de cumprimento para cada pessoa (9 saídas)
for (pessoa in 1..3) {
    for (cumprimento in 1..3) {
        println("Cumprimento $cumprimento para a pessoa $pessoa")
    }
}

// Melhor: se você só quer uma saída por pessoa, use apenas um loop
for (pessoa in 1..3) {
    println("Olá, pessoa $pessoa!")
}
</pre>
</div>

<p>
Antes de aninhar um loop, pergunte a si mesmo: "Eu realmente preciso de toda combinação entre o valor externo e o valor interno?" Se a resposta for não — se você só quer processar cada item uma vez — um único loop quase sempre é mais limpo. Só use aninhamento quando você realmente precisar processar combinações ou dados organizados em grade.
</p>

<blockquote>
<p>
<b>Regra geral:</b> se seu loop aninhado está ficando difícil de ler ou parece estar fazendo mais trabalho do que deveria, isso é um sinal para pausar. Mais adiante você vai aprender sobre funções de alta ordem como <code>map</code>, <code>filter</code> e <code>forEach</code> que muitas vezes substituem loops aninhados por alternativas mais limpas e mais rápidas.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-orgb381d85" class="outline-4">
<h4 id="orgb381d85">❗Desafio da Aula</h4>
<div class="outline-text-4" id="text-orgb381d85">
<p>
Use loops aninhados para imprimir um padrão de triângulo de asteriscos. Para um tamanho de 5, a saída deve ficar assim:
</p>

<div class="org-src-container">
<pre class="src src-console">*
**
***
****
*****
</pre>
</div>

<p>
Bônus: modifique para que o triângulo fique invertido (5 asteriscos no topo, 1 na base). Depois tente fazer um quadrado sólido (5 asteriscos de largura, 5 linhas de altura).
</p>

<blockquote>
<p>
<b>Dica:</b> o loop externo controla em qual linha você está. O loop interno imprime asteriscos para aquela linha. Na linha 1 você imprime 1 asterisco, na linha 2 você imprime 2 asteriscos — ou seja, o range do loop interno depende da variável do loop externo. Você pode construir uma string começando com uma string vazia e concatenando dentro do loop interno, depois imprimir após o loop interno terminar.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org873234b" class="outline-4">
<h4 id="org873234b">🤖 Aprofundando com IA</h4>
<div class="outline-text-4" id="text-org873234b">
<p>
<b>Aprofunde seu entendimento</b>
</p>

<p>
Prompt #1:
</p>

<blockquote>
<p>
Acabei de aprender sobre loops aninhados em Kotlin. Sem escrever nenhum código, você pode me explicar por que aninhar um loop de 50 dentro de um loop de 50 pode causar problemas que um único loop de 100 não causaria? Use uma analogia do mundo real. Depois me pergunte se eu entendi antes de continuar.
</p>
</blockquote>

<p>
Prompt #2:
</p>

<blockquote>
<p>
Me dê 3 cenários do mundo real em português simples — sem código — onde loops aninhados seriam a escolha natural. Depois me dê 2 cenários onde pode parecer que você precisa de loops aninhados, mas na verdade um único loop funcionaria melhor. Explique o porquê em cada caso.
</p>
</blockquote>

<p>
<b>Crie um exemplo para praticar</b>
</p>

<p>
Prompt #3:
</p>

<blockquote>
<p>
Escreva um exemplo de loop aninhado em Kotlin que processe algum tipo de dado organizado em grade — algo que você realmente encontraria num app Android, como verificar um tabuleiro de jogo ou processar pixels de uma imagem conceitualmente. Adicione comentários detalhados em cada linha para que eu entenda tanto o que o código faz quanto por que loops aninhados foram a escolha certa aqui.
</p>
</blockquote>

<hr>
</div>
</div>
</div>
<div id="outline-container-org1b80915" class="outline-3">
<h3 id="org1b80915">Etapa 3 Recap: O Que Você Aprendeu</h3>
<div class="outline-text-3" id="text-org1b80915">
<p>
Você chegou ao fim da Etapa 3! Aqui está um resumo rápido de tudo o que você aprendeu sobre repetição em Kotlin:
</p>

<ul class="org-ul">
<li><b>for loop</b> — repete um bloco de código um número definido de vezes, usando um range. <code>for (i in 1..5)</code> executa para cada valor de 1 a 5.</li>
<li><b>Operadores de range</b> — <code>1..10</code> inclui o último número (range fechado); <code>1 until 10</code> exclui o último número (range semi-aberto). <code>downTo</code> conta para trás, e <code>step</code> define o tamanho do passo.</li>
<li><b>while loop</b> — repete um bloco de código enquanto uma condição for verdadeira. Útil quando você não sabe de antemão quantas vezes vai repetir.</li>
<li><b>do-while loop</b> — parecido com o while, mas a condição é verificada no final, garantindo que o corpo execute pelo menos uma vez.</li>
<li><b>break</b> — sai imediatamente do loop inteiro, parando toda repetição adicional.</li>
<li><b>continue</b> — pula o restante da passagem atual e vai direto para a próxima.</li>
<li><b>Loops aninhados</b> — um loop dentro de outro loop, úteis para processar grades e combinações, mas que multiplicam o número de iterações rapidamente — use com cuidado.</li>
</ul>

<p>
Com esses fundamentos de repetição, você já consegue escrever código que processa tarefas repetitivas de forma eficiente. Na próxima etapa, você vai aprender a organizar seu código em funções reutilizáveis.
</p>

<hr>
</div>
</div>
</div>
<div id="outline-container-org81c5f20" class="outline-2">
<h2 id="org81c5f20">Novas aulas em breve&#x2026;</h2>
<div class="outline-text-2" id="text-org81c5f20">

<a href="//tiagoaguiar.dev/android-compose?utm_campaign=ac&utm_source=blog&utm_medium=article&utm_term=aprenda-kotlin"><img style="border: solid 1px #0dcaf0;" src="https://cdn.tiagoaguiar.dev/blog/img/blog-banner-android-compose.jpg" class="" /></a>


</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><category term="android" /><category term="kotlin" /><summary type="html"><![CDATA[Aprenda Kotlin do zero com uma introdução clara, prática e orientada para iniciantes no desenvolvimento Android.]]></summary></entry><entry><title type="html">Configurando Emacs como Java IDE</title><link href="https://devlog.tiagoaguiar.dev/emacs-java-ide/" rel="alternate" type="text/html" title="Configurando Emacs como Java IDE" /><published>2026-04-08T19:33:56+00:00</published><updated>2026-04-08T19:33:56+00:00</updated><id>https://devlog.tiagoaguiar.dev/emacs-java-ide</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/emacs-java-ide/"><![CDATA[<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org39a86b6">Instalando o Java Language Server</a></li>
<li><a href="#orga817b83">Script jdtls</a></li>
<li><a href="#orgd09a046">Dot emacs</a></li>
<li><a href="#org68310bc">Estrutura Java</a></li>
<li><a href="#org5ca5745">Meu Acesso Rápido</a></li>
</ul>
</div>
</div>

<p>
IntelliJ, Android Studio e outras IDEs são extremamente poderosas, isso é fato.
Mas muitas vezes queremos leveza, um ambiente produtivo sem dezenas de features que levam minutos para carregar.
</p>

<p>
Um ambiente onde nos permite abrir o editor o mais rápido possível e apenas começar a <b>programar!</b>
</p>

<p>
No Emacs, podemos usar um servidor de linguagem (<a href="https://en.wikipedia.org/wiki/Language_Server_Protocol">LSP</a>) para ter o mínimo de IntelliSense disponível no editor. Assim como o IntelliJ, Eclipse e outras IDEs fazem.
</p>

<p>
Ele funciona graças ao frontend <b>eglot</b> que já vem junto com o Emacs.
</p>

<p>
Vou mostrar um exemplo de configuração no MacOS, contudo vai funcionar também em outros sistemas operacionais, desde que você tenha o <a href="https://github.com/eclipse-jdtls/eclipse.jdt.ls">jdtls</a> em seu computador e apontando corretamente o caminho dele no script que irei mostrar no decorrer deste post.
</p>
<div id="outline-container-org39a86b6" class="outline-2">
<h2 id="org39a86b6">Instalando o Java Language Server</h2>
<div class="outline-text-2" id="text-org39a86b6">
<p>
Com o <a href="https://brew.sh/">Homebrew</a>, instale com o <b>jdtls</b> com o comando
</p>

<p>
<code>brew install jdtls</code>.
</p>

<p>
Encontre o caminho de instalação com o <code>brew --prefix jdtls</code>.
</p>

<p>
Se estiver em outro sistema operacional, baixe o language server diretamente do repositório oficial do jdtls.
</p>
</div>
</div>
<div id="outline-container-orga817b83" class="outline-2">
<h2 id="orga817b83">Script jdtls</h2>
<div class="outline-text-2" id="text-orga817b83">
<p>
Dentro do <a href="https://github.com/tiago-aguiar/dotfiles/blob/master/bin/jdtls">dotfiles</a> você encontra o script <code>jdtls</code> responsável por inicializar o servidor de linguagem Java a partir do workspace definido como argumento.
</p>

<p>
Os parâmetros neste script está configurado para o ambiente macOS. Logo, adapte o <code>JDTLS_HOME</code> para o seu sistema operacional e o <code>-configuration</code> se necessário.
</p>

<blockquote>
<p>
Ainda não deu tempo de deixar o script cross-platform, uso macOS 90% do tempo. Sorry!
</p>
</blockquote>

<p>
Coloque o script <code>jdtls</code> em algum lugar no PATH da sua máquina. Aqui eu copio para <code>~/bin</code> e configuro ele como PATH no meu <code>.zshrc</code>.
</p>

<div class="org-src-container">
<pre class="src src-shell"># .zshrc
export PATH="~/bin:$PATH"
</pre>
</div>


<p>
E os arquivos do emacs estão como links simbólicos para a HOME.
</p>

<div class="org-src-container">
<pre class="src src-shell">bin/jdtls # copied from dotfiles
.emacs -&gt; /Users/tiagoaguiar/dotfiles/.emacs #symlink
.emacs.d -&gt; /Users/tiagoaguiar/dotfiles/.emacs.d #symlink
.emacs-custom.el # (empty file for Emacs)
</pre>
</div>


<p>
O workspace do projeto Java será encontrado automaticamente pelo Emacs a partir do diretório do projeto que contenha a estrutura base com um dos arquivos na raiz: <code>.project</code>, <code>.classpath</code>, <code>pom.xml</code> ou <code>build.gradle</code>.
</p>

<p>
Ou seja, se o projeto estiver na estrutura correta ele irá carregar automaticamente e iniciar o E-glot com LSP.
</p>
</div>
</div>
<div id="outline-container-orgd09a046" class="outline-2">
<h2 id="orgd09a046">Dot emacs</h2>
<div class="outline-text-2" id="text-orgd09a046">
<p>
Caso não utilize o meu .emacs, você pode configurar no seu próprio. Eu extrai somente as partes relevantes para o ambiente Java IDE no Emacs.
</p>

<p>
O gerenciador de pacotes que utilizo é o <code>use-package</code>.
</p>

<p>
Instale também o <code>company</code> para o <i>autocomplete</i>.
</p>

<p>
Garanta que o java esteja instalado corretamente e que o Emacs possa encontrá-lo em seu <b>JAVA_HOME</b>.
</p>

<p>
Por aqui eu utilizo o java 21.
</p>


<div class="org-src-container">
<pre class="src src-elisp">;;
;; .emacs (coloque no ~/.emacs)
;;
(use-package eglot
  :config
  (setq eldoc-echo-area-use-multiline-p nil)
  (setq eglot-events-buffer-size 0)
  (add-hook 'eglot-managed-mode-hook (lambda () (eglot-inlay-hints-mode -1)))  ;; disable param hint
  :config
  (add-to-list 'eglot-server-programs
               `(java-mode . ,#'my-jdtls-command)))


;; auto complete com company
(add-hook 'java-mode-hook 'global-company-mode)

(defun my-java-project-root (&amp;optional dir)
  (let ((start-dir (file-name-as-directory
                    (or dir
                        (when buffer-file-name
                          (file-name-directory buffer-file-name))
                        default-directory))))
    (or
     (locate-dominating-file start-dir ".project")
     (locate-dominating-file start-dir ".classpath")
     (locate-dominating-file start-dir "pom.xml")
     (locate-dominating-file start-dir "build.gradle")
     start-dir)))


(defun my-jdtls-command (&amp;rest _)
  (let* ((root (my-java-project-root))
         (project-name (file-name-nondirectory
                        (directory-file-name root)))
         (workspace (expand-file-name
                     (concat "~/.jdtls-workspace/" project-name))))

    (message "------------------------------")
    (message "[JDTLS] Root: %s" root)
    (message "[JDTLS] Project: %s" project-name)
    (message "[JDTLS] Workspace: %s" workspace)
    (message "[JDTLS] Default dir (before): %s" default-directory)

    (make-directory workspace t)

    (message "[JDTLS] Starting server...")

    (list "jdtls" workspace)))

;; NOTE(tiago): the jdtls only works when default-directory is set to root project
;; however, if we want to keep find-file opening at current buffer dir
;; we need to restore this variable to "default" default-directory
(defun my-eglot-java-init ()
  (let ((buffer-dir default-directory)
        (project-root (my-java-project-root)))
    (setq-local my-eglot-java-buffer-directory buffer-dir)
    (setq-local default-directory project-root)
    (add-hook 'eglot-managed-mode-hook #'my-eglot-java-restore-directory nil t)
    (eglot-ensure)))

(defun my-eglot-java-restore-directory ()
  (when (bound-and-true-p my-eglot-java-buffer-directory)
    (setq-local default-directory my-eglot-java-buffer-directory)
    (kill-local-variable 'my-eglot-java-buffer-directory)
    (remove-hook 'eglot-managed-mode-hook #'my-eglot-java-restore-directory t)))

(add-hook 'java-mode-hook #'my-eglot-java-init)

(add-hook 'java-mode-hook
          (lambda ()
            (add-hook 'before-save-hook #'eglot-format-buffer nil t)))


</pre>
</div>
</div>
</div>
<div id="outline-container-org68310bc" class="outline-2">
<h2 id="org68310bc">Estrutura Java</h2>
<div class="outline-text-2" id="text-org68310bc">
<p>
Veja um exemplo de projeto Java com a estrutura básica (usando maven ou gradle o lsp encontrará automaticamente também).
</p>

<p>
<b>.classpath</b>:
</p>

<div class="org-src-container">
<pre class="src src-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;classpath&gt;
    &lt;classpathentry kind="src" path="src"/&gt;
    &lt;classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/&gt;
    &lt;classpathentry kind="output" path="bin"/&gt;
&lt;/classpath&gt;
</pre>
</div>

<p>
<b>.project</b>:
</p>

<div class="org-src-container">
<pre class="src src-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;projectDescription&gt;
  &lt;name&gt;tetris-java&lt;/name&gt;
  &lt;comment&gt;&lt;/comment&gt;
  &lt;projects&gt;
  &lt;/projects&gt;
  &lt;buildSpec&gt;
  &lt;/buildSpec&gt;
  &lt;natures&gt;
      &lt;nature&gt;org.eclipse.jdt.core.javanature&lt;/nature&gt;
  &lt;/natures&gt;
  &lt;filteredResources&gt;
      &lt;filter&gt;
        &lt;id&gt;1775684946935&lt;/id&gt;
        &lt;name&gt;&lt;/name&gt;
        &lt;type&gt;30&lt;/type&gt;
        &lt;matcher&gt;
              &lt;id&gt;org.eclipse.core.resources.regexFilterMatcher&lt;/id&gt;
              &lt;arguments&gt;node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__&lt;/arguments&gt;
        &lt;/matcher&gt;
      &lt;/filter&gt;
  &lt;/filteredResources&gt;
&lt;/projectDescription&gt;
</pre>
</div>


<p>
A estrutura final do seu projeto deve ser algo parecido com o modelo abaixo:
</p>

<div class="org-src-container">
<pre class="src src-console">root
├── .classpath
├── .project
└── src
    └── dev
        └── tiagoaguiar
            └── projeto
                └── App.java
</pre>
</div>

<blockquote>
<p>
Será preciso abrir o Emacs a partir do terminal para ter o <code>JAVA_HOME</code> disponível na GUI do Emacs.
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org5ca5745" class="outline-2">
<h2 id="org5ca5745">Meu Acesso Rápido</h2>
<div class="outline-text-2" id="text-org5ca5745">
<ul class="org-ul">
<li class="off"><input type='checkbox' /> Baixar o jdtls com homebrew</li>
<li class="off"><input type='checkbox' /> Clonar o dotfiles</li>
<li class="off"><input type='checkbox' /> Criar links simbólicos para
~/.emacs, ~/.emacs.d</li>
<li class="off"><input type='checkbox' /> Copiar o script jdtls para ~/bin</li>
<li class="off"><input type='checkbox' /> Garantir que ~/bin esteja no PATH</li>
<li class="off"><input type='checkbox' /> Estruturar projeto java com .project e .classpath na raiz</li>
</ul>
</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><category term="env" /><summary type="html"><![CDATA[Table of Contents Instalando o Java Language Server Script jdtls Dot emacs Estrutura Java Meu Acesso Rápido]]></summary></entry><entry><title type="html">1.1 - Configurando Windows para Desenvolvimento de Jogos em C</title><link href="https://devlog.tiagoaguiar.dev/windows-desenvolvimento-jogos/" rel="alternate" type="text/html" title="1.1 - Configurando Windows para Desenvolvimento de Jogos em C" /><published>2026-04-04T10:50:29+00:00</published><updated>2026-04-04T10:50:29+00:00</updated><id>https://devlog.tiagoaguiar.dev/windows-desenvolvimento-jogos</id><content type="html" xml:base="https://devlog.tiagoaguiar.dev/windows-desenvolvimento-jogos/"><![CDATA[<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org5b3a719">1. Linha de comando (terminal)</a></li>
<li><a href="#org3d4f46e">2. Disco local virtual</a></li>
<li><a href="#org3fb471b">3. Compilador</a></li>
<li><a href="#orga08e1ce">4. Editor de Texto</a></li>
<li><a href="#orge320ff6">5. Desativando o UAC Registry Editor (opcional)</a></li>
<li><a href="#org02923c0">6. Batchfile shell</a></li>
<li><a href="#orgca8097a">7. Batchfile emacs</a></li>
<li><a href="#orge153e02">8. Inicializador do cmd/terminal</a></li>
<li><a href="#org56736e0">9. Primeiro Programa</a>
<ul>
<li><a href="#org5016580">build.bat</a></li>
<li><a href="#orgd11dc32">Main (entry-point)</a></li>
<li><a href="#org62fe3f0">Executando o Programa com Debugging</a></li>
</ul>
</li>
<li><a href="#orge4c423a">10. Key repeat (opcional)</a></li>
<li><a href="#orgecca740">Conclusão</a></li>
<li><a href="#org06309cc">Meu Acesso Rápido</a></li>
</ul>
</div>
</div>

<p>
Configurar um ambiente para programar pode ser uma tarefa chata, mas é necessário.
</p>

<p>
Hoje eu vou compartilhar os passos que uso para configurar o Windows para o desenvolvimento de jogos em C da maneira que aprendi e que funciona bem.
</p>

<p>
Você pode seguir passo a passo para ter a mesma configuração que a minha ou usar ela como ponto de partida para ter a sua própria configuração.
</p>

<blockquote>
<p>
Eu também fiz uma versão para o macOS que você pode acessar aqui <a href="/macos-desenvolvimento-jogos/">Configurando MacOS para Desenvolvimento de Jogos</a>
</p>
</blockquote>
<div id="outline-container-org5b3a719" class="outline-2">
<h2 id="org5b3a719">1. Linha de comando (terminal)</h2>
<div class="outline-text-2" id="text-org5b3a719">
<p>
O primeiro passo que todo programador faz - ou deveria fazer - é configurar seu ambiente de desenvolvimento com ferramentas leves e direto ao ponto, especialmente a linha de comando.
</p>

<p>
Isso inclui configurar as fontes, cores, teclas de atalho e a janela onde você passará a maior parte do seu tempo.
</p>

<p>
Agora, ninguém gosta de programar sem o seu toque <b>único</b>. Eu costumo configurar o estilo do meu terminal/cmd com cores que me agradam ao estilo retrô ou o clássico tema escuro com textos em branco.
</p>

<p>
Abra a linha de comando - CMD ou Terminal - com a tecla de atalho <code>Windows + R</code> e digite <code>cmd</code>.
</p>

<p>
Clique no ícone do prompt de comando, no canto superior a esquerda, acesse as propriedades do menu e personalize as fonte e cores de sua preferência.
</p>


<div id="org9ecd2ff" class="figure">
<p><img src="../assets/1727034196.png" alt="1727034196.png" />
</p>
</div>

<p>
A configuração acima utiliza a cor <code>R=237</code> <code>G=196</code> <code>B=100</code> e a fonte <a href="https://www.dafont.com/pt/liberation-mono.font">Liberation Mono.</a>
</p>

<p>
A ideia não é perder muito tempo com esses detalhes, precisa ser objetivo e direto, porque usaremos o prompt de comando apenas para gerenciar nosso projeto, rodar scripts e compilar o programa.
</p>

<p>
Só isso!
</p>
</div>
</div>
<div id="outline-container-org3d4f46e" class="outline-2">
<h2 id="org3d4f46e">2. Disco local virtual</h2>
<div class="outline-text-2" id="text-org3d4f46e">
<p>
Um disco virtual simula a posição física do disco como <code>c:\Users\yourname\somefolder</code> para um ponto novo.
</p>

<p>
Podemos fazer isso para ter acesso rápido como por exemplo <code>w:</code> quando o caminho do projeto está em outra parte do disco físico.
</p>

<p>
Para criar um disco virtual, você pode usar o comando <code>subst</code>.
</p>

<p>
Com o parâmetro de ajuda, temos as opções disponíveis: <code>subst /?</code>.
</p>

<p>
Então, caso queiramos criar um ambiente virtual apontando para o <b>w:</b> fazemos desta forma abaixo:
</p>

<div class="org-src-container">
<pre class="src src-bat">subst w: c:\&lt;pasta&gt;
</pre>
</div>

<p>
Agora, para que isso persista, vamos criar o arquivo <code>startup.bat</code> que irá executar este comando ao inicializar o Windows.
</p>

<p>
Abra esse arquivo com o atalho <code>Windows + R</code> e digite <code>shell:startup</code>.
</p>

<p>
Nesta pasta, caso não tenha o startup.bat, crie-o.
</p>

<p>
Abra-o com notepad e escreva:
</p>

<div class="org-src-container">
<pre class="src src-bat">@echo off
REM @echo off remove the output of command echo

echo configuring local disk w:
subst w: c:\game
</pre>
</div>

<p>
Isso irá configurar o disco local virtual.
</p>

<ul class="org-ul">
<li>@echo off desativa a saída de cada linha a seguir para não poluir o console</li>
<li>REM é o comentário em um batchfile</li>
</ul>

<p>
Agora você pode acessar diretamente o ambiente de trabalho do seu jogo com <code>cd w:</code>.
</p>

<blockquote>
<p>
Uma outra abordagem seria usar o caminho padrão <code>c:\</code> como seu diretório <b>HOME</b>. Você não precisa usar seu User se você tem controle total do seu PC.
</p>
</blockquote>

<p>
Definindo onde estará nosso projeto, c: ou w: via subst, vamos ao compilador.
</p>
</div>
</div>
<div id="outline-container-org3fb471b" class="outline-2">
<h2 id="org3fb471b">3. Compilador</h2>
<div class="outline-text-2" id="text-org3fb471b">
<p>
Para começar a programar um jogo em C, precisamos de um compilador. Existem diversos compiladores de C. Neste projeto para o Windows vamos usar o MSVC - Microsoft Visual C++.
</p>

<p>
Para ter acesso ao compilador <code>cl</code> é necessário baixar e instalar o <a href="https://visualstudio.microsoft.com/pt-br/">Visual Studio</a> e ativar no cmd para compilar por lá.
</p>

<p>
Faremos isso com o batchfile <code>vcvarsall.bat</code>.
</p>

<p>
Este script vive dentro do diretório do Visual Studio.
</p>

<p>
Eu não posso descrever exatamente onde encontrá-lo porque varia de versão para versão, mas vou adicionar o caminho da minha versão atual para que tenha como referência.
</p>

<p>
No meu caso está em <code>c:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat</code>
</p>

<p>
Se você rodar esse programa no seu terminal com o parâmetro <b>x64</b>, notará que o compilador ficará disponível como o comando <code>cl</code> para compilar em 64 bits.
</p>

<p>
Para não ter que encontrar toda vez esse script durante o trabalho, vamos criar nossos próprios scripts batchfile.
</p>
</div>
</div>
<div id="outline-container-orga08e1ce" class="outline-2">
<h2 id="orga08e1ce">4. Editor de Texto</h2>
<div class="outline-text-2" id="text-orga08e1ce">
<p>
Eu uso Emacs há mais de 10 anos. O Emacs foi criado em 1976 por Richard Stallman e talvez você esteja pensando: "Nossa, este editor é antigo!".
</p>

<p>
Mas <b>funciona para mim!</b>
</p>

<p>
Eu, pessoalmente, sempre usei o Vim desde o meu primeiro ano como programador. Mesmo durante o meu estágio, meu chefe me "ensinou" - leia-se obrigou - programar e navegar rapidamente em qualquer editor. Foi difícil no começo, mas hoje vejo que valeu 100% o esforço em aprendê-lo.
</p>

<p>
Mas depois de anos usando o Vim (e depois <a href="https://neovim.io/">neovim</a>), eu conheci o Emacs e simplesmente decidi ir para esse lado da força.
</p>

<p>
Configurei bastante, gastando muitas semanas, talvez até meses - no qual hoje me arrependo ter me dedicado tanto aos detalhes e ao perfeccionismo, deveria ter focado mais em programar - e agora ele se tornou meu editor favorito. Gosto de combinar o poder do Emacs com o Vim através do <a href="https://github.com/emacs-evil/evil">Evil Mode</a> para simular as combinações de teclas do Vim dentro do Emacs.
</p>

<p>
Então, caso queira seguir o meu <i>workflow</i> atual, instale o <a href="https://gnu.c3sl.ufpr.br/ftp/emacs/windows/">Emacs</a> no Windows. A versão que baixei enquanto escrevo o texto foi <b>emacs-30.1</b>, mas você pode usar a mais recente disponível.
</p>

<p>
O Emacs funciona com Elisp escrito no arquivo <code>.emacs</code> que deve ficar na pasta HOME <code>~/</code> para inicialização.
</p>

<p>
Como o Windows não possui um HOME da mesma forma como unix, eu adiciono na variável de ambiente <code>HOME=c:\</code>. Assim, o Emacs olha para c:\ para procurar o arquivo <code>.emacs</code>.
</p>

<p>
Você pode encontrar minha versão do arquivo <code>.emacs</code> e da pasta <code>.emacs.d</code> em meu <a href="https://github.com/tiago-aguiar/dotfiles">dotfiles</a>.
</p>

<p>
No <code>.emacs.d</code> inclui temas, snippets de códigos, scripts e muito mais.
</p>

<p>
A propósito, caso queira conhecer o tema que criei para a IDE  da JetBrains - alerta nerd - com algumas cores que uso no próprio Emacs, vou deixar o link aqui de referência. Eu o chamei de <a href="https://plugins.jetbrains.com/plugin/22329-terminator-theme">Terminator Theme</a>.
</p>

<p>
Contudo, há uma pegadinha aqui. Nos dias atuais, o Windows não permite que o Emacs escreva arquivos diretamente no c: a menos que se seja um usuário Admnistrador. Logo, eu gosto de desativar qualquer "exigência" de privilégios para meu próprio computador.
</p>

<p>
<i>"Mas Tiago, isso não deixa vunerável a virus?"</i>
</p>

<p>
Se você souber onde acessa, o melhor antivirus, é você!
</p>

<p>
Eu desativo o UAC pelo <b>Registry Editor</b> o que permite acessar c: com todos os privilégios.
</p>
</div>
</div>
<div id="outline-container-orge320ff6" class="outline-2">
<h2 id="orge320ff6">5. Desativando o UAC Registry Editor (opcional)</h2>
<div class="outline-text-2" id="text-orge320ff6">
<p>
Abra novamente o atalho <code>Windows + R</code> e digite <code>regedit</code>.
</p>

<p>
Navegue até essa sub-chave:
</p>
<div class="org-src-container">
<pre class="src src-text">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Policies\system
</pre>
</div>

<p>
No painel à direita da chave <b>System</b>, encontre <b>EnableLUA DWORD</b> a troque ele para o valor zero.
</p>

<p>
Reinicie o PC para aplicar as modificações após salvar.
</p>
</div>
</div>
<div id="outline-container-org02923c0" class="outline-2">
<h2 id="org02923c0">6. Batchfile shell</h2>
<div class="outline-text-2" id="text-org02923c0">
<p>
Como dito, encontrar o script <code>vcvarsall.bat</code> toda vez é chato, então vamos criar um outro que nos ajude e que fique fácil de acessar a partir do projeto.
</p>

<p>
Crie um script com algum nome, como <code>shell.bat</code> e coloque ele onde preferir, seja no diretório do seu game como em <code>\misc</code> ou no próprio <code>c:\bin</code> por exemplo.
</p>

<blockquote>
<p>
Geralmente eu crio o diretório <code>c:\bin</code> onde eu posso adicionar qualquer script que ficará visível pelo <b>PATH</b> do sistema operacional.
</p>
</blockquote>

<div class="org-src-container">
<pre class="src src-bat">@echo off
REM @echo off remove the output of command echo
echo "configure shell for w: (c:\game)"

REM configure compiler
call "c:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64

REM configure emacs
IF NOT EXIST "c:\bin"      mklink /d "c:\bin"      "c:\dotfiles\bin"
IF NOT EXIST "c:\.emacs.d" mklink /d "c:\.emacs.d" "c:\dotfiles\.emacs.d"
IF NOT EXIST "c:\.emacs"   mklink    "c:\.emacs"   "c:\dotfiles\.emacs"
type nul &gt; "c:\.emacs-custom.el"

REM scripts on path
set PATH=w:\misc;%PATH%
</pre>
</div>

<p>
O script basicamente irá:
</p>
<ul class="org-ul">
<li>chamar o vcvarsall para ativar o compilador;</li>
<li>configurar o Emacs (editor de texto que falarei mais a frente), criando arquivos e links simbólicos;</li>
<li>colocar o diretório \misc do projeto no PATH para rodar scripts - pode ser o c:\bin se preferir;</li>
</ul>

<p>
Os meus scripts e arquivos de configuração ficam no meu <a href="https://github.com/tiago-aguiar/dotfiles">dotfiles</a> que você pode acessar e copiar para o seu diretório do game \misc.
</p>
</div>
</div>
<div id="outline-container-orgca8097a" class="outline-2">
<h2 id="orgca8097a">7. Batchfile emacs</h2>
<div class="outline-text-2" id="text-orgca8097a">
<p>
Também crie o script <code>emacs.bat</code> dentro do mesmo diretório do <code>shell.bat</code> caso queira iniciar o emacs direto pela linha de comando.
</p>

<div class="org-src-container">
<pre class="src src-bat">@echo off
REM @echo off remove the output of command echo
call "C:\Program Files\Emacs\emacs-30.1\bin\runemacs.exe" 
</pre>
</div>
</div>
</div>
<div id="outline-container-orge153e02" class="outline-2">
<h2 id="orge153e02">8. Inicializador do cmd/terminal</h2>
<div class="outline-text-2" id="text-orge153e02">
<p>
Você pode fazer o seu atalho do cmd iniciar o seu script shell.bat se preferir.
</p>

<p>
No atalho, acesse "Properties" &gt; "Target Field" e adicione o argumento na caixa do atalho: <code>/k w:\misc\shell.bat</code> - ou o caminho que você definiu seu shell.bat.
</p>

<p>
Agora, sempre que o cmd abrir, ele vai configurar todo Emacs, compilador e o PATH para rodar os scripts que estão em w:\misc
</p>
</div>
</div>
<div id="outline-container-org56736e0" class="outline-2">
<h2 id="org56736e0">9. Primeiro Programa</h2>
<div class="outline-text-2" id="text-org56736e0">
<p>
Temos tudo que precisamos para começar.
</p>

<ol class="org-ol">
<li>Terminal</li>
<li>Compilador</li>
<li>Editor de Texto</li>
</ol>

<p>
Agora, crie a pasta <code>src</code> dentro do diretório raiz do projeto com os arquivos <code>win32_&lt;project_name&gt;.cpp</code> e <code>build.bat</code>.
</p>

<p>
Eu aprendi a adicionar o nome do projeto no arquivo para evitar conflitos de nomes com bibliotecas de terceiros no C. Por exemplo, um <code>platform.h</code> pode haver em diversos lugares, logo eu usaria <code>&lt;project_name&gt;_platform.h</code>.
</p>
</div>
<div id="outline-container-org5016580" class="outline-3">
<h3 id="org5016580">build.bat</h3>
<div class="outline-text-3" id="text-org5016580">
<p>
Você só precisa do arquivo batchfile para compilar o programa.
</p>

<p>
Você pode desconsiderar ferramentas como <code>cmake</code>, <code>make</code> e outras ferramentas de compilação. Em vez disso, escreva um arquivo shell simples em <code>myproject/src/build.bat</code>.
</p>

<p>
Isso facilita muito nossos sistema de build - nem sei se posso chamar de sistema de tão enxuto que ele é.
</p>

<blockquote>
<p>
Isso é possível porque vamos utilizar o método de compilação com um <a href="https://en.wikipedia.org/wiki/Single_compilation_unit">único translation unit</a>.
</p>
</blockquote>

<p>
Muito bem, dentro do arquivo shell script, adicione uma flag de debugging para o compilador com <code>/Zi</code>, crie um novo diretório <code>build</code> para gerar os executáveis e adicione ao linker a flag para compilar com a biblioteca de GUI do Windows <code>user32.lib</code>.
</p>

<div class="org-src-container">
<pre class="src src-bat">@echo off
REM @echo off remove the output of command echo

IF NOT EXIST ..\build mkdir ..\build
pushd ..\build
cl /nologo /Zi /Fegame ..\src\win32_game.cpp user32.lib
popd
</pre>
</div>

<ul class="org-ul">
<li><b>mkdir</b>: Cria um novo diretório se ele não existir;</li>
<li><b>pushd/popd</b>: Navega e persiste no histórico como pilha;</li>
<li><b>cl</b>: Compilador C;</li>
<li><b>-/Zi</b>: A flag de debugging;</li>
<li><b>/Fe</b>: Nome do executável de saída;</li>
<li><b>/nologo</b>: Desativa entulho de saída do compilador;</li>
<li><b>user32.lib</b>: Uma biblioteca estática para criar janelas. O linker vai usar para encontrar a implementação de componentes como MessageBox, Window, entre outras.</li>
</ul>

<p>
Se estiver usando o meu <code>.emacs</code>, pode compilar diretamente de dentro do Emacs com o atalho <code>M-x m</code> (alt+m) ou chamar o script <code>build.bat</code> no terminal.
</p>
</div>
</div>
<div id="outline-container-orgd11dc32" class="outline-3">
<h3 id="orgd11dc32">Main (entry-point)</h3>
<div class="outline-text-3" id="text-orgd11dc32">
<p>
Crie o ponto de entrada em <code>win32_&lt;project_name&gt;cpp</code> com <code>WinMain</code> e use a macro <code>MessageBox</code>.
</p>

<blockquote>
<p>
O conteúdo da API deve ser consultado sempre com a referência oficial do  <a href="https://learn.microsoft.com/pt-br/windows/win32/api/winbase/nf-winbase-winmain">MSDN documentation</a>.
</p>
</blockquote>

<div class="org-src-container">
<pre class="src src-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    printf("Hello world\n");

    MessageBoxA(NULL, "Game", "My Game", MB_OK|MB_ICONINFORMATION);

    return 0;
}
</pre>
</div>

<p>
O <code>MessageBoxA</code> força a mensagem sair com texto ANSI, ao invés de usar a macro que definirá UNICODE ou ANSI, MessageBoxW e MessageBoxA respectivamente.
</p>

<p>
O Windows usa a <i>Hungarian notation</i> no seu código. Eu particularmente não gosto disto, mas é interessanto saber, isso porque a documentação do <a href="https://visualstudio.microsoft.com/pt-br/msdn-platforms/">MSDN</a> será repleta dessa notação.
</p>
</div>
</div>
<div id="outline-container-org62fe3f0" class="outline-3">
<h3 id="org62fe3f0">Executando o Programa com Debugging</h3>
<div class="outline-text-3" id="text-org62fe3f0">
<p>
Você pode executar o executável a partir do terminal no caminho <code>build\&lt;project_name&gt;.exe</code> ou usando o <code>devenv</code> para fins de depuração com o Visual Studio como ferramenta de debugging.
</p>

<p>
Como compilamos nosso programa com flags de debugging, o Visual Studio reconhece o código-fonte.
</p>

<p>
Crie uma pasta na raiz chamada <b>data</b>. Esta pasta será útil ao executar o jogo no futuro como caminho relativo.
</p>

<p>
Com o Visual Studio aberto, clique com direito em <i>solution &gt; properties &gt; Working Directory</i> e atribua o path para <code>w:\data</code>.
</p>

<p>
O <b>F5</b> roda o programa com ponto de parada e o <b>F11</b> pára na primeira linha do main.
</p>

<blockquote>
<p>
A primeira linha de código que é executada no windows não é o nosso arquivo cpp. O arquivo é <code>crt0.c</code>.
Ele é carregado pelo sistema operacional através do <b>C Runtime Library (CRT)</b>. Logo o <b>verdadeiro</b> inicializador é o <code>mainCRTStartup()</code>.
Depois disto, o processo é dispachado para o nosso WinMain.
</p>
</blockquote>
</div>
</div>
</div>
<div id="outline-container-orge4c423a" class="outline-2">
<h2 id="orge4c423a">10. Key repeat (opcional)</h2>
<div class="outline-text-2" id="text-orge4c423a">
<p>
Por padrão, ao digitar no teclado há um atraso na saída do editor. Você pode alterar a velocidade de output de cada caracter ajustando o controle de entrada do teclado.
</p>

<p>
Acesse <code>Windows + R &gt; control keyboard</code> e altere a velocidade do input.
</p>
</div>
</div>
<div id="outline-container-orgecca740" class="outline-2">
<h2 id="orgecca740">Conclusão</h2>
<div class="outline-text-2" id="text-orgecca740">
<p>
Os passos podem parecer grande, mas não é. Ao seguir o passo a passo, você notará que esse fluxo de trabalho é muito simples, rápido e produtivo.
</p>

<p>
Você só precisa:
</p>
<ol class="org-ol">
<li>Abrir o terminal;</li>
<li>Abrir o Emacs;</li>
<li>Escrever o código;</li>
<li>Compilar;</li>
<li>Testar com Debugging;</li>
</ol>

<p>
A estrutura final é bem simples.
</p>

<div class="org-src-container">
<pre class="src src-shell">project_name
├── data
├── misc
├── build
└── src
    ├── build.bat
    └── win32_project_name.cpp
</pre>
</div>
</div>
</div>
<div id="outline-container-org06309cc" class="outline-2">
<h2 id="org06309cc">Meu Acesso Rápido</h2>
<div class="outline-text-2" id="text-org06309cc">
<ul class="org-ul">
<li class="off"><input type='checkbox' /> Configurar o terminal com fontes e cores</li>
<li class="off"><input type='checkbox' /> Configurar disco local virtual com <code>subst</code> e <code>startup.bat</code></li>
<li class="off"><input type='checkbox' /> Instalar o Visual Studio</li>
<li class="off"><input type='checkbox' /> Instalar o Emacs e configurar <code>.emacs</code> no diretório c:\</li>
<li class="off"><input type='checkbox' /> Configurar Privilégios do Windows e atribuir HOME c:\ nas variáveis de ambiente</li>
<li class="off"><input type='checkbox' /> Criar o <code>shell.bat</code> para ativar compilador e o PATH c:\bin</li>
<li class="off"><input type='checkbox' /> Criar o <code>emacs.bat</code> para iniciar Emacs pelo cmd</li>
<li class="off"><input type='checkbox' /> Configurar o atalho do cmd para iniciar o shell.bat</li>
<li class="off"><input type='checkbox' /> Escrever o <code>build.bat</code> para compilar o programa</li>
<li class="off"><input type='checkbox' /> Escrever o arquivo principal com o ponto de entrada <code>WinMain</code> e um 'Hello World' com MessageBox</li>
<li class="off"><input type='checkbox' /> Configurar a pasta <code>data</code> para diretório de funcionamento do Visual Studio</li>
<li class="off"><input type='checkbox' /> Testar a depuração com Visual Studio</li>
</ul>
</div>
</div>]]></content><author><name>Tiago Aguiar</name></author><category term="gamedev" /><summary type="html"><![CDATA[Table of Contents 1. Linha de comando (terminal) 2. Disco local virtual 3. Compilador 4. Editor de Texto 5. Desativando o UAC Registry Editor (opcional) 6. Batchfile shell 7. Batchfile emacs 8. Inicializador do cmd/terminal 9. Primeiro Programa build.bat Main (entry-point) Executando o Programa com Debugging 10. Key repeat (opcional) Conclusão Meu Acesso Rápido]]></summary></entry></feed>