<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Lucas Santos]]></title><description><![CDATA[conteúdos sobre desenvolvimento e tecnologia]]></description><link>https://blog.lsantos.dev/</link><image><url>https://blog.lsantos.dev/favicon.png</url><title>Lucas Santos</title><link>https://blog.lsantos.dev/</link></image><generator>Ghost 5.78</generator><lastBuildDate>Wed, 15 Apr 2026 18:57:01 GMT</lastBuildDate><atom:link href="https://blog.lsantos.dev/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Backlog 10 - Slopware: O fim do código bem feito]]></title><description><![CDATA[Você sabe o que é Slopware? Então deixa eu te apresentar algo que, provavelmente, vai te deixar bastante preocupado.]]></description><link>https://blog.lsantos.dev/slopware/</link><guid isPermaLink="false">67d439d2ff72dd5b973bf6aa</guid><category><![CDATA[backlog-newsletter]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Thu, 20 Mar 2025 11:00:10 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/articles-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/articles-1.png" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito"><p>No <a href="https://blog.lsantos.dev/o-que-aconteceu-com-devs/">&#xFA;ltimo Backlog</a> eu abordei um tema que estava me incomodando bastante nos &#xFA;ltimos meses: o fato de que devs hoje est&#xE3;o ficando cada vez mais pregui&#xE7;osos e delegando cada vez mais tarefas para a IA. Desde ent&#xE3;o tivemos o advento disso aqui, que eu estou nomeando agora como <strong>Slopware</strong>:</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">&#x2728; <a href="https://t.co/6TyHKajGaJ?ref=blog.lsantos.dev">https://t.co/6TyHKajGaJ</a> has now gone from $0 to $1 million ARR in just 17 days!<br><br>&#x1F4B8; Revenue update: $87,000 MRR (which is $1M ARR)<br><br>My first project ever to go up this fast &#x1F92F;<br><br>Only 3 ads left now: <a href="https://t.co/uc1J8Ia7QZ?ref=blog.lsantos.dev">https://t.co/uc1J8Ia7QZ</a><br><br>&#x1F4CA; Stats update: 320,000 people have now flown in the&#x2026; <a href="https://t.co/scrq1lSJOT?ref=blog.lsantos.dev">https://t.co/scrq1lSJOT</a> <a href="https://t.co/NCc50FOgJa?ref=blog.lsantos.dev">pic.twitter.com/NCc50FOgJa</a></p>&#x2014; @levelsio (@levelsio) <a href="https://twitter.com/levelsio/status/1899596115210891751?ref_src=twsrc%5Etfw&amp;ref=blog.lsantos.dev">March 11, 2025</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></figure><p>Se voc&#xEA; est&#xE1; por fora da bolha de reclama&#xE7;&#xF5;es do mundo tech, esse &#xE9; o <em>Fly Pieter</em>, um jogo criado pelo mesmo Pieter Levels (que comentei no Backlog anterior) usando apenas a for&#xE7;a de vontade e uma subscription do Cursor. Eu tentei jogar, mas aparentemente depois de 20s de jogo eu n&#xE3;o consegui conectar em nenhum servidor (imagino que por que meu setup bloqueia trackers).</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/image-2.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="498" height="92"></figure><p>Como voc&#xEA; pode ver, o jogo n&#xE3;o &#xE9; uma obra de arte, mas tudo bem, gr&#xE1;ficos n&#xE3;o s&#xE3;o a parte mais importante de um jogo (eu jogo <em>Tibia</em> e <em>Dwarf Fortress</em>), e sim a jogabilidade, a hist&#xF3;ria, etc. O problema &#xE9; que esse jogo n&#xE3;o tem nenhuma dessas propriedades&#x2026; &#xC9; apenas um monte de gente voando e vendo an&#xFA;ncios. E, ainda assim, gera uma renda de 1 milh&#xE3;o de d&#xF3;lares anualmente (segundo o criador). Meu questionamento &#xE9; um s&#xF3;: por qu&#xEA;? Simples&#x2026; Audi&#xEA;ncia.</p><h2 id="o-efeito-da-audi%C3%AAncia">O efeito da audi&#xEA;ncia</h2><p>Eu tenho uma opini&#xE3;o muito forte sobre essa situa&#xE7;&#xE3;o toda: n&#xE3;o concordo com as pessoas que est&#xE3;o endeusando esse cara porque ele &#x201C;criou&#x201D; um jogo e fez milh&#xF5;es com ele. Eu acho que nossos &#xED;dolos est&#xE3;o nos lugares errados.</p><p>Recentemente o Felipe Deschamps postou esse tweet:</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="pt" dir="ltr">Muita gente batendo no <a href="https://twitter.com/levelsio?ref_src=twsrc%5Etfw&amp;ref=blog.lsantos.dev">@levelsio</a> falando que o jogo dele s&#xF3; deu certo porque ele tem uma audi&#xEA;ncia enorme. O que me deixa frustrado &#xE9; que ningu&#xE9;m est&#xE1; levando em conta a quantidade de *anos* que demorou para ele *construir* consistentemente essa audi&#xEA;ncia. O que estou perdendo?</p>&#x2014; Filipe Deschamps (@FilipeDeschamps) <a href="https://twitter.com/FilipeDeschamps/status/1899416165409038375?ref_src=twsrc%5Etfw&amp;ref=blog.lsantos.dev">March 11, 2025</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></figure><p>E ele est&#xE1; certo. Levels est&#xE1; construindo isso h&#xE1; n&#xE3;o sei quanto tempo, e eu n&#xE3;o tenho nenhum problema com isso. Mas &#xE9; um fato: isso s&#xF3; deu certo porque ele tem uma grande audi&#xEA;ncia, quase um culto de pessoas que o idolatram porque, de alguma forma, o n&#xFA;mero na conta banc&#xE1;ria dele &#xE9; maior.</p><p>Enquanto a grande massa idolatrar milion&#xE1;rios e bilion&#xE1;rios, vamos ter o mesmo problema: eles vendem o que querem, quando querem, simplesmente porque <em>s&#xE3;o quem s&#xE3;o</em>.</p><p>O maior exemplo disso &#xE9; justamente esse jogo, que &#xE9; basicamente uma exposi&#xE7;&#xE3;o de an&#xFA;ncios. N&#xE3;o existe nada que voc&#xEA; possa fazer ao jogar, &#xE9; s&#xF3; voar, atirar nos outros e ver an&#xFA;ncios. E &#xE9; isso. O que, ali&#xE1;s, &#xE9; refletido na p&#xE1;gina de login:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/image.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="662" height="487"></figure><p>Quando voc&#xEA; quer promover sua startup, &#xE9; levado a uma p&#xE1;gina de compra do <em>Stripe</em> e, por uma bagatela de 5.000 USD mensais, pode colocar o que quiser nos bal&#xF5;es.</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/image-1.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="424" height="429"></figure><p>Agora me diga: se uma empresa grande de jogos, digamos, a <em>Blizzard</em>, fizesse a mesma coisa, voc&#xEA; ficaria feliz ou puto da vida? Ent&#xE3;o por que esse tratamento diferente? Acho que voc&#xEA; entende onde quero chegar.</p><blockquote>Nesse <a href="https://youtu.be/VQFvugpxNJE?si=5liiW0fqSqzZOBkq&amp;t=400&amp;ref=blog.lsantos.dev">v&#xED;deo</a> (que vou mostrar mais pra frente), Max discute o mesmo ponto. Isso n&#xE3;o &#xE9; algo que a maioria de n&#xF3;s conseguiria fazer. &#xC9; algo que s&#xF3; ele consegue, justamente por causa desse culto ao dinheiro.</blockquote><p>E, se as empresas t&#xEA;m tanto dinheiro, por que n&#xE3;o patrocinar um jogo de um pequeno produtor indie ou uma empresa pequena que est&#xE1; trabalhando duro para ter seu jogo publicado? Simples: essas pessoas n&#xE3;o querem estragar o jogo com <em>ads</em>. Quem faz isso s&#xE3;o apenas aqueles que n&#xE3;o se importam com o produto, s&#xF3; com o dinheiro no final.</p><p>E nem tudo tem que ser sobre dinheiro. Enquanto essa for a mentalidade, a &#xFA;nica coisa que vamos ter s&#xE3;o produtos mal feitos, cheios de promessas.</p><h2 id="vibe-coding">Vibe coding</h2><p>Esse jogo foi feito em um modelo que aparentemente existe h&#xE1; mais ou menos um m&#xEA;s: <strong>vibe coding</strong>. Um termo feito por Andrej Karpathy (um dos fundadores da OpenAI, ent&#xE3;o sem vi&#xE9;s...) e compartilhado em um tweet:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/image-3.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="603" height="456"></figure><p>Basicamente, a ideia &#xE9; aceitar absolutamente qualquer coisa que a IA cuspa para voc&#xEA;. Voc&#xEA; n&#xE3;o est&#xE1; mais codando, est&#xE1; conversando com um agente de IA. Ela sugere o c&#xF3;digo, voc&#xEA; aceita sem ler. Se der erro, simplesmente copia a mensagem e cola novamente na IA, e assim vai indo at&#xE9; conseguir fazer o app funcionar.</p><blockquote>Esse modelo me lembra muito um algoritmo chamado <a href="https://en.wikipedia.org/wiki/Bogosort?ref=blog.lsantos.dev">Bogosort</a>, onde voc&#xEA; embaralha uma lista at&#xE9; ela &quot;se ordenar&quot; sozinha.</blockquote><p>Eu n&#xE3;o consigo nem come&#xE7;ar a descrever o qu&#xE3;o contra esse tipo de coisa eu sou. Simplesmente aceitar <strong>qualquer coisa</strong> que uma IA te sugere &#xE9; o equivalente de ir no cabeleireiro e ir testando novos cortes de cabelo at&#xE9; um deles dar certo.</p><p>E, para completar, temos esse v&#xED;deo fant&#xE1;stico da <em>Y Combinator</em> dizendo por que <em>vibe coding</em> &#xE9; o futuro:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/IACHfKmZMr8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Vibe Coding Is The Future"></iframe></figure><p>O mais interessante &#xE9; que esse v&#xED;deo &#xE9; t&#xE3;o estranho, de tantas formas... Os coment&#xE1;rios resumem muito melhor do que qualquer coisa que eu possa falar aqui:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/image-5.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="488" height="135"><figcaption><span style="white-space: pre-wrap;">&quot;100x mais r&#xE1;pido? O que voc&#xEA;s est&#xE3;o construindo? To-do lists?&quot;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/image-6.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="490" height="101"><figcaption><span style="white-space: pre-wrap;">&quot;Vibe coding &#xE9; o futuro at&#xE9; voc&#xEA; precisar fazer &apos;vibe debugging&apos;&quot;</span></figcaption></figure><p>O pr&#xF3;prio Garry Tan diz que uma das coisas que ficou clara nas pesquisas &#xE9; que: <em>&#x201C;Vibe coding &#xE9; muito dif&#xED;cil de debugar&#x201D;</em>. Eu imagino por qu&#xEA;&#x2026; Talvez porque voc&#xEA; n&#xE3;o entende absolutamente nada do que est&#xE1; escrito ali? Ou talvez porque <em>debugar</em> seja 90% de ser um programador?</p><p>Al&#xE9;m disso, achei a pesquisa inicial meio estranha. A hip&#xF3;tese proposta &#xE9; que <em>vibe coding</em> &#xE9; o futuro, mas a pesquisa feita foi se <em>&#x201C;como founders usam IA no dia a dia&#x201D;</em>. Isso &#xE9; um exemplo cl&#xE1;ssico da <a href="https://en.wikipedia.org/wiki/Straw_man?ref=blog.lsantos.dev"><strong>Fal&#xE1;cia do Espantalho (Strawman)</strong></a> &#x2014;quando se tenta provar um ponto completamente diferente do que est&#xE1; sendo debatido, criando uma rela&#xE7;&#xE3;o inexistente entre eles. Seria como testar a hip&#xF3;tese de que <em>&#x201C;pessoas preferem motos a carros&#x201D;</em> perguntando se costumavam andar de bicicleta quando crian&#xE7;as.</p><p>No entanto, no minuto 17, Diana Hu fala algo que faz sentido e com o qual eu realmente concordo: para produzir um produto <em>muito</em> r&#xE1;pido, n&#xE3;o h&#xE1; problema em usar algo desse tipo para acelerar o desenvolvimento. O problema &#xE9; achar que podemos construir empresas inteiras assim.</p><blockquote>Sempre lembrando de que, se a IA te faz um 10x engineer, ent&#xE3;o provavelmente voc&#xEA; vai ser substitu&#xED;do por uma IA no futuro pr&#xF3;ximo.</blockquote><p>Enquanto o v&#xED;deo da Y Combinator &#xE9; estranho, mas mostra uma perspectiva do lado que quer ganhar mais dinheiro com menos trabalho, outra perspectiva interessante foi dada pelo Maximilian Schwartzm&#xFC;ller no canal dele:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/VQFvugpxNJE?start=928&amp;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Why &quot;vibe coding&quot; is NOT my future"></iframe></figure><p>E essa eu quero cobrir com mais detalhes.</p><h3 id="algo-para-come%C3%A7ar">Algo para come&#xE7;ar</h3><p><em>Vibe coding</em> &#xE9; uma ideia legal para prototipar rapidamente, testar conceitos e validar hip&#xF3;teses sem gastar muito tempo. Mas quando falamos de algo realmente s&#xE9;rio&#x2014;um produto do qual muitas pessoas dependem, que precisa ser confi&#xE1;vel e sustent&#xE1;vel a longo prazo&#x2014;n&#xE3;o d&#xE1; para tratar o c&#xF3;digo como um experimento descart&#xE1;vel. Voc&#xEA; definitivamente n&#xE3;o quer que algo <em>&#x201C;funcione mais ou menos&#x201D;</em> quando for para produ&#xE7;&#xE3;o, porque &#x201C;mais ou menos&#x201D; em tecnologia significa bugs imprevis&#xED;veis, falhas de seguran&#xE7;a e, no pior cen&#xE1;rio, um sistema inteiro quebrando no momento mais cr&#xED;tico.</p><p>O pr&#xF3;prio Andrej menciona isso no tweet original. Ent&#xE3;o, n&#xE3;o&#x2014;<em>vibe coding</em> n&#xE3;o &#xE9; o futuro da engenharia de software, &#xE9; s&#xF3; uma forma de testar ideias rapidamente, sem muito pensamento estrat&#xE9;gico, para ver se algo d&#xE1; certo. E mesmo quando d&#xE1;, chega um momento em que esse c&#xF3;digo precisa ser reescrito do jeito certo.</p><h3 id="os-perigos-do-vibe-coding">Os perigos do vibe coding</h3><p>Voltando ao caso do simulador de voo, <a href="https://youtu.be/VQFvugpxNJE?si=0vfYqCuB_7R7G2Dn&amp;t=335&amp;ref=blog.lsantos.dev">nesse mesmo v&#xED;deo</a>, ele mostra o jogo rodando em produ&#xE7;&#xE3;o, com milhares de pessoas acessando. Aos cinco minutos, tamb&#xE9;m revela que o c&#xF3;digo estava vulner&#xE1;vel a <strong>XSS (Cross-Site Scripting)</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/image-8.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="483" height="100"><figcaption><span style="white-space: pre-wrap;">&quot;&#xC9; tudo bonito at&#xE9; algu&#xE9;m &apos;vibe code&apos; seu app de banco&quot;</span></figcaption></figure><p>O problema n&#xE3;o &#xE9; deixar de codar ou fingir que est&#xE1; codando. O problema &#xE9; pedir para uma IA escrever o c&#xF3;digo, n&#xE3;o entender o que est&#xE1; acontecendo, publicar o c&#xF3;digo sem questionar e, ainda assim, ignorar o m&#xED;nimo de seguran&#xE7;a. Isso coloca n&#xE3;o apenas a sua empresa, mas milhares de outras pessoas em risco, tudo porque voc&#xEA; se considera um &#x201C;10x engineer&#x201D;.</p><p>No caso espec&#xED;fico, os atacantes come&#xE7;aram a inserir elementos no jogo. Foi &#x201C;super legal&#x201D; para o Pieter, mas se fosse um malware, aposto que n&#xE3;o seria t&#xE3;o divertido assim&#x2026;</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/image-9.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="575" height="196"></figure><h3 id="sempre-existe-um-vi%C3%A9s">Sempre existe um vi&#xE9;s</h3><p>Idealmente, tanto as empresas de IA quanto as VCs querem que isso se torne realidade por dois motivos:</p><ol><li><strong>Empresas de IA</strong> querem manter seu valor, e &#xE9; &#xF3;bvio que &#x201C;vibe coding&#x201D; &#xE9; bom para elas. Quanto mais as pessoas dependem de IA para gerar c&#xF3;digo sem entender o que est&#xE1; acontecendo, mais elas consomem e compram os servi&#xE7;os dessas empresas.</li><li><strong>VCs</strong>, como a Y Combinator, est&#xE3;o focadas em uma &#xFA;nica coisa: dinheiro. Se voc&#xEA; consegue reduzir o custo de contratar desenvolvedores, isso significa mais dinheiro no bolso. E muitas dessas VCs tamb&#xE9;m investem em empresas de IA, o que nos leva ao ponto 1.</li></ol><p>Meu ponto &#xE9; o seguinte: todo mundo que diz que &#x201C;vibe coding&#x201D;, ou IA gerando c&#xF3;digo e resolvendo tudo, &#xE9; &#x201C;maravilhoso&#x201D;, &#x201C;o pr&#xF3;ximo passo&#x201D; ou &#x201C;o futuro&#x201D;, geralmente tem algum interesse pessoal em fazer com que isso seja verdade.</p><p>Minha teoria n&#xE3;o oficial &#xE9; que, no fundo (ou n&#xE3;o), muitas dessas pessoas est&#xE3;o tentando reduzir o valor dos desenvolvedores, porque eles s&#xE3;o essenciais em uma economia tecnol&#xF3;gica, e bons desenvolvedores s&#xE3;o caros. &#xC9; uma tentativa de dizer: <em>&#x201C;Opa! A IA tamb&#xE9;m consegue fazer isso, ent&#xE3;o talvez voc&#xEA; n&#xE3;o valha tanto assim.&#x201D;</em> O objetivo, no final das contas, &#xE9; pagar menos e ainda obter o mesmo resultado. Mais uma vez, tudo se resume a como fazer mais dinheiro de forma mais r&#xE1;pida.</p><p>Mas, para n&#xE3;o ser injusto, eu mesmo testei o &#x201C;vibe coding&#x201D;.</p><h3 id="minha-experi%C3%AAncia">Minha experi&#xEA;ncia</h3><p>Eu postei <a href="https://x.com/_StaticVoid/status/1899831757995733333?ref=blog.lsantos.dev">esse tweet</a> falando com a galera de frontend para fazer <a href="https://t.co/PGA6oJd3xB?ref=blog.lsantos.dev">esse desafio</a>. A ideia &#xE9; s&#xF3; gerar um input de busca exatamente igual a esse:</p><figure class="kg-card kg-image-card"><img src="https://imagedelivery.net/KMb5EadhEKC1gAE0LkjL1g/2b354b64-2cc4-4386-9465-5c13805db900/public" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="630" height="630"></figure><p>O Igor depois me deu a ideia de tentar gerar com IA, e isso n&#xE3;o tinha passado pela minha cabe&#xE7;a, quem sabe poderia dar certo. Mas eu estava completamente errado. Eu testei quatro geradores diferentes: <a href="https://lovable.dev/?ref=blog.lsantos.dev">Lovable</a>, <a href="https://v0.dev/?ref=blog.lsantos.dev">V0</a> (que tem uma funcionalidade de copiar de um screenshot), <a href="https://bolt.new/?ref=blog.lsantos.dev">Bolt</a> e <a href="https://cerebrascoder.com/?ref=blog.lsantos.dev">Cerebras</a>. Isso foi o que eu consegui:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://pbs.twimg.com/media/Gl3kc20WgAAzzdL?format=png&amp;name=900x900" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="794" height="432"><figcaption><span style="white-space: pre-wrap;">Lovable</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://pbs.twimg.com/media/Gl3lYDdWYAA2yyb?format=png&amp;name=small" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="497" height="224"><figcaption><span style="white-space: pre-wrap;">Bolt</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://pbs.twimg.com/media/Gl3m99RWIAAgZTz?format=png&amp;name=small" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="430" height="254"><figcaption><span style="white-space: pre-wrap;">V0</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://pbs.twimg.com/media/Gl3n2Y6XMAAqJu9?format=png&amp;name=small" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="615" height="233"><figcaption><span style="white-space: pre-wrap;">Cerebras</span></figcaption></figure><p>N&#xE3;o &#xE9; exatamente o que eu queria quando eu fiz um prompt como: &quot;Copie exatamente esse componente&quot;. Mesmo depois de 35 minutos de ping-pong com a IA. Ent&#xE3;o eu acho que eu n&#xE3;o vou estar &quot;vibe coding&quot; num futuro pr&#xF3;ximo.</p><h3 id="o-problema-do-vibe-coding">O problema do Vibe Coding</h3><p>Para mim, o problema do &#x201C;Vibe Coding&#x201D; n&#xE3;o est&#xE1; exatamente no c&#xF3;digo sendo gerado &#x2014; a gente j&#xE1; tinha algo similar com assistentes como o Copilot h&#xE1; algum tempo. Quando eu digo que &#x201C;gosto de escrever c&#xF3;digo&#x201D;, o que quero dizer &#xE9; que esse &#xE9; o objetivo de um projeto para mim. Eu quero estar envolvido no processo de codifica&#xE7;&#xE3;o, mas, claro, n&#xE3;o fa&#xE7;o tudo sozinho. N&#xE3;o digito todas as linhas ou todas as letras, e &#xE9; por isso que posso usar assistentes para me ajudar.</p><p>O real problema, na minha vis&#xE3;o, &#xE9; n&#xE3;o estar no controle. &#xC9; inaceit&#xE1;vel para mim &#x201C;criar&#x201D; um produto sobre o qual eu n&#xE3;o tenho o menor controle e n&#xE3;o fa&#xE7;o a menor ideia de como funciona, muito menos colocar isso em produ&#xE7;&#xE3;o para outras pessoas usarem. Quando uso assistentes, estou no controle. Eu guio o que quero que seja feito.</p><p>Mais do que isso, se voc&#xEA; n&#xE3;o gosta de escrever c&#xF3;digo, talvez seja hora de repensar se a programa&#xE7;&#xE3;o &#xE9; a profiss&#xE3;o certa para voc&#xEA;. Como desenvolvedores, a gente <strong>precisa</strong> gostar da programa&#xE7;&#xE3;o em si. Eu n&#xE3;o sou f&#xE3; de bugs, claro, mas n&#xE3;o posso negar que me sinto muito mais calmo e tranquilo quando estou escrevendo o c&#xF3;digo.</p><p>Al&#xE9;m de tudo isso, ficar batendo ping pong com a IA tentando fazer com que ela entenda o que eu quero &#xE9; bem menos produtivo do que simplesmente escrever o c&#xF3;digo por conta pr&#xF3;pria. </p><blockquote>Eu realmente n&#xE3;o entendo por que algumas pessoas querem parar de escrever c&#xF3;digo.</blockquote><p>Para quem n&#xE3;o sabe absolutamente nada de programa&#xE7;&#xE3;o, o &#x201C;vibe coding&#x201D; pode ser um bom caminho, mas &#xE9; uma via &#xFA;nica: ou voc&#xEA; usa para tudo ou para nada. Se voc&#xEA; quer criar algo muito r&#xE1;pido, simples e direto, e n&#xE3;o se importa muito com os detalhes, v&#xE1; em frente. Mas, por favor, n&#xE3;o coloque outras pessoas em risco por n&#xE3;o saber o que deveria ter feito voc&#xEA; mesmo.</p><h3 id="voc%C3%AA-%C3%A9-hip%C3%B3crita">Voc&#xEA; &#xE9; hip&#xF3;crita!</h3><p>As pessoas podem me chamar de hip&#xF3;crita, pois eu tamb&#xE9;m uso IA para outras coisas. N&#xE3;o &#xE9; mentira, eu realmente utilizo intelig&#xEA;ncia artificial. Por&#xE9;m, algo que eu <strong>n&#xE3;o fa&#xE7;o</strong> &#xE9; deixar que ela gere algo que vai para produ&#xE7;&#xE3;o &#x2014; seja c&#xF3;digo, texto ou o que for.</p><p>Eu vejo a IA de forma positiva quando aplicada a algo &#xFA;til. Exemplos disso est&#xE3;o aqui mesmo nesta newsletter! Sempre fa&#xE7;o uma revis&#xE3;o para deixar o texto mais conciso, corrigir pontua&#xE7;&#xF5;es, mas todo o conte&#xFA;do original &#xE9; meu, escrito por mim, letra por letra (sem autocompletion). Quando a IA &#xE9; usada com prop&#xF3;sito, ela pode ser muito eficaz. O problema surge quando &#x201C;usar IA&#x201D; &#xE9; visto como um fim em si mesmo, e n&#xE3;o como uma solu&#xE7;&#xE3;o para um problema espec&#xED;fico. &#x201C;Alguma coisa com IA&#x201D; n&#xE3;o &#xE9; um prop&#xF3;sito. &#xC9; simplesmente uma solu&#xE7;&#xE3;o procurando por um problema.</p><h2 id="slopware">Slopware</h2><p>Eu sigo uma newsletter chamada &quot;The Honest Broker&quot;. Nela, o autor Ted Gioia <a href="https://www.honest-broker.com/p/the-new-aesthetics-of-slop?ref=blog.lsantos.dev">publicou um post muito interessante</a> sobre o novo &quot;movimento art&#xED;stico&quot; chamado de <em>slop</em>. Que &#xE9; a ideia de que aquelas imagens absurdas geradas por IA podem se  tornar um movimento real... Por exemplo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b6fe35-caa7-4a1e-bb4c-d35de5d52c35_512x512.webp" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="512" height="512"><figcaption><span style="white-space: pre-wrap;">Isso &#xE9; considerado um slop</span></figcaption></figure><p>Quanto pior, melhor; quanto mais absurdo, melhor; quanto mais estranho, mais as pessoas v&#xE3;o comprar. E, se voc&#xEA; lembrar do in&#xED;cio desta newsletter, isso descreve exatamente o que o nosso game &#xE9;: algo absurdo, mal feito, mas que as pessoas adoram por um motivo ainda mais absurdo &#x2014; o desejo de <strong>n&#xE3;o ficar de fora</strong>. &#xC9; como uma esp&#xE9;cie de fen&#xF4;meno social, onde o status de &#x201C;estar dentro&#x201D; se torna mais importante do que a qualidade real do produto. E &#xE9; isso que nos leva ao conceito que estou apresentando nesta edi&#xE7;&#xE3;o: <strong>Slopware</strong>.</p><blockquote class="kg-blockquote-alt"><strong>Slopware</strong> &#xE9; o tipo de software que &#xE9; feito de qualquer maneira</blockquote><p><strong>Slopware</strong> &#xE9; o tipo de software que &#xE9; feito de qualquer maneira, sem uma vis&#xE3;o clara ou objetivo definido. Ele provavelmente &#xE9; gerado, em grande parte, por IA, e se passa como um produto s&#xE9;rio. O problema &#xE9; que, na maioria das vezes, os criadores desses produtos n&#xE3;o t&#xEA;m a menor ideia de como esse software foi realmente criado ou como ele funciona. &#xC9; como se fosse uma simula&#xE7;&#xE3;o de algo &#x201C;sofisticado&#x201D;, mas na verdade &#xE9; apenas um amontoado de solu&#xE7;&#xF5;es que, de alguma forma, se tornam um produto utiliz&#xE1;vel &#x2014; ou pelo menos, consum&#xED;vel de alguma forma. Isso se torna ainda mais ir&#xF4;nico quando vemos esse tipo de software sendo vendido como inova&#xE7;&#xE3;o, mesmo que o pr&#xF3;prio processo de cria&#xE7;&#xE3;o seja desorganizado e sem sentido.</p><p>Na mesma newsletter, Ted coloca 4 imagens que parecem slop mas n&#xE3;o s&#xE3;o:</p><figure class="kg-card kg-image-card"><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04983d29-f628-43dc-bc64-e299476a6d9e_1302x1050.png" class="kg-image" alt="Backlog 10 - Slopware: O fim do c&#xF3;digo bem feito" loading="lazy" width="1302" height="1050"></figure><p>Essas imagens mostram algo mais profundo: elas ilustram como, no mundo real, as pessoas est&#xE3;o se esfor&#xE7;ando para alcan&#xE7;ar o mesmo resultado med&#xED;ocre que a IA j&#xE1; entrega, de forma autom&#xE1;tica. O objetivo por tr&#xE1;s disso parece ser normalizar a ideia de que o mal feito &#xE9; o novo bom. Isso acontece porque, em um cen&#xE1;rio onde tudo ao nosso redor &#xE9; de qualidade question&#xE1;vel, qualquer coisa que se destaque minimamente, mesmo que ruim, se torna relativamente incr&#xED;vel. Quando o padr&#xE3;o &#xE9; baixo, at&#xE9; o m&#xED;nimo de esfor&#xE7;o se torna uma grande conquista.</p><p>E &#xE9; a&#xED; que mora o meu maior medo: que esse conceito de <strong>slopware</strong> se estenda para o software de forma generalizada. Imagine um futuro onde nossos aplicativos, ferramentas e sistemas s&#xE3;o feitos sem muito cuidado, com a IA simplesmente criando algo que funciona de maneira superficial, mas que n&#xE3;o passa de uma solu&#xE7;&#xE3;o r&#xE1;pida e sem subst&#xE2;ncia. Em vez de aspirarmos a criar software robusto, bem arquitetado e seguro, aceitaremos como normal um produto que apenas &#x201C;faz o trabalho&#x201D; de maneira med&#xED;ocre.</p><p>Isso representaria uma grande mudan&#xE7;a de paradigma, onde, ao inv&#xE9;s de termos softwares que s&#xE3;o projetados com qualidade e prop&#xF3;sito, todos eles se tornariam exemplos de <strong>slopware</strong>, e qualquer coisa que se distoasse minimamente dessa mediocridade seria considerada uma verdadeira revolu&#xE7;&#xE3;o. O problema &#xE9; que, no fundo, isso levaria a uma diminui&#xE7;&#xE3;o da qualidade geral, colocando em risco a confian&#xE7;a que colocamos em ferramentas que s&#xE3;o essenciais no nosso dia a dia.</p><p>&#xC9; isso. Happy vibe coding.</p>]]></content:encoded></item><item><title><![CDATA[Backlog 9 - O que aconteceu com os devs?]]></title><description><![CDATA[O que aconteceu com uma profissão que antes se gabava de ser super inteligente e focada no que faz? Será que os devs pararam de se importar com seu trabalho?]]></description><link>https://blog.lsantos.dev/o-que-aconteceu-com-devs/</link><guid isPermaLink="false">67c731db07c511c2a0230629</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[career]]></category><category><![CDATA[opinion]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Thu, 06 Mar 2025 11:00:40 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/articles.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/03/articles.png" alt="Backlog 9 - O que aconteceu com os devs?"><p>Nos &#xFA;ltimos anos, especialmente ap&#xF3;s a pandemia e a explos&#xE3;o da IA, testemunhei um decl&#xED;nio silencioso de uma profiss&#xE3;o que se orgulhava de seu pragmatismo e aten&#xE7;&#xE3;o aos detalhes: o desenvolvimento de software.</p><p>N&#xE3;o estou prevendo o fim dessa carreira - muito pelo contr&#xE1;rio. Mas algo mudou na ess&#xEA;ncia do que nos definia. Antes, &#xE9;ramos reconhecidos n&#xE3;o apenas por fazer c&#xF3;digo que funciona, mas por fazer c&#xF3;digo que conta uma hist&#xF3;ria. Quantas horas j&#xE1; perdemos em debates apaixonados sobre linguagens, tecnologias, arquiteturas? &#xC9;ramos pessoas que faziam tecnologia porque am&#xE1;vamos o processo de cria&#xE7;&#xE3;o, a arte por tr&#xE1;s do c&#xF3;digo.</p><p>E essa paix&#xE3;o sempre foi mais evidente em um detalhe fundamental: a documenta&#xE7;&#xE3;o.</p><figure class="kg-card kg-image-card"><img src="https://preview.redd.it/why-read-the-docs-when-i-can-struggle-several-hours-and-v0-ifc184q7ocpa1.png?auto=webp&amp;s=43e46ddb210832f5afa9cc238652fd084b31fab1" class="kg-image" alt="Backlog 9 - O que aconteceu com os devs?" loading="lazy" width="515" height="490"></figure><p>Documentar o c&#xF3;digo que voc&#xEA; acabou de escrever era como se voc&#xEA; estivesse escrevendo um livro sobre a sua obra de arte, as pessoas gostavam de explicar como as coisas funcionavam, gostavam de falar sobre os programas que faziam e os produtos que foram produzidos com tanto carinho. </p><p>A EA recentemente <a href="https://github.com/electronicarts/CnC_Red_Alert?ref=blog.lsantos.dev">liberou o c&#xF3;digo fonte de Command &amp; Conquer</a> e eu postei esse tweet:</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="pt" dir="ltr">Saiu o c&#xF3;digo fonte do Command &amp; Conquer no GitHub e eu tava lendo um pouco dele, n&#xE3;o sei quem &#xE9; o Joe, mas esse c&#xF3;digo &#xE9; provavelmente um dos mais bem documentados que eu j&#xE1; vi na minha vida. Saudades de quando a gente tinha c&#xF3;digo assim... <a href="https://t.co/4KiWVROfZ1?ref=blog.lsantos.dev">pic.twitter.com/4KiWVROfZ1</a></p>&#x2014; Lucas Santos &#x1F1E7;&#x1F1F7;&#x1F1F8;&#x1F1EA; &#x2022; formacaots.com.br &#x1F48E; (@_StaticVoid) <a href="https://twitter.com/_StaticVoid/status/1896350049963307313?ref_src=twsrc%5Etfw&amp;ref=blog.lsantos.dev">March 3, 2025</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></figure><p>Esse c&#xF3;digo foi escrito em 1995 e, sem d&#xFA;vida, &#xE9; um dos mais bem documentados que j&#xE1; vi em toda a minha carreira. Mas ent&#xE3;o parei para pensar: j&#xE1; faz anos que n&#xE3;o vejo uma documenta&#xE7;&#xE3;o assim. <em>Onde foram parar essas boas documenta&#xE7;&#xF5;es?</em></p><p>Nos coment&#xE1;rios desse tweet, muita gente disse que o c&#xF3;digo era feio, que hoje as coisas s&#xE3;o diferentes, que jamais o consideraria bem documentado, e por a&#xED; vai. O que aconteceu? Como passamos de documenta&#xE7;&#xF5;es detalhadas como essa para simples anota&#xE7;&#xF5;es apressadas em READMEs mal feitos?</p><blockquote>Eu deixei essa pergunta em um <a href="https://x.com/_StaticVoid/status/1896350281564295320?ref=blog.lsantos.dev">outro tweet</a>, se voc&#xEA; quiser dar sua opini&#xE3;o por l&#xE1; vai ser super legal! &#x1F604;</blockquote><h2 id="o-que-aconteceu-com-a-gente">O que aconteceu com a gente?</h2><p>Sempre foi claro que c&#xF3;digo &#xE9; uma ferramenta &#x2013; nunca duvidei disso, e n&#xE3;o duvido agora. Mas o que aconteceu com a gente? Paramos de nos preocupar se as pessoas conseguir&#xE3;o usar ou sequer entender nossos sistemas. Hoje, parece muito mais &quot;eficiente&quot; e &quot;produtivo&quot; simplesmente copiar um c&#xF3;digo qualquer, col&#xE1;-lo sem ler nada e ver no que d&#xE1;.</p><p>Eu tenho algumas teorias...</p><h3 id="o-decl%C3%ADnio-lento-do-pensamento-cr%C3%ADtico">O decl&#xED;nio lento do pensamento cr&#xED;tico</h3><p>Para promover a <a href="https://formacaots.com.br/?ref=blog.lsantos.dev" rel="noreferrer">Forma&#xE7;&#xE3;o TypeScript</a>, rodo an&#xFA;ncios em v&#xE1;rias plataformas de tempos em tempos. Talvez voc&#xEA; j&#xE1; tenha visto (ou n&#xE3;o). N&#xE3;o &#xE9; segredo que fa&#xE7;o isso &#x2013; sempre fiz, assim como qualquer pessoa que tem um produto digital.</p><p>Fa&#xE7;o isso h&#xE1; anos sem problemas, mas recentemente publiquei um an&#xFA;ncio um pouco mais &quot;pol&#xEA;mico&quot; e, pelo visto, n&#xE3;o consegui transmitir a mensagem como queria. V&#xE1;rias pessoas repetiram exatamente o mesmo coment&#xE1;rio, mesmo depois de eu j&#xE1; ter respondido a mesma quest&#xE3;o diversas vezes.</p><blockquote>Isso aconteceu tantas vezes que fui for&#xE7;ado a bloquear os coment&#xE1;rios em todos os an&#xFA;ncios.</blockquote><p>N&#xE3;o s&#xE3;o os haters ou os coment&#xE1;rios que me chateiam. Estou na internet h&#xE1; tempo suficiente para lidar com o &#xF3;dio inevit&#xE1;vel que as pessoas destilam do conforto de seus teclados. O que me incomoda &#xE9; a <strong>total falta de esfor&#xE7;o para entender o contexto</strong> &#x2014; ou seja, para <strong>ler</strong>.</p><p>E o mesmo acontece no desenvolvimento. Os <strong>devs est&#xE3;o cada vez mais pregui&#xE7;osos e acomodados</strong>, perdendo a curiosidade que antes era um pr&#xE9;-requisito para essa &#xE1;rea.</p><p>De uma profiss&#xE3;o que se orgulhava de ser meticulosa e focada, passamos para uma gera&#xE7;&#xE3;o que terceiriza seu pensamento para outra m&#xE1;quina, apenas para repetir exatamente o que ela diz. Novamente: </p><blockquote class="kg-blockquote-alt">o que aconteceu com a gente?</blockquote><p>Desde que o ChatGPT e outras ferramentas surgiram, a quantidade de pessoas que simplesmente copiam e colam um prompt sem nem sequer ler o que ele diz &#xE9; absurda.</p><p>E n&#xE3;o sou s&#xF3; eu dizendo isso do alto de um trono de m&#xE1;rmore. Existem diversos relat&#xF3;rios sobre o assunto:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://refactoring.fm/p/code-quality-in-the-age-of-ai?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Code Quality in the Age of AI &#x2705;</div><div class="kg-bookmark-description">How to create a process for quality throughout the whole SDLC.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51e95ee-996d-448c-a76a-09879eaa7dfa%2Fapple-touch-icon-180x180.png" alt="Backlog 9 - O que aconteceu com os devs?"><span class="kg-bookmark-author">Refactoring</span><span class="kg-bookmark-publisher">Luca Rossi</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47090301-73a3-4cf3-a2aa-531023b9b456_1326x742.png" alt="Backlog 9 - O que aconteceu com os devs?"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://devclass.com/2025/02/20/ai-is-eroding-code-quality-states-new-in-depth-report/?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">AI is eroding code quality states new in-depth report &#x2022; DEVCLASS</div><div class="kg-bookmark-description">New research from GitClear, based on analysis of 211 million lines of code, suggest that AI coding assistants [&#x2026;]</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://devclass.com/wp-content/uploads/2018/08/cropped-favicon-270x270.png" alt="Backlog 9 - O que aconteceu com os devs?"><span class="kg-bookmark-author">DEVCLASS</span><span class="kg-bookmark-publisher">Tim Anderson</span></div></div><div class="kg-bookmark-thumbnail"><img src="http://devclass.com/wp-content/uploads/2023/02/shutterstock_programmer.webp" alt="Backlog 9 - O que aconteceu com os devs?"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.gitclear.com/coding_on_copilot_data_shows_ais_downward_pressure_on_code_quality?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Coding on Copilot: 2023 Data Suggests Downward Pressure on Code Quality (incl 2024 projections) - GitClear</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gitclear.com/favicon.ico" alt="Backlog 9 - O que aconteceu com os devs?"><span class="kg-bookmark-author">GitClear Footer Logo</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://asset.gitclear.com/assets/home/DevClass_logo-7b652934a597f763354ed2554ebbaf4f91725e64386139f8f31d9e123a6f580b.png" alt="Backlog 9 - O que aconteceu com os devs?"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://leaddev.com/software-quality/how-ai-generated-code-accelerates-technical-debt?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How AI generated code compounds technical debt</div><div class="kg-bookmark-description">GitClear&#x2019;s latest report exposes rising code duplication and declining quality as AI coding tools gain in popularity.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://leaddev.com/wp-content/themes/pbc/assets/favicon.svg" alt="Backlog 9 - O que aconteceu com os devs?"><span class="kg-bookmark-author">LeadDev</span><span class="kg-bookmark-publisher">Bill Doerrfeld</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://leaddev.com/wp-content/uploads/2024/07/AI-3.png" alt="Backlog 9 - O que aconteceu com os devs?"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.gitclear.com/ai_assistant_code_quality_2025_research?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">AI Copilot Code Quality: 2025 Data Suggests 4x Growth in Code Clones - GitClear</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gitclear.com/favicon.ico" alt="Backlog 9 - O que aconteceu com os devs?"><span class="kg-bookmark-author">GitClear Footer Logo</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://asset.gitclear.com/assets/home/DevClass_logo-7b652934a597f763354ed2554ebbaf4f91725e64386139f8f31d9e123a6f580b.png" alt="Backlog 9 - O que aconteceu com os devs?"></div></a></figure><p>Quase todos apontam a mesma coisa: A qualidade de c&#xF3;digo est&#xE1; decaindo ano ap&#xF3;s ano porque <strong>as pessoas est&#xE3;o simplesmente copiando c&#xF3;digo ao inv&#xE9;s de pensar</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://asset.gitclear.com/assets/pages/duplicate-by-year-wide-3396f6f6bd745a9871fe4cadc99fff82de5379821a81ebf2fbdad3eb5a9ec37f.png" class="kg-image" alt="Backlog 9 - O que aconteceu com os devs?" loading="lazy" title="Learn how AI-assisted development could beget cloned blocks of code in 10% of all authored commits" width="1200" height="650"><figcaption><span style="white-space: pre-wrap;">Porcentagem de commits contendo c&#xF3;digo duplicado</span></figcaption></figure><blockquote>Tenho muito mais a dizer sobre isso e vou abordar o assunto em outro Backlog.</blockquote><p>O ponto aqui &#xE9; que poucos agora se preocupam em documentar ou dar um pouco mais de aten&#xE7;&#xE3;o ao c&#xF3;digo que escreve, porque simplesmente:</p><ul><li>&#xC9; mais f&#xE1;cil pedir para a IA gerar um c&#xF3;digo na hora, sem considerar o restante da base.</li><li>Copiar todo o c&#xF3;digo e pedir para a IA explic&#xE1;-lo em duas linhas.</li><li>Deixar que a IA escreva a documenta&#xE7;&#xE3;o.</li></ul><p>E h&#xE1; um problema curioso nisso tudo: o c&#xF3;digo gerado por IA costuma ser muito bem comentado. O resultado? Criou-se o estere&#xF3;tipo de que qualquer c&#xF3;digo bem comentado s&#xF3; pode ter sido escrito por IA &#x2014; e n&#xE3;o que seja simplesmente um c&#xF3;digo bem feito e f&#xE1;cil de ler.</p><h3 id="dev-bom-sabe-ler-e-entender">Dev bom sabe ler e entender</h3><p>Muita gente chega falando: </p><blockquote>&quot;Ah! Mas o Clean Code &#xE9; contra coment&#xE1;rios blablabla&quot;</blockquote><p>E esse &#xE9; mais um exemplo de como as pessoas pararam de pensar. <em>Clean Code</em> &#xE9; um livro antigo, de outra &#xE9;poca, mas nem por isso condena coment&#xE1;rios no c&#xF3;digo &#x2014; ele condena coment&#xE1;rios in&#xFA;teis. Por exemplo:</p><pre><code class="language-js">// Soma a+b
function sum (a, b) { return a+b }
</code></pre><p>&#xC9; um coment&#xE1;rio in&#xFA;til &#x2014; descreve <em>o que</em> est&#xE1; acontecendo, mas n&#xE3;o <em>por qu&#xEA;</em>. E &#xE9; a&#xED; que est&#xE1; a nuance.</p><p>A documenta&#xE7;&#xE3;o (seja em coment&#xE1;rios ou n&#xE3;o) deve explicar o <em>porqu&#xEA;</em> das coisas, n&#xE3;o <em>o que</em> o c&#xF3;digo faz. Isso deve ser claro apenas lendo o c&#xF3;digo.</p><blockquote>&quot;Se voc&#xEA; n&#xE3;o consegue entender o que o c&#xF3;digo faz s&#xF3; lendo, ent&#xE3;o voc&#xEA; &#xE9; um mau dev&quot;</blockquote><p>Essa frase me irrita tanto, e por um motivo simples, Veja esse c&#xF3;digo:</p><pre><code class="language-c ">float Q_rsqrt( float number )
{
	long i;
	float x2, y;
	const float threehalfs = 1.5F;

	x2 = number * 0.5F;
	y  = number;
	i  = * ( long * ) &amp;y;                       
	i  = 0x5f3759df - ( i &gt;&gt; 1 );               
	y  = * ( float * ) &amp;i;
	y  = y * ( threehalfs - ( x2 * y * y ) );   
	return y;
}</code></pre><p>Agora tente ler esse c&#xF3;digo sem nenhum contexto. Conseguiu entender?</p><p>Se sim, s&#xF3; existem duas possibilidades: ou voc&#xEA; &#xE9; extremamente inteligente e fora da curva, ou j&#xE1; conhece a hist&#xF3;ria desse bloco.</p><p>Entender c&#xF3;digo &#xE9; dif&#xED;cil, principalmente porque ele <strong>sempre vem com um contexto</strong>. &#xC9; por isso que coment&#xE1;rios s&#xE3;o t&#xE3;o importantes. Um trecho solto, sem explica&#xE7;&#xE3;o, &#xE9; como abrir um livro em uma p&#xE1;gina aleat&#xF3;ria e tentar seguir a hist&#xF3;ria a partir dali.</p><blockquote>Caso voc&#xEA; esteja curioso(a) o c&#xF3;digo &#xE9; esse <a href="https://en.wikipedia.org/wiki/Fast_inverse_square_root?ref=blog.lsantos.dev">aqui</a></blockquote><p>Mas eu acho que a culpa n&#xE3;o &#xE9; s&#xF3; de devs, mas tamb&#xE9;m de um mindset que eu odeio muito. O de &quot;<a href="https://www.admdnewsletter.com/hustle-bro-culture-is-making-our/?ref=blog.lsantos.dev">hustle bro</a>&quot; ou de &quot;<a href="https://adlega.com/blog/indie-hackers-a-new-path-in-tech-entrepreneurship/?ref=blog.lsantos.dev">indie hacker</a>&quot;. Essa &#xE9; a minha outra teoria.</p><h2 id="ship-it-ship-it-ship-it">Ship it! Ship it! Ship it!</h2><p>Duas palavras definem o mercado de TI de 2019 at&#xE9; hoje (2025): <strong>dinheiro</strong> e <strong>velocidade</strong>.</p><p>Entre em qualquer site de biblioteca, ferramenta ou framework e voc&#xEA; sempre ver&#xE1; alguma varia&#xE7;&#xE3;o de <em>&quot;blazing fast&quot;</em>, <em>&quot;weeks, not months&quot;</em>, e similares. Velocidade e lucro a qualquer custo se tornaram os objetivos principais de praticamente tudo.</p><p>A cultura de <em>hustle bro</em>, com seu mantra de &quot;VOC&#xCA; CONSEGUE! ACREDITE EM VOC&#xCA;&quot; e &quot;trabalhe enquanto eles dormem&quot;, ganhou for&#xE7;a e acabou transformando um mindset que eu admirava, o de <em>indie hacker</em>. Um indie hacker &#xE9; um empreendedor solo que cria um produto com total controle, sem investidores, sendo independente. Eu sempre amei essa ideia de trabalhar no que voc&#xEA; deseja e fazer dar certo. Mas isso mudou quando tudo passou a ser sobre ser mais eficiente e produtivo, como se o dinheiro fosse o &#xFA;nico objetivo.</p><blockquote class="kg-blockquote-alt">As pessoas est&#xE3;o transitando de um estado de &quot;planejar, aprender e executar&quot; para &quot;executar e ver no que d&#xE1;&quot;.</blockquote><p>No mesmo cen&#xE1;rio dos criadores de &quot;por que testar? Testar n&#xE3;o adiciona valor ao produto&quot;, surge a ideia de que &quot;documenta&#xE7;&#xE3;o &#xE9; uma perda de tempo&quot; pelo mesmo motivo. Assim, a documenta&#xE7;&#xE3;o &#xE9; negligenciada, pois, novamente, &quot;bons devs sabem o que acontece no c&#xF3;digo s&#xF3; de olhar&quot;. Documenta&#xE7;&#xE3;o, housekeeping e boas pr&#xE1;ticas s&#xE3;o vistos como desperd&#xED;cio, e o foco passa a ser apenas em <strong>shipar shipar shipar</strong>.</p><p>Para exemplificar, vou citar duas figuras emblem&#xE1;ticas do novo &quot;indie hacking&quot;, <a href="https://x.com/levelsio?ref=blog.lsantos.dev">Pieter Levels</a> e <a href="https://x.com/marc_louvion?lang=en&amp;ref=blog.lsantos.dev">Marc Lou</a>, mas longe de serem os &#xFA;nicos, eles s&#xE3;o apenas os que fazem mais barulho.</p><blockquote>Note que os detalhes s&#xE3;o impressionantemente iguais. Bios com sites e rendas mensais, cifr&#xF5;es em todo lugar, a palavra &quot;ship&quot; e &quot;fast&quot; est&#xE3;o bastante presentes.</blockquote><p>Para provar meu ponto, um deles est&#xE1; neste momento desenvolvendo um jogo, sem nenhum conhecimento pr&#xE9;vio em desenvolvimento de jogos, sem ler documenta&#xE7;&#xE3;o, apenas copiando e colando c&#xF3;digo do Claude Sonnet e esse tweet resume muito do que est&#xE1; acontecendo.</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">This is like the vibe coding version of the TV show &quot;Alone&quot;.<a href="https://twitter.com/levelsio?ref_src=twsrc%5Etfw&amp;ref=blog.lsantos.dev">@levelsio</a> is stranded in the wilderness, trying to build a multiplayer videogame with nothing but a Cursor subscription.<br><br>As time goes on, the challenge gets harder: the game gets more complicated, the bugs get&#x2026; <a href="https://t.co/t0YOJsljWl?ref=blog.lsantos.dev">https://t.co/t0YOJsljWl</a></p>&#x2014; George Arrowsmith (@ThatArrowsmith) <a href="https://twitter.com/ThatArrowsmith/status/1896186694614802432?ref_src=twsrc%5Etfw&amp;ref=blog.lsantos.dev">March 2, 2025</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></figure><p>&#xC0; medida que os bugs ficam mais dif&#xED;ceis, a solu&#xE7;&#xE3;o n&#xE3;o &#xE9; aprender a fazer do jeito certo, mas sim resolver os bugs e criar outros &quot;para ver se funciona&quot;. As pessoas est&#xE3;o trocando o ciclo de &quot;planejar, aprender e executar&quot; por &quot;executar e ver no que d&#xE1;&quot;, o que &#xE9; p&#xE9;ssimo, pois ningu&#xE9;m quer estudar nada, s&#xF3; testar e ver o que acontece.</p><p>O problema n&#xE3;o &#xE9; o que elas &quot;sabem que n&#xE3;o sabem&quot;, mas o que &quot;n&#xE3;o sabem que n&#xE3;o sabem&quot;, e ainda assim acreditam que est&#xE1; tudo resolvido. O maior exemplo disso foi a <a href="https://dev.to/lucaschitolina/the-marc-lou-drama-and-securitiy-lessons-1j02?ref=blog.lsantos.dev">treta recente com o Marc</a>, onde um dos seus produtos passou por s&#xE9;rios problemas porque ele n&#xE3;o implementou a seguran&#xE7;a necess&#xE1;ria no seu &quot;MVP&quot;. Coisas que poderiam ter sido resolvidas com 15 minutos de leitura de documenta&#xE7;&#xE3;o sobre os casos de uso. Isso me lembra novamente o meme:</p><figure class="kg-card kg-image-card"><img src="https://preview.redd.it/vvmy92frv8cd1.png?width=640&amp;crop=smart&amp;auto=webp&amp;s=e27df453432bf16ca5f5e243c7721f463528b6db" class="kg-image" alt="Backlog 9 - O que aconteceu com os devs?" loading="lazy" width="640" height="484"></figure><h2 id="documenta%C3%A7%C3%B5es-que-importam">Documenta&#xE7;&#xF5;es que importam</h2><p>Para finalizar, quero deixar algumas dicas de como eu vejo boas documenta&#xE7;&#xF5;es. Empresas como o <a href="https://docs.stripe.com/?ref=blog.lsantos.dev">Stripe</a>, <a href="https://vercel.com/docs?ref=blog.lsantos.dev">Vercel</a>, <a href="https://www.twilio.com/docs/?ref=blog.lsantos.dev">Twillio</a> e <a href="https://resend.com/docs/introduction?ref=blog.lsantos.dev">Resend</a> para mim s&#xE3;o as que mais dominaram a &quot;arte de documentar&quot; as coisas que eles tem. As docs s&#xE3;o extremamente bem feitas e f&#xE1;ceis de ler, tamb&#xE9;m s&#xE3;o mantidas atualizadas. </p><p>E o que torna uma documenta&#xE7;&#xE3;o boa?</p><ol><li>Fa&#xE7;a a p&#xE1;gina inicial ser um guia, o <a href="https://docs.stripe.com/?ref=blog.lsantos.dev"><a href="https://docs.stripe.com/?ref=blog.lsantos.dev">Stripe faz isso muito bem</a></a>, guiando voc&#xEA; pelos produtos</li><li>Ensine os fundamentos da sua tecnologia, n&#xE3;o s&#xF3; que ela existe l&#xE1;, a Vercel tem uma <a href="https://vercel.com/docs/fundamentals?ref=blog.lsantos.dev">p&#xE1;gina muito boa para isso</a></li><li>C&#xF3;digo deve sempre estar presente na forma de um tutorial, um passo a passo ou guia simples, como na <a href="https://resend.com/docs/send-with-nodejs?ref=blog.lsantos.dev">Resend</a></li><li>Cubra casos de uso comuns entre os usu&#xE1;rios com documenta&#xE7;&#xF5;es espec&#xED;ficas para elas, que nem <a href="https://www.twilio.com/docs/sendgrid?ref=blog.lsantos.dev#send-your-first-email">essa p&#xE1;gina</a> do SendGrid</li></ol><p>Mas como manter a documenta&#xE7;&#xE3;o atualizada? O c&#xF3;digo muda, mas ele n&#xE3;o est&#xE1; ligado &#xE0; documenta&#xE7;&#xE3;o... Mas e se estivesse? </p><h3 id="documenta%C3%A7%C3%A3o-c%C3%B3digo">Documenta&#xE7;&#xE3;o === C&#xF3;digo</h3><p>Tente escrever c&#xF3;digo que gere a documenta&#xE7;&#xE3;o, n&#xE3;o o contr&#xE1;rio. Em vez de criar e manter a documenta&#xE7;&#xE3;o separada, fa&#xE7;a com que o c&#xF3;digo seja a fonte da verdade. Ferramentas como o <a href="https://protobuf.dev/?ref=blog.lsantos.dev">protobuf</a> ou a spec da OpenAPI s&#xE3;o excelentes para manter contratos documentados. Por que n&#xE3;o gerar a documenta&#xE7;&#xE3;o <strong>diretamente a partir</strong> delas?</p><p>Se voc&#xEA; acha que manter a documenta&#xE7;&#xE3;o &#xE9; muito complicado, pare de mant&#xEA;-la manualmente. Mantenha apenas o c&#xF3;digo e fa&#xE7;a com que ele gere a documenta&#xE7;&#xE3;o automaticamente. N&#xE3;o permita atualizar um sem o outro. Existem v&#xE1;rias ferramentas que permitem isso tanto com coment&#xE1;rios (JS/TSDoc) quanto no pr&#xF3;prio c&#xF3;digo. Eu, por exemplo, j&#xE1; <a href="https://github.com/expresso/router?ref=blog.lsantos.dev">criei uma</a> que transforma rotas diretamente em specs da OpenAPI.</p><p>O que quero dizer &#xE9; que voc&#xEA; n&#xE3;o precisa manter a documenta&#xE7;&#xE3;o separada; voc&#xEA; pode delegar essa tarefa ao seu c&#xF3;digo. Assim, voc&#xEA; sempre saber&#xE1; o que est&#xE1; no c&#xF3;digo e ter&#xE1; a documenta&#xE7;&#xE3;o atualizada sem esfor&#xE7;o extra.</p><h3 id="escreva-coment%C3%A1rios-que-importam">Escreva coment&#xE1;rios que importam</h3><p>Coment&#xE1;rios devem contar uma hist&#xF3;ria. Se a fun&#xE7;&#xE3;o &#xE9; &#xF3;bvia, n&#xE3;o &#xE9; necess&#xE1;rio comentar. A aplica&#xE7;&#xE3;o provavelmente nem notar&#xE1; um coment&#xE1;rio a mais ou a falta dele, mas coment&#xE1;rios in&#xFA;teis fazem o oposto do que precisamos.</p><p>Quando um coment&#xE1;rio ruim &#xE9; adicionado, voc&#xEA; n&#xE3;o consegue distinguir um bom de um ruim, e acaba gastando tempo lendo coisas desnecess&#xE1;rias. Ningu&#xE9;m gosta de ler mais do que precisa.</p><p>Por&#xE9;m, quando voc&#xEA; fornece todo o contexto sobre o motivo de uma fun&#xE7;&#xE3;o ou at&#xE9; mesmo de uma linha de c&#xF3;digo, voc&#xEA; poupa horas de debugging, tanto suas quanto de outras pessoas no futuro.</p><p>Ao contr&#xE1;rio do que muitos dizem, documenta&#xE7;&#xF5;es, se feitas corretamente, podem trazer muitos benef&#xED;cios, como uma curva de aprendizado menor e maior facilidade para manter um projeto a longo prazo. Foi gra&#xE7;as a documenta&#xE7;&#xF5;es como essas que consegui manter <a href="https://github.lsantos.dev/gotql?ref=blog.lsantos.dev">este projeto</a> por tanto tempo, por exemplo.</p><p>E voc&#xEA;? Qual &#xE9; a sua opini&#xE3;o sobre documenta&#xE7;&#xF5;es?</p>]]></content:encoded></item><item><title><![CDATA[Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?]]></title><description><![CDATA[Eu desinstalei o VSCode completamente e troquei para o Vim. Em 6 meses de uso, será que essa foi uma boa ideia?]]></description><link>https://blog.lsantos.dev/backlog-vim/</link><guid isPermaLink="false">67b4bf36b29568a2afd34b1a</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[vim]]></category><category><![CDATA[productivity]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Thu, 20 Feb 2025 11:00:21 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/articles-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/articles-1.png" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?"><p>H&#xE1; mais ou menos 6 meses eu resolvi que era hora de deixar de lado o preciosismo e largar meu editor de longa data (VSCode) e come&#xE7;ar a usar esse t&#xE3;o famoso <strong>Vim</strong>. Quando terminei de configurar e estava satisfeito com meu progresso inicial, escrevi <a href="https://blog.lsantos.dev/instalando-e-configurando-o-neovim/">esse artigo</a>. Nele, eu documentei grande parte da minha jornada atrav&#xE9;s da instala&#xE7;&#xE3;o e das primeiras impress&#xF5;es com o Vim, mas eu n&#xE3;o quis me estender muito sobre o uso porque eu n&#xE3;o tinha usado o editor por tempo o suficiente para ter opini&#xF5;es (e nem estat&#xED;sticas) sobre o uso dele.</p><p>Agora &#xE9; diferente. Depois de 6 meses usando <strong>somente</strong> o Neovim como meu editor principal (na real, como o &#xFA;nico editor) eu quero destrinchar tudo que eu aprendi, o que eu ganhei, o que eu perdi, o que eu mais gostei e o que eu achei estranho nessa nova experi&#xEA;ncia.</p><p>Vamos l&#xE1;!</p><hr><h2 id="pausa-para-o-aviso">Pausa para o aviso!</h2><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/Completo---Essencial@2x.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="2000" height="339"></figure><p>&#x1F525; Quer dominar TypeScript de verdade? &#x1F525;</p><p>Se voc&#xEA; quer escrever c&#xF3;digo mais seguro, escal&#xE1;vel e sem surpresas, <strong>A Forma&#xE7;&#xE3;o TS Essencial</strong> &#xE9; o curso que vai te levar do b&#xE1;sico ao avan&#xE7;ado com pr&#xE1;tica real! S&#xE3;o mais de <strong>16 horas de conte&#xFA;do</strong>, <strong>3 projetos pr&#xE1;ticos</strong> com cen&#xE1;rios reais, exerc&#xED;cios, um minicurso de valida&#xE7;&#xE3;o com Zod e <strong>acesso &#xE0; comunidade no Discord</strong>, onde voc&#xEA; pode trocar ideias e tirar d&#xFA;vidas direto comigo.</p><p>&#x1F4A1; J&#xE1; somos <strong>mais de 300 alunos</strong> e, s&#xF3; aqui na newsletter, voc&#xEA; ganha <strong>15% de desconto</strong> com o cupom exclusivo <strong>FTSBKLG8</strong>! Mas corre, porque &#xE9; por tempo limitado.</p><p>&#x1F3AF; Garanta sua vaga agora: <a href="https://pay.hotmart.com/L84853211Y?checkoutMode=10&amp;off=e01ju3cm&amp;offDiscount=FTSBKLG8&amp;utm_source=blog&amp;utm_medium=backlog-8&amp;utm_campaign=sponsor" rel="noreferrer">https://formacaots.com.br</a></p><hr><p>&#x1F48C; <strong>Me ajude a manter a newsletter no ar!</strong> Se voc&#xEA; quer patrocinar e alcan&#xE7;ar milhares de devs toda edi&#xE7;&#xE3;o, entre em contato: <a href="mailto:hello@lsantos.dev"><strong>hello@lsantos.dev</strong></a>.</p><h2 id="por-que-comecei-a-usar-o-vim">Por que comecei a usar o Vim?</h2><p>Eu uso o VSCode desde muito provavelmente o lan&#xE7;amento, lembro de ter usado a vers&#xE3;o beta e pensado &quot;meu Deus isso &#xE9; horr&#xED;vel&quot; e voltado diretamente para o meu Sublime Text. Mas, alguns anos depois o VSCode se tornou provavelmente o melhor e mais poderoso editor de c&#xF3;digo de todos, hoje eu vejo poucos motivos para voc&#xEA; come&#xE7;ar usando outro editor que n&#xE3;o seja ele.</p><blockquote>Mas ent&#xE3;o... Por que eu comecei a usar o Vim?</blockquote><p>Desde que eu comecei em desenvolvimento eu j&#xE1; conhecia o <code>vi</code> e outros editores como o <code>nano</code> para quando eu precisava fazer um SSH em alguma m&#xE1;quina, ou ent&#xE3;o configurar algum servidor, mas eu nunca me importei em aprender <strong>de verdade</strong> como o Vi/Vim funcionava at&#xE9; meados de 2016 em um PHPExperience em S&#xE3;o Paulo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/rainglow/examples/master/atom/gloom-contrast.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="2120" height="1504"><figcaption><span style="white-space: pre-wrap;">Screenshot do falecido Atom, o precursor do VSCode</span></figcaption></figure><p>Nesse dia o <a href="https://github.com/augustohp?ref=blog.lsantos.dev">Augusto Pascutti</a> fez uma palestra chamada <em>&quot;Por que Vim?&quot;</em>, mostrando os v&#xE1;rios pontos interessantes de usar o editor. Macros, movimenta&#xE7;&#xF5;es, configura&#xE7;&#xE3;o aberta e muito mais. Desde esse dia eu mantive o Vim no radar (com uma curiosidade absurda) mas, sempre que eu tentava come&#xE7;ar, a curva de aprendizado era muito alta e eu desistia porque demorava muito tempo.</p><p>Os anos foram passando, eu fiquei cada vez mais preso no VSCode, eu adorava estar por l&#xE1;, meu ambiente era inteiro modificado, eu consegui deixar o editor realmente como a minha casa. Mas infelizmente eu ainda precisava ter o editor instalado no computador... E o VSCode n&#xE3;o &#xE9; necessariamente muito leve para rodar em todos os lugares, mesmo com avan&#xE7;os como a separa&#xE7;&#xE3;o do servidor da interface e etc...</p><p>Mas, o ponto final que me fez mudar para o Vim, foi <strong>perceber quanto tempo eu perdia parando de escrever ou tirando a m&#xE3;o do teclado para pegar no mouse e mover as coisas</strong>... Se voc&#xEA; nunca pensou nisso, pare um pouco, grave voc&#xEA; mesmo(a) usando o computador em timelapse e veja a quantidade de vezes que a sua m&#xE3;o faz o movimento lateral de pegar no mouse e depois voltar... Isso estava me incomodando muito - A ponto de eu estar trabalhando em um teclado especial com um mouse embutido.</p><blockquote>Eu ODEIO mouses no geral, se eu tenho a op&#xE7;&#xE3;o de fazer tudo em um terminal eu farei... Talvez isso seja o resqu&#xED;cio da minha &#xE9;poca de sysadmin com AKS. Mas eu adoro TUIs e tudo que n&#xE3;o tenha interface gr&#xE1;fica simplesmente porque &#xE9; muito mais responsivo.</blockquote><p>Ent&#xE3;o, quando eu instalei meu dual boot com o Arch Linux, eu resolvi instalar um Window manager chamado Sway, que dispensa o uso do mouse para a maioria das coisas, ent&#xE3;o eu pensei: &quot;Por que n&#xE3;o come&#xE7;ar a abandonar o mouse de vez?&quot; e foi ai que eu resolvi sair completamente do VSCode e usar apenas o Vim.</p><p>Infelizmente o uso de GUIs ainda &#xE9; muito grande e a maioria delas n&#xE3;o tem um suporte muito bom para teclado, com atalhos ou movimenta&#xE7;&#xF5;es, ent&#xE3;o infelizmente n&#xE3;o vamos ter como abandonar o mouse de uma vez por todas...</p><blockquote>Eu tamb&#xE9;m tentei usar a extens&#xE3;o do Vim para o VSCode, mas ele &#xE9; um editor feito para ser usado com um mouse, ent&#xE3;o a movimenta&#xE7;&#xE3;o n&#xE3;o era t&#xE3;o fluida na interface, o que era um problema.</blockquote><h2 id="adapta%C3%A7%C3%A3o-inicial">Adapta&#xE7;&#xE3;o inicial</h2><blockquote>Vou pular a parte da configura&#xE7;&#xE3;o e tudo mais porque j&#xE1; comentei sobre no primeiro artigo</blockquote><p>O principal no in&#xED;cio foi me for&#xE7;ar a criar o h&#xE1;bito de usar o Vim. Porque eu estava t&#xE3;o acostumado com o VSCode que, por padr&#xE3;o, eu j&#xE1; abria o editor direto.</p><p>Para me for&#xE7;ar a usar o Vim, eu removi o VSCode da minha &#xE1;rea de trabalho, removi os bindings de arquivos que abririam no VSCode e me forcei a apenas abrir o terminal quando eu iniciasse a m&#xE1;quina. Alguns dias fazendo isso foram suficiente para pegar o h&#xE1;bito. Outra coisa que ajudou bastante foi que eu gostava do look and feel do Nvim, ent&#xE3;o era legal estar com ele aberto, e ele &#xE9; muito responsivo ent&#xE3;o as coisas acontecem muito r&#xE1;pido e voc&#xEA; fica se sentindo um hacker.</p><p>Quando o primeiro empecilho acabou, o segundo era o pior de todos: <strong>lembrar das teclas</strong>...</p><h3 id="o-primeiro-problema">O primeiro problema</h3><p>Essa &#xE9;, sem duvida, a parte mais complicada de tudo que eu tive que fazer para usar o Vim. As principais teclas que todo mundo conhece (<code>hjkl</code>) s&#xE3;o bem simples, a maioria dos comandos b&#xE1;sicos como trocar de modo (com <code>i</code>, <code>v</code>), substituir (<code>c</code>, <code>C</code>, <code>r</code> e <code>R</code>) e as modifica&#xE7;&#xF5;es de linhas com <code>O</code>, <code>dd</code>, <code>D</code>, etc tamb&#xE9;m s&#xE3;o bem intuitivos. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1893" height="812"><figcaption><span style="white-space: pre-wrap;">Nvim rodando um projeto com Deno</span></figcaption></figure><p>O problema &#xE9; quando voc&#xEA; tem que interagir com o resto que n&#xE3;o &#xE9; texto, por exemplo, a lista de arquivos, abrir o gerenciador do Git (com o LazyGit) e interagir com popups que aparecem na tela, como as completions do intellisense e os quick peaks que mostram as hints de tipo no TypeScript. N&#xE3;o porque elas s&#xE3;o ruins, mas porque em cada novo painel, as teclas mudam.</p><p>Por exemplo, o Telescope (equivalente ao <code>ctrl+p</code> do VSCode) tem um campo de busca, ent&#xE3;o as teclas padr&#xE3;o de movimenta&#xE7;&#xE3;o n&#xE3;o funcionam (porque elas est&#xE3;o digitando no input de texto), ao inv&#xE9;s disso a combina&#xE7;&#xE3;o &#xE9; <code>ctrl-p</code> para subir e <code>ctrl+n</code> para descer (para <code>previous</code> e <code>next</code>). Al&#xE9;m disso ele tem uma pequena preview do lado direito que voc&#xEA; pode movimentar n&#xE3;o com <code>ctrl+hjkl</code>, mas com <code>ctrl+dfku</code>...</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-1.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1901" height="1914"><figcaption><span style="white-space: pre-wrap;">Telescope.nvim no modo de inser&#xE7;&#xE3;o</span></figcaption></figure><p>Mas isso &#xE9; apenas no modo de inser&#xE7;&#xE3;o, quando trocamos para o modo normal, as teclas de movimenta&#xE7;&#xE3;o voltam ao padr&#xE3;o, mas as da preview n&#xE3;o...</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-2.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1405" height="448"><figcaption><span style="white-space: pre-wrap;">Telescope.nvim no modo normal</span></figcaption></figure><p>Al&#xE9;m disso, o equivalente ao &quot;Find All&quot; do VSCode, &#xE9; uma mistura de <code>ripgrep</code> com <code>fzf</code> que busca em todos os arquivos via regex e &#xE9; uma das ferramentas mais poderosas do Nvim, mas n&#xE3;o tem uma sele&#xE7;&#xE3;o de modos... Ent&#xE3;o para mover os resultados sem usar as setas (que est&#xE3;o mais longe no teclado), temos que usar o que? O que seria intuitivo: <code>ctrl+hjkl</code>...</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-3.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1900" height="1278"><figcaption><span style="white-space: pre-wrap;">Captura de tela do ripgrep</span></figcaption></figure><p>Por&#xE9;m, por incr&#xED;vel que pare&#xE7;a, voc&#xEA; usa tanto essas ferramentas (especialmente o telescope) que essas combina&#xE7;&#xF5;es meio que ficam gravadas na sua cabe&#xE7;a. No final do primeiro m&#xEA;s eu j&#xE1; estava 100% confort&#xE1;vel com a UI do Vim, inclusive movendo o cursor pelas janelas e tudo mais.</p><p>No final, as teclas n&#xE3;o s&#xE3;o tanto um problema porque o pr&#xF3;prio LazyVim tem um comando para buscar todas as teclas, o <code>&lt;leader&gt;sk</code>:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-6.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1515" height="1600"><figcaption><span style="white-space: pre-wrap;">Se voc&#xEA; perdeu alguma tecla, pode buscar aqui</span></figcaption></figure><p>Al&#xE9;m disso o pacote <code>whichkey</code> mostra todas as combina&#xE7;&#xF5;es poss&#xED;veis de uma tecla pressionada:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-7.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="535" height="957"><figcaption><span style="white-space: pre-wrap;">Exemplo de teclas poss&#xED;veis com &lt;leader&gt; pressionado</span></figcaption></figure><p>Isso torna toda a experi&#xEA;ncia muito boa e aqu&#xE9;m de um VSCode, se voc&#xEA; quer explorar o editor, basta passar pelas teclas.</p><h3 id="o-melhor-e-pior-ao-mesmo-tempo">O melhor e pior ao mesmo tempo</h3><p>Outra coisa que vale a pena pontuar &#xE9; que, durante o primeiro m&#xEA;s (e at&#xE9; hoje, na verdade) eu estou sempre fazendo pequenos tweaks aqui e ali na minha configura&#xE7;&#xE3;o do LazyVim, especialmente quando ele atualiza e muda padr&#xF5;es. Isso &#xE9; relativamente chato, provavelmente &#xE9; a coisa que eu mais odeio no Nvim at&#xE9; o momento, mas tamb&#xE9;m &#xE9; uma das que eu mais gosto: <strong>a configura&#xE7;&#xE3;o</strong>.</p><p>Enquanto a configura&#xE7;&#xE3;o &#xE9; extremamente permissiva e voc&#xEA; pode virtualmente fazer qualquer coisa, ela tamb&#xE9;m &#xE9; extremamente complexa de entender. A documenta&#xE7;&#xE3;o &#xE9; basicamente inexistente, o LSP de Lua tenta fazer o melhor para extrair as fun&#xE7;&#xF5;es e mostrar o que voc&#xEA; pode usar, mas a maioria das fun&#xE7;&#xF5;es do Vim n&#xE3;o s&#xE3;o conhecidas, o autocompletion &#xE9; bem ruim e no geral voc&#xEA; se v&#xEA; procurando coisas na Internet mais do que qualquer coisa.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-4.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1224" height="1844"><figcaption><span style="white-space: pre-wrap;">Overrides para o Neotree</span></figcaption></figure><p>A configura&#xE7;&#xE3;o do hier&#xE1;rquica &#xE9; hier&#xE1;quica, ent&#xE3;o as configura&#xE7;&#xF5;es iniciais v&#xE3;o ser sobrescritas por uma configura&#xE7;&#xE3;o posterior, portanto a ordem como os plugins e configura&#xE7;&#xF5;es s&#xE3;o carregados importa. E isso &#xE9; uma droga porque n&#xE3;o existe um autocompletion bonitinho para o que voc&#xEA; pode colocar ali, &#xE9; sempre um jogo de testes. </p><p>Alguma programa&#xE7;&#xE3;o em Lua quase sempre &#xE9; necess&#xE1;rio, e muitas vezes obrigat&#xF3;rio. Em outros casos a configura&#xE7;&#xE3;o base &#xE9; suficiente, no geral, a documenta&#xE7;&#xE3;o do LazyVim em si &#xE9; muito boa e ajuda MUITO, ela &#xE9; bem definida e explicada, mas voc&#xEA; eventualmente vai cair em problemas.</p><h3 id="lsps">LSPs</h3><p>O maior problema que eu tive foi configurar os LSPs. As configura&#xE7;&#xF5;es padr&#xE3;o para a maioria das linguagens que eu uso &#xE9; ok, por&#xE9;m eu tive um conflito com Node e Deno. Como ambos usam a mesma linguagem por&#xE9;m tem arquivos-chave diferentes, eu tive que escrever uma fun&#xE7;&#xE3;o para verificar se o reposit&#xF3;rio era um reposit&#xF3;rio Deno ou Node e evitar que eu tenha tanto o LSP de Node quando o de Deno no mesmo arquivo.</p><blockquote>LSPs s&#xE3;o <a href="https://en.wikipedia.org/wiki/Language_Server_Protocol?ref=blog.lsantos.dev">Language Server Protocols</a>, um protocolo criado pela Microsoft para introduzir a capacidade de um editor se conectar a um servi&#xE7;o que tem a intelig&#xEA;ncia da linguagem de forma separada, independente do editor, para dar coisas como completions, intellisense e etc de forma distribu&#xED;da.</blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-5.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1230" height="957"><figcaption><span style="white-space: pre-wrap;">Fun&#xE7;&#xE3;o para distinguir Deno de Node</span></figcaption></figure><p>At&#xE9; agora eu s&#xF3; falei coisas ruins, ou coisas que gostei menos do que os demais, ser&#xE1; que o Vim &#xE9; bom assim mesmo?</p><h2 id="o-ponto-de-virada">O ponto de virada</h2><p>Depois de mais ou menos 2 meses usando o Vim diariamente eu estava pensando que n&#xE3;o iria ter nenhuma mudan&#xE7;a, eu n&#xE3;o estava me sentindo mais &quot;r&#xE1;pido&quot; ou com &quot;super poderes&quot;, at&#xE9; o dia que eu precisei modificar um arquivo realmente grande.</p><p>Como eu estava com um pouco de pressa e teria que alterar uma s&#xE9;rie de coisas no arquivo com Regex, eu tentei usar o VSCode logo de cara, mas ele n&#xE3;o abriu o arquivo... Ent&#xE3;o tentei abrir com o Vim e ele nem sofreu, enquanto o VSCode estava usando mais de 2gb de mem&#xF3;ria s&#xF3; para abrir o arquivo, meu Nvim estava com o arquivo aberto, funcional usando meros 120mb. A&#xED; foi quando eu percebi o ganho al&#xE9;m do desenvolvimento.</p><p>Eu estava t&#xE3;o focado em usar o editor que eu n&#xE3;o cheguei a perceber os verdadeiros super poderes que eu estava ganhando. Primeiro de tudo, eu estava usando cerca de 45% a menos de recursos do meu computador, uma economia absurda para um editor de c&#xF3;digo. Al&#xE9;m disso o editor &#xE9; <strong>muito responsivo</strong>, quase tudo que voc&#xEA; faz acontece praticamente instant&#xE2;neamente, tudo isso sem tirar a m&#xE3;o do teclado. Eu considero isso um super poder.</p><p>Dentro do c&#xF3;digo, eu comecei a perceber que eu ganhei uma mem&#xF3;ria muscular para algumas coisas, por exemplo:</p><ul><li>Apertar <code>:wq</code> ou <code>:w</code> quase sempre em todo lugar</li><li>Apertar <code>esc</code> depois de digitar uma linha (inclusive durante esse artigo)</li><li>Tentar mover qualquer coisa com <code>jhkl</code></li><li>Tentar navegar com <code>w</code> e <code>b</code> entre linhas e <code>{</code> no c&#xF3;digo</li><li>Pesquisar qualquer coisa apertando <code>/</code></li><li>Tentar usar o <code>&lt;leader&gt;</code> (que no meu caso &#xE9; o espa&#xE7;o) para iniciar comandos</li><li>Copiar coisas com <code>y</code> e colar com <code>p</code></li></ul><p>Isso est&#xE1; t&#xE3;o autom&#xE1;tico para mim que virou algo natural, quando eu n&#xE3;o consigo fazer algum desses comandos eu me sinto estranho. Al&#xE9;m disso eu comecei a perceber que eu estava cada vez mais usando outros comandos do Vim que eu n&#xE3;o usava antes, <em>eu estava aprendendo!</em></p><h3 id="melhorias-progressivas">Melhorias progressivas</h3><p>Um dos meus checkpoints foi ter come&#xE7;ado a fazer o uso extensivo de <strong>vim words</strong>, que s&#xE3;o conjuntos de teclas que permitem que voc&#xEA; fa&#xE7;a v&#xE1;rias a&#xE7;&#xF5;es ao mesmo tempo, por exemplo, se eu quiser deletar um &#xFA;nico caractere eu posso apertar <code>x</code>, ent&#xE3;o se eu quiser deletar uma palavra inteira eu posso s&#xF3; ficar apertando <code>x</code> at&#xE9; o fim. Mas eu tamb&#xE9;m posso falar para o Vim deletar tudo dentro daquela palavra com <code>diw</code>, ou <em><strong>d</strong>elete <strong>i</strong>n <strong>w</strong>ord</em> sem deletar os espa&#xE7;os, ou deletar tudo em volta com <code>daw</code>, onde o &quot;a&quot; &#xE9; <em><strong>a</strong>round</em>.</p><p>Essas s&#xE3;o as conhecidas Vim words, que eu j&#xE1; sabia que existiam mas nunca tinha usado extensivamente. E voc&#xEA; pode combinar <code>aw</code> e <code>iw</code> com basicamente qualquer coisa, por exemplo, o LazyVim tem um plugin chamado <code>surround</code> que permite que voc&#xEA; envolva qualquer coisa com qualquer outra coisa, por exemplo:</p><pre><code class="language-js">function foo () {
    const codigo = &apos;1&apos;
}
</code></pre><p>Se eu quiser adicionar um <code>try/catch</code> ao redor desse c&#xF3;digo, eu posso entrar no modo de sele&#xE7;&#xE3;o de linha com <code>V</code>, digitar <code>gsa?</code> e incluir <code>try {</code> no primeiro prompt e <code>} catch {}</code> no segundo:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-8.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1372" height="128"></figure><p>E o resultado vai ser o esperado:</p><pre><code class="language-js">function foo () {
    try {const codigo = &apos;1&apos;} catch {}
}
</code></pre><p>Outros comandos mais avan&#xE7;ados como edi&#xE7;&#xE3;o em bloco <code>ctrl+V</code> tamb&#xE9;m s&#xE3;o super &#xFA;teis, e muito mais poderosos do que a edi&#xE7;&#xE3;o de multi cursor do VSCode, porque voc&#xEA; pode editar m&#xFA;ltiplas colunas ao mesmo tempo. </p><p>Quando isso n&#xE3;o &#xE9; suficiente, voc&#xEA; pode usar o famoso replace no estilo <code>sed</code> , que foi uma ferramenta essencial para eu poder ter uma melhoria dr&#xE1;stica na minha efici&#xEA;ncia, por exemplo, se eu quisesse substituir uma sequencia grande de chamadas:</p><pre><code class="language-ts">controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))
controller.run(new URN&lt;&apos;application&apos;&gt;(args.params.applicationId))</code></pre><p>Eu quero remover todas as <code>new URN...</code> e deixar apenas a chamada para o <code>args.params.application</code>, eu posso usar a substitui&#xE7;&#xE3;o <code>%s/(new URN&lt;&apos;application&apos;&gt;\(([a-zA-Z\.]*)\))/\1</code> para poder trocar tudo de uma vez:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-9.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="1296" height="924"><figcaption><span style="white-space: pre-wrap;">Replace inline com regex</span></figcaption></figure><p>O comando em si parece bem complexo, mas vamos quebrar pra ficar mais f&#xE1;cil. Aqui eu estou:</p><ol><li>Pegando tudo que &#xE9; <code>(new URN&lt;&apos;application&apos;&gt;(</code></li><li>Criando um grupo contendo <code>[a-zA-Z\.]*</code>, ou seja, todas as letras e o ponto</li><li>Pegando os <code>))</code> finais</li><li>Substituindo tudo por <code>\1</code> que denota o primeiro grupo que criamos no 2</li></ol><p>Isso &#xE9; algo que jamais eu iria fazer t&#xE3;o &quot;simples&quot; em outro lugar.</p><h2 id="outras-coisas-que-eu-notei">Outras coisas que eu notei</h2><p>Al&#xE9;m dessas pequenas demonstra&#xE7;&#xF5;es, eu tamb&#xE9;m notei algumas coisas sobre Vim que valem a pena serem comentadas:</p><ul><li>Macros s&#xE3;o <strong>muito bons</strong>, mas n&#xE3;o s&#xE3;o para todas as situa&#xE7;&#xF5;es</li><li>Aprender a lidar com buffers e janelas &#xE9; essencial, saber o que &#xE9; um buffer, o que &#xE9; uma janela, o que &#xE9; um painel e essas coisas</li><li>O Vim possui um conjunto de registradores que voc&#xEA; pode acessar com <code>&quot;</code> no Lazy ou com <code>:reg</code> , esses registradores s&#xE3;o poderosos porque permitem que voc&#xEA;, por exemplo, copie multiplos textos de uma vez com <code>&quot;&lt;numero do reg&gt;y</code> e cole de v&#xE1;rios tamb&#xE9;m com <code>&quot;&lt;numero&gt;p</code>, o lazy tem uma lista bem legal de registradores </li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-11.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="829" height="627"><figcaption><span style="white-space: pre-wrap;">Registradores no LazyVim</span></figcaption></figure><ul><li>Al&#xE9;m de registradores o Lazy mant&#xE9;m uma lista de bookmarks (ou s&#xF3; <code>marks</code>) que permitem que voc&#xEA; salve um local no c&#xF3;digo e volte para l&#xE1; instant&#xE2;neamente, em qualquer buffer, isso &#xE9; muito &#xFA;til para se mover entre duas localiza&#xE7;&#xF5;es r&#xE1;pidamente com <code>&apos;&apos;</code>, mas voc&#xEA; pode criar uma marca com <code>m&lt;letra&gt;</code> e depois ir at&#xE9; ela com <code>&apos;&lt;letra&gt;</code></li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/image-12.png" class="kg-image" alt="Backlog 8 - Minha jornada com Vim. Em 6 meses, o que mudou?" loading="lazy" width="828" height="543"><figcaption><span style="white-space: pre-wrap;">Lista de marcas autom&#xE1;ticas</span></figcaption></figure><ul><li>O Vim tem um terminal integrado com <code>:term</code> mas o Lazy tem um terminal em uma aba embaixo assim como o VSCode que permite voc&#xEA; usar os comandos do Vim normalmente, mas eu achei um pouco mais f&#xE1;cil usar uma outra aba do mesmo terminal principalmente porque isso pode causar lag no editor.</li></ul><h2 id="veredito-valeu-a-pena">Veredito, valeu a pena?</h2><p>Depois de 6 meses usando sem parar, eu posso dizer que <strong>essa foi a melhor escolha que eu j&#xE1; fiz</strong>. A forma como o Vim &#xE9; r&#xE1;pido e instant&#xE2;neo &#xE9; incr&#xED;vel, usar o teclado ao inv&#xE9;s do mouse para movimenta&#xE7;&#xE3;o e para a&#xE7;&#xF5;es dentro do editor &#xE9; ordens de grandeza mais r&#xE1;pido e mais eficiente do que usar um mouse tradicional (mesmo que o neovim suporte mouse).</p><p>A integra&#xE7;&#xE3;o do editor com o que voc&#xEA; est&#xE1; fazendo e o estado de &quot;flow&quot; que voc&#xEA; entra estando em uma tela preta sem nenhuma distra&#xE7;&#xE3;o &#xE9; simplesmente incr&#xED;vel. Al&#xE9;m de que tudo fica muito mais r&#xE1;pido e muito mais eficiente conforme voc&#xEA; vai pegando mais dicas e aprendendo mais coisas sobre o Vim.</p><p>Acredito que o principal para mim &#xE9; que eu posso ver que estou melhorando, &#xE9; f&#xE1;cil ver uma melhoria, &#xE9; f&#xE1;cil entender o que est&#xE1; acontecendo, o editor &#xE9; intuitivo depois que voc&#xEA; aprende os conceitos b&#xE1;sicos sob o qual ele opera. E voc&#xEA; perceber que existe uma melhoria constante e estar constantemente descobrindo novas coisas, novas teclas, novas combina&#xE7;&#xF5;es, novos workflows &#xE9; simplesmente incr&#xED;vel, at&#xE9; para um editor que tem mais de 40 anos.</p><p>Se voc&#xEA; j&#xE1; tentou usar o Vim, deixa seu coment&#xE1;rio nas <a href="https://lsantos.dev/?ref=blog.lsantos.dev" rel="noreferrer">minhas redes</a>! Eu quero muito saber como foi a <strong>sua</strong> experi&#xEA;ncia com o Vim!</p><p>At&#xE9; mais!</p>]]></content:encoded></item><item><title><![CDATA[Backlog #7 - As 10 Lições Que Mudaram a Minha Vida como Dev]]></title><description><![CDATA[Durante 13 anos eu construí uma carreira dev da qual eu me orgulho. Mas eu não fiz isso sozinho. Essas foram as 10 lições mais importantes que aprendi nesse caminho.]]></description><link>https://blog.lsantos.dev/backlog-7-as-10-licoes-que-mudaram-a-minha-vida-como-dev-copy/</link><guid isPermaLink="false">67b0ab17428ab576dca65801</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[career]]></category><category><![CDATA[opinion]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Sat, 15 Feb 2025 14:56:35 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/articles.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/02/articles.png" alt="Backlog #7 - As 10 Li&#xE7;&#xF5;es Que Mudaram a Minha Vida como Dev"><p>Mais um dia, mais um backlog! Hoje, trago algo diferente: As 10 li&#xE7;&#xF5;es mais importantes que aprendi em 13 anos como dev.</p><p>Muita gente j&#xE1; me perguntou sobre dicas e aprendizados essenciais na minha carreira. Confesso que deixei essa ideia de lado por um tempo, at&#xE9; que me deparei com um <a href="https://www.linkedin.com/posts/jhonathansoares_10-anos-de-conselhos-sobre-programa%C3%A7%C3%A3o-em-activity-7275651115512135680-RIcm/?utm_source=share&amp;utm_medium=member_desktop">post</a> no final do ano que me fez lembrar dessas perguntas.</p><p>Ent&#xE3;o hoje eu quero falar sobre as 10 li&#xE7;&#xF5;es mais importantes que eu aprendi em 13 anos de carreira como dev. Lembrando que essas li&#xE7;&#xF5;es est&#xE3;o s&#xF3; no &#xE2;mbito de desenvolvimento, ent&#xE3;o tudo que eu falar por aqui &#xE9; relacionado estritamente &#xE0; isso.</p><div class="kg-card kg-callout-card kg-callout-card-accent"><div class="kg-callout-emoji">&#x1F60D;</div><div class="kg-callout-text">Lembrando que, se voc&#xEA; gostou (ou n&#xE3;o) do conte&#xFA;do, deixa um <a href="https://forms.gle/jTMhTyjq389xpDGVA?ref=blog.lsantos.dev">feedback aqui no formul&#xE1;rio</a>! &#xC9; super importante pra mim poder saber o que voc&#xEA; est&#xE1; pensando e o que voc&#xEA; quer ver por aqui!</div></div><hr><h2 id="1seu-c%C3%B3digo-n%C3%A3o-%C3%A9-seu-nada-vai-ser-como-voc%C3%AA-quer">1 - Seu c&#xF3;digo n&#xE3;o &#xE9; seu: Nada vai ser como voc&#xEA; quer</h2><p>A primeira (e, talvez, mais importante) li&#xE7;&#xE3;o &#xE9; que o c&#xF3;digo nunca ser&#xE1; exatamente como voc&#xEA; quer. A &#xFA;nica maneira de fazer tudo do seu jeito &#xE9; trabalhando sozinho em um projeto pessoal. Mas, no trabalho em equipe, voc&#xEA; sempre vai precisar ceder e se adaptar.</p><p>No come&#xE7;o, eu queria que tudo fosse do meu jeito. Quando algu&#xE9;m criticava meu c&#xF3;digo, eu achava que era um ataque pessoal. Com o tempo, percebi que estava errado.</p><p>O c&#xF3;digo n&#xE3;o &#xE9; s&#xF3; seu. Ele precisa ser f&#xE1;cil de entender para que outras pessoas possam mexer nele no futuro. O mais importante n&#xE3;o &#xE9; escrever do jeito que voc&#xEA; gosta, mas sim garantir que toda a equipe consiga trabalhar bem com ele. Aprender a aceitar feedbacks, conversar sobre solu&#xE7;&#xF5;es e deixar o orgulho de lado s&#xE3;o habilidades essenciais para um bom programador.</p><h2 id="2eleg%C3%A2ncia-%C3%A9-para-moda-voc%C3%AA-precisa-ser-pragm%C3%A1tico">2 - Eleg&#xE2;ncia &#xE9; para moda, voc&#xEA; precisa ser pragm&#xE1;tico</h2><p>Quantas vezes voc&#xEA; j&#xE1; encontrou um c&#xF3;digo imposs&#xED;vel de entender? Ou um c&#xF3;digo t&#xE3;o abstrato que parece tentar prever todos os casos de uso do mundo? Ou ent&#xE3;o aquele c&#xF3;digo &quot;elegante&quot; que s&#xF3; o autor compreende?</p><p>A realidade &#xE9; que o c&#xF3;digo que a gente faz n&#xE3;o &#xE9; para a m&#xE1;quina, a gente j&#xE1; resolveu esse problema h&#xE1; muito tempo com compiladores. Eles otimizam seu c&#xF3;digo para que a m&#xE1;quina leia da forma mais eficiente poss&#xED;vel. O seu trabalho &#xE9; fazer c&#xF3;digo que outras pessoas v&#xE3;o ler e dar manuten&#xE7;&#xE3;o. Uma frase que me marcou muito foi:</p><blockquote class="kg-blockquote-alt">A maioria dos sistemas n&#xE3;o s&#xE3;o bons o suficiente para se tornarem legados.</blockquote><p>Isso &#xE9; uma verdade brutal. Apenas sistemas bem projetados e robustos sobrevivem por anos ou d&#xE9;cadas. Eu comento bastante sobre isso, mas um bom sistema, para mim, &#xE9; composto de tr&#xEA;s pilares:</p><ul><li>Documenta&#xE7;&#xE3;o bem escrita e c&#xF3;digo que seja leg&#xED;vel e comentado</li><li>Que segue as pr&#xE1;ticas atuais do time</li><li>N&#xE3;o possui abstra&#xE7;&#xF5;es complexas e &#xE9; simples o suficiente dentro do seu escopo</li></ul><p>J&#xE1; me crucificaram muito por falar de comentar c&#xF3;digo, ou ent&#xE3;o quando eu falo veementemente que n&#xE3;o gosto de programa&#xE7;&#xE3;o funcional porque eu acho que, al&#xE9;m de dif&#xED;cil de ler e entender, exige um conhecimento pr&#xE9;vio bem grande. Mas essas afirma&#xE7;&#xF5;es s&#xE3;o fundadas em uma simples frase:</p><blockquote class="kg-blockquote-alt">Nunca assuma que todas as pessoas s&#xE3;o iguais a voc&#xEA;</blockquote><p>Nem todos v&#xE3;o entender imediatamente o c&#xF3;digo que voc&#xEA; escreveu. Nem todos conhecem programa&#xE7;&#xE3;o funcional. E, honestamente, voc&#xEA; mesmo pode n&#xE3;o compreender seu pr&#xF3;prio c&#xF3;digo daqui a alguns meses se n&#xE3;o deix&#xE1;-lo claro.</p><p>Priorize sempre a facilidade de manuten&#xE7;&#xE3;o e o alinhamento com as pr&#xE1;ticas da equipe, ao inv&#xE9;s de criar solu&#xE7;&#xF5;es &quot;elegantes&quot;, mas dif&#xED;ceis de entender.</p><h2 id="3n%C3%A3o-existe-planejamento">3 - N&#xE3;o existe planejamento</h2><p>Quantas vezes j&#xE1; ouvi a frase: &quot;Precisamos entregar isso amanh&#xE3;, &#xE9; urgente!&quot; Mas quando tudo &#xE9; urgente, nada &#xE9; urgente, certo? Essa foi uma das li&#xE7;&#xF5;es mais importantes que aprendi trabalhando em startups:</p><blockquote class="kg-blockquote-alt">O que importa &#xE9; o que est&#xE1; acontecendo agora</blockquote><p>Voc&#xEA; pode planejar seu projeto e seu sistema o quanto quiser, mas se algo mais importante surgir no meio do caminho, sem d&#xFA;vida, todo o planejamento ser&#xE1; jogado de lado para perseguir esse novo objetivo. Startups s&#xE3;o basicamente fundadas nessa ideia de serem barcos pequenos e r&#xE1;pidos, f&#xE1;ceis de virar e pegar o vento mais forte naquele momento. Por isso, um planejamento s&#xF3;lido raramente sobrevive por muito tempo.</p><p>J&#xE1; em grandes empresas, o problema &#xE9; o oposto: Planejamento em excesso. Tudo leva meses para acontecer, mas, ao mesmo tempo, tudo &#xE9; tratado como prioridade m&#xE1;xima. O resultado? Muitas vezes ningu&#xE9;m sabe exatamente por que algo precisa ser feito e, depois de entregue, ningu&#xE9;m sabe quem pediu ou para que serve.</p><p>No fim das contas, sempre achei mais eficiente focar nos objetivos em vez de um planejamento r&#xED;gido. Em vez de tentar prever cada passo, o ideal &#xE9; definir claramente &quot;o que precisa ser feito&quot; e manter uma vis&#xE3;o de longo prazo. Isso gera resultados mais consistentes e evita desperd&#xED;cio de tempo com planos que logo se tornam obsoletos.</p><h2 id="4as-vezes-menos-%C3%A9-mais">4 - As vezes menos &#xE9; mais</h2><p>Quantas vezes a gente n&#xE3;o ficou empolgado com uma ideia ou com um framework novo ou com um novo conceito que quer&#xED;amos tanto aplicar que acabamos fazendo um <a href="https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition?ref=blog.lsantos.dev">FizzBuzz Enterprise</a>?</p><p>A grande li&#xE7;&#xE3;o aqui &#xE9; que, muitas vezes, nosso projeto n&#xE3;o &#xE9; grande ou cr&#xED;tico o suficiente para justificar todas as tecnologias e padr&#xF5;es que queremos aplicar. Uma boa arquitetura &#xE9; importante, mas ser&#xE1; que voc&#xEA; realmente precisa de <a href="https://en.wikipedia.org/wiki/K-anonymity?ref=blog.lsantos.dev">K-anonymity</a> e de todos os design patterns existentes para um simples sistema de to-do list? Aquele pequeno sistema com 10 clientes realmente precisa se proteger contra todas as CVEs j&#xE1; registradas, mesmo quando aplicar essas corre&#xE7;&#xF5;es pode ser mais trabalhoso do que ben&#xE9;fico?</p><p>As vezes menos &#xE9; mais, tirar coisas do projeto para que ele possa ir para frente &#xE9; o caminho mais r&#xE1;pido para saber se voc&#xEA; precisa ou n&#xE3;o melhorar a arquitetura do seu sistema.</p><h2 id="5tecnologia-%C3%A9-um-trade-off">5 - Tecnologia &#xE9; um trade-off</h2><p>A cl&#xE1;ssica piada do desenvolvedor s&#xEA;nior que responde tudo com &quot;depende&quot; tem um fundo de verdade. N&#xE3;o existe uma bala de prata em tecnologia que resolva todos os problemas. Um professor meu na faculdade costumava dizer:</p><blockquote class="kg-blockquote-alt">Toda decis&#xE3;o que melhora algo em uma parte, piora algo em outra parte</blockquote><p>Ele comparava a programa&#xE7;&#xE3;o a um pacto: Voc&#xEA; sempre sacrifica algo para obter uma solu&#xE7;&#xE3;o, porque qualquer escolha tem efeitos colaterais.</p><p>O importante &#xE9; lembrar que voc&#xEA; nunca vai tomar boas decis&#xF5;es, voc&#xEA; sempre vai tomar decis&#xF5;es que s&#xE3;o boas para algo e ruins para outro algo, um exemplo cl&#xE1;ssico disso &#xE9; seguran&#xE7;a: Quanto melhor e mais resistente o algoritmo de criptografia, mais lento ele vai ser. Ou ent&#xE3;o quando eu comentei no meu <a href="https://blog.lsantos.dev/criptografia-assimetrica-com-rsa/">artigo sobre RSA</a>, as chaves podem ser arbitrariamente grandes, mas existe um ponto onde ela &#xE9; <strong>suficiente</strong>.</p><p>Os suecos tem uma palavra chamada <a href="https://en.wikipedia.org/wiki/Lagom?ref=blog.lsantos.dev#:~:text=Lagom%20(pronounced%20%5B%CB%88l%C9%91%CC%82%CB%90%C9%A1%C9%94m%5D%2C,(in%20matter%20of%20amounts)."><strong>lagom</strong></a>, que &#xE9; uma forma de dizer &quot;apenas o suficiente&quot; ou &quot;nem mais, nem menos&quot;. Esse conceito resume bem essa li&#xE7;&#xE3;o: A melhor escolha &#xE9; aquela que equilibra necessidades sem excessos.</p><h2 id="6tecnologia-vem-e-vai-bases-ficam">6 - Tecnologia vem e vai, bases ficam</h2><p>Isso &#xE9; algo que todo desenvolvedor aprende mais cedo ou mais tarde. &#xC9; uma daquelas li&#xE7;&#xF5;es fundamentais da carreira.</p><p>Chega um momento em que voc&#xEA; se cansa de aprender algo novo todos os dias, de estar sempre correndo atr&#xE1;s do framework da moda, da &#xFA;ltima inova&#xE7;&#xE3;o em IA ou do mais recente padr&#xE3;o de arquitetura. Se voc&#xEA; baseia seu conhecimento apenas em ferramentas, &#xE9; como um pedreiro que acredita que s&#xF3; pode martelar com um martelo, sem perceber que qualquer coisa pesada pode cumprir a mesma fun&#xE7;&#xE3;o.</p><p>A tecnologia funciona da mesma forma. As ferramentas v&#xEA;m e v&#xE3;o. Eu comecei com Delphi e Visual Basic, que hoje quase n&#xE3;o existem. Se meu aprendizado tivesse sido focado apenas neles, minha carreira j&#xE1; teria chegado ao fim. O que realmente importa &#xE9; entender os fundamentos, porque eles continuam relevantes independentemente da tecnologia usada.</p><p>Preste aten&#xE7;&#xE3;o nas aulas de algoritmos, complexidade ciclom&#xE1;tica e at&#xE9; no pseudoc&#xF3;digo. Talvez escrever c&#xF3;digo no papel, como os Maias e Astecas faziam, j&#xE1; te ajude muito a lembrar.</p><p>Porque, quando a hype da linguagem atual passar, voc&#xEA; saber&#xE1; como continuar para a pr&#xF3;xima. Mas lembre-se:</p><blockquote class="kg-blockquote-alt">O mercado sempre vai estar em hype com alguma coisa, isso n&#xE3;o significa que voc&#xEA; tem que surfar todas as ondas</blockquote><h2 id="7feito-%C3%A9-melhor-do-que-perfeito">7 - Feito &#xE9; melhor do que perfeito?</h2><p>Existia uma frase que um CTO meu falava que me deixava muito irritado: &quot;Feito &#xE9; melhor que perfeito&quot;. E isso acontecia por dois motivos:</p><ol><li>Eu achava que tudo deveria ser perfeito (veja o item 1)</li><li>Eu n&#xE3;o suportava a ideia de entregar as coisas sem estarem finalizadas</li></ol><p>Depois de muito tempo eu entendo o que essa frase realmente significa. N&#xE3;o &#xE9; que voc&#xEA; precise entregar as coisas mal feitas e de qualquer jeito s&#xF3; para que o sistema v&#xE1; para frente. Se algu&#xE9;m est&#xE1; te pedindo para fazer isso, ent&#xE3;o voc&#xEA; est&#xE1; com toda a raz&#xE3;o em recusar, mas &#xE9; sobre saber dosar o quanto &#xE9; <strong>&quot;BOM O SUFICIENTE&quot;</strong> (LAGOM).</p><p>Existe um manifesto muito legal que descreve tudo que eu estou falando aqui. Ele se chama <a href="https://medium.com/@bre/the-cult-of-done-manifesto-724ca1c2ff13?ref=blog.lsantos.dev"><em>The cult of done</em></a><em> (</em><a href="https://www.youtube.com/watch?v=bJQj1uKtnus&amp;ref=blog.lsantos.dev"><em>video</em></a><em>):</em></p><figure class="kg-card kg-embed-card"><iframe width="200" height="150" src="https://www.youtube.com/embed/bJQj1uKtnus?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="The Cult of Done: How to Finish the Thing"></iframe></figure><h2 id="8seja-seu-pr%C3%B3prio-oponente">8 - Seja seu pr&#xF3;prio oponente</h2><p>Por muito tempo, eu via outras pessoas falando sobre os pr&#xEA;mios que ganharam e as conquistas que alcan&#xE7;aram. Eu olhava para tudo isso com admira&#xE7;&#xE3;o, querendo estar naquele mesmo lugar. Meu grande sonho sempre foi criar algo &#xFA;til, algo que as pessoas realmente usassem e gostassem. Eu queria ser o Ken Thompson, o Dennis Ritchie ou, quem sabe, o Bill Joy da modernidade.</p><p>Com o tempo, percebi que me comparava demais com os outros, sempre me sentindo menos importante por n&#xE3;o ter algo grandioso para mostrar. Isso me fazia mal. Mas quando parei para refletir, notei que as pessoas que fizeram coisas incr&#xED;veis tinham apenas um verdadeiro advers&#xE1;rio: Elas mesmas.</p><p>Voc&#xEA; s&#xF3; precisa se comparar com quem voc&#xEA; era ontem e buscar ser melhor do que essa vers&#xE3;o. Ningu&#xE9;m mais importa nessa equa&#xE7;&#xE3;o.</p><p>Fa&#xE7;a algo que fa&#xE7;a sentido para voc&#xEA;. Todo o resto &#xE9; consequ&#xEA;ncia.</p><h2 id="9fa%C3%A7a-o-que-voc%C3%AA-gosta">9 - Fa&#xE7;a o que voc&#xEA; gosta</h2><p>Parece clich&#xEA; at&#xE9; voc&#xEA; ser for&#xE7;ado a fazer algo que n&#xE3;o gosta. E isso aconteceu comigo durante um emprego que tive. Era uma empresa que eu queria muito trabalhar, mas quando entrei percebi que eu estava fazendo algo que estava cada vez mais distante do que eu gostava de fazer, da minha realidade, do que me deixava feliz. E isso impactou n&#xE3;o s&#xF3; meu rendimento, mas tamb&#xE9;m a forma como eu via meu pr&#xF3;prio trabalho.</p><p>A verdade &#xE9; que voc&#xEA; precisa direcionar sua carreira para algo que realmente gosta. N&#xE3;o adianta insistir em front-end se sua paix&#xE3;o &#xE9; back-end, ou se aventurar em infraestrutura quando o que realmente te empolga &#xE9; banco de dados. Perseguir o que voc&#xEA; gosta &#xE9; essencial, mas isso n&#xE3;o acontece do dia para a noite. Muitas vezes, ser&#xE1; necess&#xE1;rio passar por um per&#xED;odo fazendo algo que n&#xE3;o te satisfaz para dar o pr&#xF3;ximo passo. &#xC9; o famoso &quot;um passo para tr&#xE1;s para dar dois para frente&quot;.</p><p>Mas tamb&#xE9;m n&#xE3;o se acomode demais nas coisas que voc&#xEA; est&#xE1; fazendo e nem foque s&#xF3; em fazer as coisas que voc&#xEA; gosta a todo momento, at&#xE9; porque nada de bom acontece dentro da sua zona de conforto.</p><h2 id="10talk-is-cheap">10 - Talk is cheap</h2><p>Durante todos esses anos, eu acabei notando que a m&#xE1;xima &quot;Quem muito fala pouco faz&quot; foi se tornando cada vez mais verdade (inclusive temos <a href="https://blog.lsantos.dev/backlog-5-o-show-da-bolha/">uma edi&#xE7;&#xE3;o s&#xF3; falando disso</a>). No mundo atual, isso se intensifica ainda mais com a explos&#xE3;o de influenciadores e o excesso de informa&#xE7;&#xF5;es despejadas sobre n&#xF3;s. <strong>N&#xE3;o acredite em influenciadores</strong>, seja voc&#xEA; a sua pr&#xF3;pria influ&#xEA;ncia.</p><p>O ponto &#xE9; que voc&#xEA; n&#xE3;o deve acreditar somente no que as pessoas falam pra voc&#xEA;, muita gente fala demais, vende coisas demais mas nunca de fato coloca a m&#xE3;o na massa. A prova disso &#xE9; que a maioria das pessoas que criaram coisas incr&#xED;veis sequer tem rede social ou, se tem, mant&#xEA;m um perfil super discreto.</p><p>Busque suas pr&#xF3;prias conclus&#xF5;es. &#xC9; v&#xE1;lido se inspirar em outras pessoas, afinal, nada nasce do zero. Mas jamais permita que algu&#xE9;m guie todo o seu pensamento. Essa li&#xE7;&#xE3;o vale para tudo na vida, n&#xE3;o apenas para o desenvolvimento.</p><hr><p>Quero saber quais li&#xE7;&#xF5;es que voc&#xEA; aprendeu ao longo da sua carreira! Comenta l&#xE1; nas <a href="https://lsantos.dev/?ref=blog.lsantos.dev" rel="noreferrer">minhas redes</a>!</p>]]></content:encoded></item><item><title><![CDATA[Backlog #6 - Você é um bom dev?]]></title><description><![CDATA[O que faz de um bom dev um bom dev? O que é um engenheiro forte e um engenheiro fraco? Será que você é uma das pessoas boas?]]></description><link>https://blog.lsantos.dev/backlog-bom-dev/</link><guid isPermaLink="false">67916eb0ad5896c8e965b183</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[career]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Thu, 23 Jan 2025 11:00:04 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/articles-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/articles-2.png" alt="Backlog #6 - Voc&#xEA; &#xE9; um bom dev?"><p>Mais um dia e mais um backlog no ar! Hoje quero trazer algo diferente: n&#xE3;o &#xE9; sobre hist&#xF3;ria, nem diretamente sobre desenvolvimento, mas sobre devs no geral. Vamos falar sobre o <strong>ato de fazer engenharia</strong> e a <em>profiss&#xE3;o de engenheiro de software como um todo</em>.</p><p>Recentemente, recebi um <a href="https://www.seangoedecke.com/what-makes-strong-engineers-strong/?=&amp;aid=recomink1dKTOjct0&amp;ref=blog.lsantos.dev">post interessante</a> do Sean Goedecke intitulado: <em>&quot;What makes strong engineers strong&quot;</em>, ou, em portugu&#xEA;s, <em>&quot;O que torna os engenheiros fortes, de fato, fortes.&quot;</em> (a tradu&#xE7;&#xE3;o n&#xE3;o ajudou muito). Aqui, for&#xE7;a n&#xE3;o tem a ver com vigor f&#xED;sico, mas sim com execu&#xE7;&#xE3;o, responsabilidade e a habilidade de entregar qualquer tipo de trabalho.</p><p>Inicialmente, a ideia era apenas comentar sobre esse artigo, mas descobri um <a href="https://www.seangoedecke.com/weak-engineers/?ref=blog.lsantos.dev">artigo anterior</a> onde o autor tamb&#xE9;m discute o conceito de &quot;engenheiros fortes&quot; e &quot;engenheiros fracos&quot;. Isso me deixou um tanto consternado...</p><p>Ent&#xE3;o, vamos come&#xE7;ar pelo come&#xE7;o.</p><h2 id="como-chegamos-aqui">Como chegamos aqui?</h2><p>Antes de definir o que &#xE9; um engenheiro forte ou fraco, eu tenho que explicar como a gente chegou aqui.</p><p>O <a href="https://www.seangoedecke.com/weak-engineers/?__readwiseLocation=&amp;ref=blog.lsantos.dev">primeiro artigo</a> menciona um <a href="https://arxiv.org/pdf/2409.15152?ref=blog.lsantos.dev">famoso estudo da universidade de Stanford</a> que mediu a produtividade de v&#xE1;rios devs em mais de 100 empresas e descobriu que aproximadamente <a href="https://x.com/yegordb/status/1859290734257635439?ref=blog.lsantos.dev">9.5% de qualquer engenheiro de software</a> em uma empresa est&#xE1;, essencialmente, fazendo nada. O chamado <em>0.1x engineer</em>, uma alus&#xE3;o ao termo fant&#xE1;stico <em>&quot;10x engineer&quot;</em>, criado por um investidor chamado Shekhar Kirani em uma <a href="https://x.com/skirani/status/1149302828420067328?ref=blog.lsantos.dev">thread do Twitter em 2019</a>. Em teoria, os 10x engineers s&#xE3;o seres m&#xED;ticos que entregam todo o tipo de coisa, enquanto 0.1x engineers s&#xE3;o o oposto.</p><p>Eu cheguei a ler o estudo, mas achei estranho que ele n&#xE3;o menciona em nenhum momento uma divis&#xE3;o de trabalhadores remotos ou no escrit&#xF3;rio, ent&#xE3;o eu n&#xE3;o sei de onde vieram os dados relacionados &#xE0;s porcentagens de efici&#xEA;ncia. Da mesma forma, o estudo n&#xE3;o menciona nenhum tipo de resultado financeiro, ent&#xE3;o tamb&#xE9;m n&#xE3;o sei de onde vieram os dados para calcular que <em>esses engenheiros geram um preju&#xED;zo de $500B</em>:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/DraggedImage.png" class="kg-image" alt="Backlog #6 - Voc&#xEA; &#xE9; um bom dev?" loading="lazy" width="1080" height="1080"><figcaption><span style="white-space: pre-wrap;">Tabela mostrando o custo de &quot;engenheiros fantasma&quot;</span></figcaption></figure><blockquote>Pode ser que esse seja outro estudo com base na mesma fonte. Contudo, n&#xE3;o consegui confirmar de onde vieram esses n&#xFA;meros al&#xE9;m do que est&#xE1; nas imagens. Se algu&#xE9;m souber, me avise.</blockquote><p>De acordo com o estudo, 108 empresas enviaram 1,73 milh&#xE3;o de commits de 50.935 engenheiros. Esses commits foram combinados com reposit&#xF3;rios p&#xFA;blicos numa propor&#xE7;&#xE3;o de 1 commit p&#xFA;blico para cada 5 privados. Ap&#xF3;s normaliza&#xE7;&#xF5;es, 70 commits foram selecionados como amostra, e todas as alega&#xE7;&#xF5;es foram baseadas neles.</p><p>Uma das m&#xE9;tricas usadas foi a quantidade de commits em um m&#xEA;s, algo que at&#xE9; <a href="https://x.com/yegordb/status/1859291435339743361/photo/1?ref=blog.lsantos.dev">o pr&#xF3;prio autor</a> considera pouco confi&#xE1;vel. E j&#xE1; foi provado que n&#xE3;o &#xE9; uma boa m&#xE9;trica:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/DraggedImage-1.png" class="kg-image" alt="Backlog #6 - Voc&#xEA; &#xE9; um bom dev?" loading="lazy" width="1080" height="1080"><figcaption><span style="white-space: pre-wrap;">Em m&#xE9;dia, os engenheiros fracos entregam 2 a 3 commits por m&#xEA;s</span></figcaption></figure><p>Mas, ao que parece, o objetivo do estudo n&#xE3;o era medir a efici&#xEA;ncia dos participantes, mas criar um modelo para avaliar a efici&#xEA;ncia de programadores &#x2014; algo que praticamente <em>todo mundo</em> na ind&#xFA;stria tenta fazer desde sempre.</p><p>Enfim, esse foi o estudo que deu in&#xED;cio a tudo isso. Mas como, afinal, definimos o que &#xE9; um engenheiro &quot;forte&quot; ou &quot;fraco&quot;?</p><hr><h1 id="pausa-para-um-aviso">Pausa para um aviso!</h1><p>Essa newsletter s&#xF3; existe gra&#xE7;as &#xE0; comunidade e aos patrocinadores! E hoje o apoio vem da <strong>Remessa Online</strong>, que est&#xE1; ajudando demais a manter este projeto vivo &#x1F499;.  </p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/logo-2-corte.png" class="kg-image" alt="Backlog #6 - Voc&#xEA; &#xE9; um bom dev?" loading="lazy" width="300" height="114"></figure><p>Muitas pessoas me procuram para perguntar como &#xE9; trabalhar para fora do Brasil e uma das principais d&#xFA;vidas &#xE9; sobre como receber o sal&#xE1;rio vindo de outro pa&#xED;s. </p><p>Eu recomendo (inclusive j&#xE1; usava) a <strong>Remessa Online</strong>, n&#xE3;o s&#xF3; porque ela me ajudou a facilitar esse processo, mas tamb&#xE9;m porque as taxas s&#xE3;o muito mais baratas (inclusive na convers&#xE3;o) do que se eu recebesse por um banco tradicional. </p><p>E tem mais vantagens: o dinheiro entra super r&#xE1;pido na sua conta, a plataforma &#xE9; super segura, o app intuitivo e todo suporte &#xE9; em portugu&#xEA;s.</p><p>Pra economizar ainda mais, &#xE9; s&#xF3; usar o cupom&#xA0;<strong>LSANTOSDEV</strong> para ter 15% nas suas opera&#xE7;&#xF5;es.</p><p>&#x1F449; <a href="http://go2.remessaonline.com.br/aff_c?offer_id=1248&amp;aff_id=610&amp;ref=blog.lsantos.dev" rel="noreferrer">Clica aqui pra transferir com a menor taxa do mercado!</a></p><p>&#x1F97A; <strong>Quer ajudar a newsletter a crescer?</strong> Se tem uma marca ou produto que se conecta com essa comunidade, manda um e-mail para <strong>hello@lsantos.dev</strong>.&#xA0;</p><hr><h2 id="a-lenda-da-efici%C3%AAncia-em-tecnologia">A lenda da efici&#xEA;ncia em tecnologia</h2><p>O primeiro artigo define engenheiros fortes e fracos como:</p><blockquote class="kg-blockquote-alt">Engenheiros fortes conseguem fazer tarefas que engenheiros fracos simplesmente n&#xE3;o conseguem. Nem se lhes fosse dado todo o tempo do mundo.</blockquote><p>Por&#xE9;m, o que s&#xE3;o essas tarefas? Segundo o artigo:</p><ul><li>Bugs muito complicados como <em>race conditions</em>;</li><li>Entregar melhorias significativas em c&#xF3;digo legado, seja l&#xE1; o que signifique &quot;significativas&quot;;</li><li>Fazer mudan&#xE7;as que exigem uma grande refatora&#xE7;&#xE3;o arquitetural.</li></ul><p>S&#xE3;o pontos v&#xE1;lidos, mas, na minha opini&#xE3;o, insuficientes. Por exemplo, essas tarefas s&#xE3;o algo que tanto engenheiros fortes quanto fracos j&#xE1; tiveram experi&#xEA;ncia? Ou ambos est&#xE3;o lidando com elas pela primeira vez?</p><p>Se algu&#xE9;m &#xE9; considerado fraco por tentar e falhar ao resolver um problema completamente novo, isso nos tornaria p&#xE9;ssimos devs quando o assunto &#xE9; algo t&#xE3;o complexo quanto encher de combust&#xED;vel um foguete espacial.</p><p>O ponto &#xE9; que isso n&#xE3;o &#xE9; algo preto no branco, e o pr&#xF3;prio autor reconhece isso. No entanto, discordo da categoriza&#xE7;&#xE3;o que ele faz das pessoas. Ele classifica engenheiros como fortes, regulares e fracos. Segundo ele, voc&#xEA; pode ser um &quot;engenheiro regular&quot; excelente em resolver bugs complexos ou um &quot;engenheiro fraco&quot; muito bom em manter as coisas funcionando.</p><p>Na minha vis&#xE3;o, as coisas n&#xE3;o s&#xE3;o t&#xE3;o simples assim.</p><p>As coisas s&#xE3;o em tons de cinza (muito mais de 50). Eu j&#xE1; n&#xE3;o sou um grande f&#xE3; da separa&#xE7;&#xE3;o entre junior, pleno e s&#xEA;nior, mas entendo o prop&#xF3;sito quando temos que contratar. Mas n&#xE3;o concordo de forma alguma em dividir ainda mais atrav&#xE9;s de quem &quot;consegue resolver problemas complicados&quot;. Todos n&#xF3;s somos &#xF3;timos em algo, p&#xE9;ssimos em outro algo.</p><p>Eu quero acreditar que sou um excelente programador, provavelmente &#xE9; a melhor coisa que eu fa&#xE7;o, mas eu sou um p&#xE9;ssimo jogador de futebol.</p><p>Voc&#xEA; n&#xE3;o pode &#x2013; e nem vai &#x2013; ser bom em tudo, isso se chama: <em>ser uma pessoa normal</em>.</p><h2 id="o-que-faz-um-bom-dev">O que faz um bom dev</h2><p>No primeiro artigo ele diz enfaticamente:</p><blockquote class="kg-blockquote-alt">... A real medida do talento n&#xE3;o &#xE9; a velocidade ou o volume de entrega, mas a habilidade de fazer tarefas que outros n&#xE3;o conseguem.</blockquote><p>Por&#xE9;m, no segundo artigo, o autor apresenta os 4 pilares dos engenheiros fortes:</p><ul><li><em>Velocidade</em>;</li><li><em>Pragmatismo</em>;</li><li><em>Confian&#xE7;a em si mesmo</em>;</li><li><em>Habilidade t&#xE9;cnica</em>.</li></ul><p>Isso me parece um pouco contradit&#xF3;rio. Logo de cara, a <em>velocidade</em> aparece como um dos elementos, e, embora o volume de entrega n&#xE3;o seja listado diretamente, &#xE9; uma m&#xE9;trica que est&#xE1; claramente associada &#xE0; velocidade. Afinal, quanto mais r&#xE1;pido voc&#xEA; trabalha, mais coisas s&#xE3;o entregues.</p><p>Concordo com tr&#xEA;s dos pilares, mas a <em>velocidade</em> merece uma discuss&#xE3;o &#xE0; parte. J&#xE1; a <em>habilidade t&#xE9;cnica</em>, acho que &#xE9; algo impl&#xED;cito &#x2014; voc&#xEA; precisa de um certo n&#xED;vel de habilidade para ser um bom dev, ent&#xE3;o n&#xE3;o vou focar nisso agora.</p><h3 id="velocidade">Velocidade</h3><p>A velocidade jamais deve ser considerada a principal m&#xE9;trica para avaliar bons ou maus engenheiros. Embora seja importante cumprir prazos, entregar algo r&#xE1;pido e sem qualidade &#xE9; praticamente o mesmo que n&#xE3;o entregar nada.</p><p>Recentemente, comentei sobre isso nesta thread:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://bsky.app/profile/lsantos.dev/post/3lfpr5zw6cc2h?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Lucas Santos (@lsantos.dev)</div><div class="kg-bookmark-description">Muita gente acredita que ser #dev &#xE9; construir software r&#xE1;pido, produtividade, entrega. Construir software AGORA n&#xE3;o &#xE9; dif&#xED;cil, o dif&#xED;cil &#xE9; manter o software por anos. Se voc&#xEA; consegue construir sistemas que duram ANOS com f&#xE1;cil manuten&#xE7;&#xE3;o, isso &#xE9; engenharia de software.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://web-cdn.bsky.app/static/apple-touch-icon.png" alt="Backlog #6 - Voc&#xEA; &#xE9; um bom dev?"><span class="kg-bookmark-author">Bluesky Social</span></div></div></a></figure><p>Entregar c&#xF3;digo r&#xE1;pido e &quot;pra agora&quot; &#xE9; uma das coisas mais f&#xE1;ceis da engenharia de software. Se voc&#xEA; acredita que criar um template no Bolt usando prompts do ChatGPT para automatizar tudo e entregar &quot;valor r&#xE1;pido&quot; &#xE9; uma pr&#xE1;tica ideal, ent&#xE3;o temos opini&#xF5;es muito diferentes.</p><p>O problema &#xE9; que, nesse cen&#xE1;rio, voc&#xEA; provavelmente n&#xE3;o viu nada do c&#xF3;digo produzido. Isso significa que, na maioria das vezes, ser&#xE1; extremamente dif&#xED;cil mant&#xEA;-lo a longo prazo &#x2014; se &#xE9; que ser&#xE1; poss&#xED;vel. E essa &#xE9; a parte mais desafiadora do desenvolvimento de software: entregar algo agora que ainda seja funcional e sustent&#xE1;vel daqui a 10 anos.</p><p>Uma hist&#xF3;ria engra&#xE7;ada foi meu primeiro projeto grande como freelancer, uns 8 ou 9 anos atr&#xE1;s. Era um sistema bem simples, e eu fiz o c&#xF3;digo o mais r&#xE1;pido que consegui pra entregar o MVP. O cliente adorou, o produto funcionou por 2 anos e ningu&#xE9;m nunca precisou mexer. Arrasei, n&#xE9;? N&#xE3;o.</p><p>Dois anos depois, eles precisaram fazer uma coisa super simples: adicionar mais op&#xE7;&#xF5;es na p&#xE1;gina. E a&#xED; veio o problema... Eu n&#xE3;o conseguia dar manuten&#xE7;&#xE3;o no c&#xF3;digo. Tava tudo t&#xE3;o acoplado que era mais f&#xE1;cil refazer do zero do que tentar mudar o que j&#xE1; estava feito.</p><p>Tudo isso porque eu pensei no agora e nem sequer dei valor para o que eu precisaria fazer para manter isso no futuro, eu fui muito r&#xE1;pido, mas a que custo?</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/DraggedImage-2.png" class="kg-image" alt="Backlog #6 - Voc&#xEA; &#xE9; um bom dev?" loading="lazy" width="247" height="204"></figure><p>Claro que temos que pesar o que precisamos no momento, n&#xE3;o podemos ser sempre perfeitos e entregar o melhor poss&#xED;vel, muitas vezes o <em>feito &#xE9; melhor do que perfeito</em>, e est&#xE1; tudo bem.</p><h3 id="qualidade-vs-efici%C3%AAncia">Qualidade vs Efici&#xEA;ncia</h3><p>Eu sempre gosto de lembrar que ser um <em>&quot;bom engenheiro&quot;</em> &#xE9; bem diferente de ser um <em>&quot;engenheiro eficiente&quot;</em>. Geralmente, bons engenheiros acabam sendo eficientes, mas nem todo engenheiro eficiente &#xE9; necessariamente bom.</p><p>A linha entre efici&#xEA;ncia e pura tentativa e erro &#xE9; bem fina. Engenheiros puramente eficientes tendem a errar muito e r&#xE1;pido, iterando sobre cada falha at&#xE9; chegar a algo mais s&#xF3;lido e confi&#xE1;vel. Sabe quem tamb&#xE9;m faz isso? Machine learning.</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/DraggedImage-3.png" class="kg-image" alt="Backlog #6 - Voc&#xEA; &#xE9; um bom dev?" loading="lazy" width="1056" height="1052"></figure><p>Isso n&#xE3;o quer dizer que bons devs n&#xE3;o iterem, muito pelo contr&#xE1;rio. Bons devs iteram sim para melhorar as solu&#xE7;&#xF5;es, mas a diferen&#xE7;a est&#xE1; no como. A itera&#xE7;&#xE3;o n&#xE3;o &#xE9; feita em cima de um monte de &quot;meias aplica&#xE7;&#xF5;es&quot;, mas em uma ideia implementada da melhor forma poss&#xED;vel para aquele momento. Cada nova itera&#xE7;&#xE3;o &#xE9; uma melhoria da anterior, n&#xE3;o uma mudan&#xE7;a completa.</p><p>E o pr&#xF3;prio autor manda uma frase bem interessante:</p><blockquote class="kg-blockquote-alt">Genialidade, geralmente, vai ao oposto &#xE0; efici&#xEA;ncia</blockquote><p>Isso vai exatamente de encontro com o que acabei de falar. Errar r&#xE1;pido e consertar ainda mais r&#xE1;pido, pra mim, n&#xE3;o &#xE9; sin&#xF4;nimo de qualidade. &#xC9; s&#xF3; um sinal de que voc&#xEA; esgotou todas as op&#xE7;&#xF5;es que n&#xE3;o funcionam e ficou com a primeira que d&#xE1; certo, sem se preocupar se &#xE9; a melhor solu&#xE7;&#xE3;o ou n&#xE3;o.</p><h3 id="pragmatismo-e-confian%C3%A7a">Pragmatismo e Confian&#xE7;a</h3><p>Essas duas qualidades merecem destaque juntas, porque, na minha opini&#xE3;o, s&#xE3;o as mais importantes para qualquer dev (ou pessoa t&#xE9;cnica, no geral).</p><p>Ser pragm&#xE1;tico &#xE9; essencial, principalmente quando voc&#xEA; precisa entregar algo. &#xC9; aquela habilidade de avaliar o momento e focar no que realmente importa. Inclusive, j&#xE1; falei sobre isso em um v&#xED;deo:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/eppWQKUixmI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="O livro que resume todos os livros - as regras n&#xE3;o escritas da engenharia"></iframe></figure><p>Pensar de forma pragm&#xE1;tica &#xE9; saber a hora de largar o osso. &#xC9; reconhecer quando sua solu&#xE7;&#xE3;o n&#xE3;o &#xE9; a melhor, quando o que voc&#xEA; fez precisa ser refeito ou quando ceder &#xE9; a melhor escolha.</p><p>Eu costumava ficar <strong>muito</strong> bravo quando algu&#xE9;m dizia que eu estava errado e precisava mudar minha implementa&#xE7;&#xE3;o. Mas, depois de muito bater cabe&#xE7;a, percebi que o c&#xF3;digo que estou escrevendo n&#xE3;o &#xE9; &quot;meu&quot;. Eu n&#xE3;o fa&#xE7;o ele pra mim, fa&#xE7;o pra quem vai chegar depois e ter que dar manuten&#xE7;&#xE3;o nisso tudo.</p><blockquote>Codar &#xE9; um trabalho de equipe, voc&#xEA; raramente vai conseguir fazer algo sozinho para sempre.</blockquote><p>Por outro lado, &#xE9; importante saber bater o p&#xE9; e confiar nas suas habilidades quando precisa defender um ponto de vista. Ser pragm&#xE1;tico(a) e confiar no que voc&#xEA; sabe s&#xE3;o, pra mim, duas das principais qualidades de um bom dev.</p><p>Claro, tudo em excesso &#xE9; ruim. Ser pragm&#xE1;tico demais e abandonar tudo em favor de dados pode ser t&#xE3;o prejudicial quanto ser confiante demais e achar que sempre est&#xE1; certo.</p><h2 id="o-paradoxo-do-aprendizado">O paradoxo do aprendizado</h2><p>Existe um paradoxo interessante que explica muito sobre a din&#xE2;mica do mercado &#xE0; medida que voc&#xEA; ganha mais experi&#xEA;ncia. Sean fala algo nesse ponto com o qual concordo totalmente: por que &#xE9; mais f&#xE1;cil encontrar &quot;engenheiros fracos&quot; em posi&#xE7;&#xF5;es s&#xEA;niores do que juniores?</p><p>A resposta &#xE9; simples. Ao contratar um s&#xEA;nior, avaliamos mais do que apenas a capacidade t&#xE9;cnica. Consideramos tamb&#xE9;m:</p><ul><li>Capacidade t&#xE9;cnica;</li><li>Capacidade de lideran&#xE7;a;</li><li>Capacidade de comunica&#xE7;&#xE3;o;</li><li>Capacidade de resolver problemas.</li></ul><p>J&#xE1; para juniores, a m&#xE9;trica principal &#xE9;, quase sempre, a habilidade t&#xE9;cnica. Isso facilita para que pessoas n&#xE3;o t&#xE3;o boas tecnicamente consigam passar com base na l&#xE1;bia. J&#xE1; vi isso acontecer v&#xE1;rias vezes nos lugares onde trabalhei, e, se voc&#xEA; ainda n&#xE3;o viu, cedo ou tarde vai presenciar, especialmente em grandes empresas.</p><p>Outro motivo &#xE9; que est&#xE1; tudo bem para um j&#xFA;nior errar &#x2014; isso &#xE9; esperado. Mas, socialmente, um erro vindo de um s&#xEA;nior n&#xE3;o &#xE9; t&#xE3;o bem aceito. Espera-se que algu&#xE9;m com 30 anos de carreira e um curr&#xED;culo invej&#xE1;vel seja uma esp&#xE9;cie de figura mitol&#xF3;gica que nunca falha. Isso faz com que muitos s&#xEA;niores precisem aprender discretamente e sozinhos, o que &#xE9; bem mais complicado.</p><p>Eu, pessoalmente, n&#xE3;o tenho nenhum medo ou receio de falar que n&#xE3;o sei algo. Inclusive &#xE9; algo que prego muito para todas as pessoas que conhe&#xE7;o e/ou mentoro:</p><blockquote class="kg-blockquote-alt">N&#xE3;o saber n&#xE3;o &#xE9; um problema. N&#xE3;o querer aprender &#xE9;.</blockquote><p>Ent&#xE3;o enquanto uma pessoa errar e quiser aprender, se mostrando aberta, para mim est&#xE1; tudo bem. O problema acontece quando uma pessoa erra e se recusa a continuar aprendendo, talvez como uma forma de esconder uma poss&#xED;vel vergonha.</p><p>Jamais tenha medo de errar, todo mundo est&#xE1; aqui aprendendo.</p><h2 id="o-que-eu-penso-disso-tudo">O que eu penso disso tudo</h2><p>No geral, ambos os artigos s&#xE3;o bem interessantes e muito bem escritos. S&#xE3;o pontos bastante interessantes para se manter na cabe&#xE7;a e discutir.</p><p>Pra voc&#xEA;, o que &#xE9; ser um dev bom/forte ou um dev ruim/fraco? Manda pra mim l&#xE1; nas minhas redes:</p><ul><li><a href="https://twitter.lsantos.dev/?ref=blog.lsantos.dev">Twitter</a></li><li><a href="https://bsky.lsantos.dev/?ref=blog.lsantos.dev">Bluesky</a></li><li><a href="https://linkedin.lsantos.dev/?ref=blog.lsantos.dev">Linkedin</a></li></ul><p>Ou me manda <a href="mailto:hello@lsantos.dev">um email</a> se voc&#xEA; quiser que eu comente sobre ele na pr&#xF3;xima edi&#xE7;&#xE3;o do backlog!</p><p>At&#xE9; mais! E n&#xE3;o esquece de <a href="https://forms.gle/2kVANfh5SJUnBerg8?ref=blog.lsantos.dev">me dar seu feedback</a>!</p>]]></content:encoded></item><item><title><![CDATA[Tudo sobre o Node rodar TypeScript nativamente!]]></title><description><![CDATA[O Node 22 suporta nativamente TypeScript! Mas e agora? Será que é só isso? Bora aprender como você pode rodar TS muito mais fácil e quais são as principais configurações!]]></description><link>https://blog.lsantos.dev/o-nodejs-agora-roda-typescript-nativamente/</link><guid isPermaLink="false">678e7ec4084daaa98a1e464d</guid><category><![CDATA[typescript]]></category><category><![CDATA[nodejs]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Wed, 22 Jan 2025 11:01:10 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/articles-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/articles-1.png" alt="Tudo sobre o Node rodar TypeScript nativamente!"><p>Finalmente, o artigo que estou prometendo h&#xE1; um tempo saiu! E eu tenho muito orgulho de ser parte do time que ajudou a implementar essa funcionalidade! (mesmo apesar de n&#xE3;o ter contribu&#xED;do tanto quanto eu gostaria).</p><p>Mas o que &#xE9; essa coisa toda de Node.js rodando TypeScript?</p><h2 id="o-node-roda-ts">O Node roda TS?</h2><p>Em algumas edi&#xE7;&#xF5;es <a href="https://blog.lsantos.dev/tsx-loader/">anteriores</a>, eu falei que era poss&#xED;vel rodar TypeScript nativamente no Node usando o TSX. Historicamente, esse sempre foi o caso, porque n&#xE3;o t&#xED;nhamos como rodar nenhum tipo de arquivo al&#xE9;m de JavaScript com o Node. E ainda n&#xE3;o temos.</p><p>O que acontece &#xE9; que podemos utilizar <em>loaders</em>. Loaders s&#xE3;o hooks especiais que permitem que a gente modifique o comportamento do <em>module loader</em> nativo, utilizado quando carregamos qualquer m&#xF3;dulo <a href="https://blog.lsantos.dev/os-ecmascript-modules-estao-aqui/">ESM</a>. Esses loaders s&#xE3;o bastante poderosos porque eles permitem, entre outras coisas, que a gente fa&#xE7;a a&#xE7;&#xF5;es diretamente com o c&#xF3;digo que ser&#xE1; carregado em mem&#xF3;ria. Que &#xE9; exatamente como o <strong>TSX</strong> se comporta.</p><p>Mas agora isso n&#xE3;o &#xE9; mais necess&#xE1;rio! A partir da vers&#xE3;o <a href="https://nodejs.org/en/blog/release/v22.6.0?ref=blog.lsantos.dev">22.6 do Node</a> duas novas flags experimentais foram adicionadas:</p><ul><li><code>--experimental-strip-types</code>: Que vai receber um arquivo TS e remover completamente qualquer anota&#xE7;&#xE3;o de tipo que exista nele. &#xC9; a forma mais simples de transpila&#xE7;&#xE3;o, apenas removendo o que n&#xE3;o &#xE9; JavaScript nativo. &#xC9; importante dizer que funcionalidades que requerem transforma&#xE7;&#xE3;o de c&#xF3;digo como <code>enum</code> e <code>namespace</code> <strong>n&#xE3;o</strong> v&#xE3;o funcionar.</li><li><code>--experimental-transform-types</code>: implica que a flag anterior vai estar ativa, ou seja, se voc&#xEA; passar essa flag, a anterior vai ser automaticamente passada. E permite transforma&#xE7;&#xE3;o de tipos, dessa forma podemos utilizar as funcionalidades que antes n&#xE3;o seriam habilitadas, fazendo essencialmente o suporte quase completo a TypeScript.</li></ul><blockquote>O fato curioso aqui &#xE9; que o nome dessa flag era para ser <code>enable-transformation</code> e eu <a href="https://github.com/nodejs/node/pull/54283?ref=blog.lsantos.dev#discussion_r1711462259">sugeri</a> que mud&#xE1;ssemos para algo como <code>enable-type-transformation</code> para manter a sem&#xE2;ntica.</blockquote><p>Essencialmente, agora voc&#xEA; pode fazer algo assim:</p><pre><code class="language-bash">$ node --experimental-transform-types index.ts
</code></pre><p>E seu arquivo vai rodar como se voc&#xEA; estivesse rodando com TSX usando:</p><pre><code class="language-bash">$ node --loader=tsx index.ts
</code></pre><h3 id="node-v23">Node v23</h3><p>A vers&#xE3;o 23 do Node mandou essa funcionalidade mais adiante ainda e fez com que a flag <code>--experimental-strip-types</code> ficasse ativa a todo o momento, ou seja, o loader nativo do TypeScript (que vamos ver mais embaixo aqui) verifica todos os arquivos, se eles forem um arquivo <code>.ts</code> ent&#xE3;o ele &#xE9; transpilado com a remo&#xE7;&#xE3;o de tipos, o processo mais r&#xE1;pido.</p><p>Isso significa que, por padr&#xE3;o, voc&#xEA; pode rodar arquivos TypeScript <strong>simples</strong> usando:</p><pre><code class="language-bash">node index.ts
</code></pre><p>Mas, se o arquivo tiver transforma&#xE7;&#xF5;es, como <code>enums</code>, ele continua n&#xE3;o funcionando e voc&#xEA; <strong>precisa</strong> passar a flag <code>--experimental-transform-types</code> para o comando.</p><blockquote>Logo mais, provavelmente na pr&#xF3;xima vers&#xE3;o LTS (que deve ser a 24) essa flag deixar&#xE1; de ser experimental e se transformar&#xE1; s&#xF3; em <code>--transform-types</code></blockquote><p>Mas como tudo isso funciona?</p><h3 id="conhe%C3%A7a-o-amaro">Conhe&#xE7;a o Amaro</h3><p><a href="https://github.com/nodejs/amaro?ref=blog.lsantos.dev">Amaro</a> &#xE9; o nome dado a um dos m&#xF3;dulos nativos carregados pelo Node.js, ele tamb&#xE9;m vem em forma de <a href="https://www.npmjs.com/package/amaro?ref=blog.lsantos.dev">pacote</a> do NPM, ent&#xE3;o voc&#xEA; pode utiliz&#xE1;-lo separadamente do Node tamb&#xE9;m. Mas esse &#xE9; o cora&#xE7;&#xE3;o de tudo que est&#xE1; acontecendo por baixo dos panos.</p><p>O Amaro nada mais &#xE9; do que um wrapper em volta do parser SWC para TypeScript em WASM, o m&#xF3;dulo &#xE9; chamado <code>@swc/wasm-typescript</code> e ele faz uma coisa: transpila TypeScript para JavaScript.</p><p>Desde a vers&#xE3;o 23, quando qualquer c&#xF3;digo &#xE9; importado, basicamente existe uma <a href="https://github.com/nodejs/node/commit/35f92d953c24d4f02f82ab397a61383103f9b796?ref=blog.lsantos.dev#diff-8f3520898daae8b61a84b558a2d31241031419b6dc2d25685d9f2c70b6ba2a45R26">checagem</a> para garantir que a op&#xE7;&#xE3;o <code>--experimental-strip-types</code> est&#xE1; ativa, se sim, importamos o <a href="https://github.com/nodejs/node/commit/35f92d953c24d4f02f82ab397a61383103f9b796?ref=blog.lsantos.dev#diff-fddf8a06747f8c9e83cd2a3ebee0f53dbd790567ce018044e70bd0ffbbcc815eR310">parser</a> do amaro na mem&#xF3;ria global. Se n&#xE3;o, retornamos apenas o c&#xF3;digo.</p><blockquote>&#xC9; importante dizer que a transforma&#xE7;&#xE3;o do c&#xF3;digo &#xE9; feita de forma <a href="https://github.com/nodejs/node/commit/35f92d953c24d4f02f82ab397a61383103f9b796?ref=blog.lsantos.dev#diff-fddf8a06747f8c9e83cd2a3ebee0f53dbd790567ce018044e70bd0ffbbcc815eR313">s&#xED;ncrona</a>, ent&#xE3;o existe sim um pequeno overhead quando temos que carregar muitos arquivos.</blockquote><h2 id="tendo-a-melhor-experi%C3%AAncia-com-ts-no-node">Tendo a melhor experi&#xEA;ncia com TS no Node</h2><p>Por mais que o Node tentasse suportar todas as configura&#xE7;&#xF5;es nativas do TypeScript, ele nunca iria suportar o <code>tsconfig</code> nativamente (como foi dito <a href="https://satanacchio.hashnode.dev/everything-you-need-to-know-about-nodejs-type-stripping?ref=blog.lsantos.dev#heading-why-typescript">no artigo do Marco Ippolito</a>), e nem faria sentido isso acontecer. Por isso, algumas configura&#xE7;&#xF5;es s&#xE3;o necess&#xE1;rias para alinhar o funcionamento do TypeScript com o do Node.js.</p><blockquote>Voc&#xEA; tamb&#xE9;m pode ver o <a href="https://nodejs.org/api/typescript.html?ref=blog.lsantos.dev">artigo da documenta&#xE7;&#xE3;o do Node</a> sobre essa mudan&#xE7;a.</blockquote><p>Primeiro de tudo, voc&#xEA; precisa setar o seu <code>tsconfig</code> para usar <code>esnext</code> como <code>target</code> e <code>nodenext</code> como <code>module</code>:</p><pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;esnext&quot;,
	&quot;module&quot;: &quot;nodenext&quot;
  }
}
</code></pre><p>Agora vamos ver algumas outras op&#xE7;&#xF5;es que voc&#xEA; precisa setar para ter a melhor experi&#xEA;ncia.</p><h3 id="imports-de-tipos-precisam-ser-expl%C3%ADcitos">Imports de tipos precisam ser expl&#xED;citos</h3><p>Quando importamos m&#xF3;dulos que s&#xE3;o apenas tipos, ou seja, n&#xE3;o existe um c&#xF3;digo para ser executado ali, podemos dizer para o TypeScript n&#xE3;o tentar resolver nenhum deles usando a keyword <code>type</code>:</p><pre><code class="language-ts">import type { MeuTipo, MeuOutroTipo } from &apos;meu-modulo&apos;
</code></pre><p>Isso far&#xE1; com que tudo que esteja sendo importado dentro dos <code>{}</code> seja removido na transpila&#xE7;&#xE3;o, evitando processamento desnecess&#xE1;rio. Podemos fazer isso com tipos espec&#xED;ficos tamb&#xE9;m:</p><pre><code class="language-ts">import { MinhaClasse, type MeuTipo } from &apos;meu-modulo&apos;
</code></pre><p>Agora s&#xF3; estamos importando <code>MeuTipo</code> como um tipo e n&#xE3;o a classe.</p><p>Isso parece trivial &#x2014; at&#xE9; porque o TS vai conseguir resolver isso naturalmente quando voc&#xEA; executar o compilador &#x2014; mas para o Node, n&#xE3;o &#xE9;.</p><p>Como o Node n&#xE3;o tem como saber quais s&#xE3;o os m&#xF3;dulos que s&#xE3;o ou n&#xE3;o tipos, j&#xE1; que ele n&#xE3;o tem type checking, voc&#xEA; precisa <strong>colocar obrigatoriamente a</strong> anota&#xE7;&#xE3;o <code>type</code>. Isso pode ser configurado no seu <code>tsconfig.json</code> usando a op&#xE7;&#xE3;o <code>verbatimModuleSyntax</code> e setando para <code>true</code>. Ent&#xE3;o o compilador vai te avisar quando voc&#xEA; precisar de um <code>type</code>.</p><p>Seu arquivo <code>tsconfig</code> agora fica assim:</p><pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;esnext&quot;,
	&quot;module&quot;: &quot;nodenext&quot;,
	&quot;verbatimModuleSyntax&quot;: true
  }
}
</code></pre><h3 id="imports-de-arquivos-precisam-ser-expl%C3%ADcitos">Imports de arquivos precisam ser expl&#xED;citos</h3><p>Al&#xE9;m de importar tipos, voc&#xEA; tamb&#xE9;m pode importar outros arquivos <code>.ts</code> no seu c&#xF3;digo. O Node n&#xE3;o s&#xF3; suporta isso como deixa muito mais simples e, pelo menos na minha opini&#xE3;o, muito mais f&#xE1;cil de ler.</p><p>Quando importando um arquivo local em TS, voc&#xEA; <strong>obrigatoriamente</strong> precisa colocar a extens&#xE3;o <code>.ts</code>:</p><pre><code class="language-ts">import { MyClass } from &apos;./meu-arquivo.ts&apos;
</code></pre><p>Se voc&#xEA; estiver usando a configura&#xE7;&#xE3;o padr&#xE3;o do Node para ESM, ent&#xE3;o voc&#xEA; vai ter um erro no TypeScript dizendo que voc&#xEA; n&#xE3;o pode importar um m&#xF3;dulo <code>.ts</code> exceto se <code>allowImportingTsExtensions</code> esteja setada como <code>true</code> no seu <code>tsconfig.json</code>. Ent&#xE3;o &#xE9; isso que voc&#xEA; precisa fazer:</p><pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;esnext&quot;,
	&quot;module&quot;: &quot;nodenext&quot;,
	&quot;verbatimModuleSyntax&quot;: true,
	&quot;allowImportingTsExtensions&quot;: true
  }
}
</code></pre><p>Isso acontece porque, no ESM normal, voc&#xEA; precisa explicitamente dizer qual &#xE9; a extens&#xE3;o do arquivo para reduzir a quantidade de overhead no sistema de resolu&#xE7;&#xE3;o de m&#xF3;dulos em tentar descobrir que tipo de arquivo voc&#xEA; est&#xE1; abrindo. E, se voc&#xEA; tenta abrir um arquivo <code>.ts</code>, esse arquivo n&#xE3;o existe, ent&#xE3;o voc&#xEA; tem um erro de &quot;Arquivo n&#xE3;o existente&quot;.</p><h3 id="reescrevendo-extens%C3%B5es">Reescrevendo extens&#xF5;es</h3><p>Outra op&#xE7;&#xE3;o importante lan&#xE7;ada com o <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-7/?ref=blog.lsantos.dev#path-rewriting-for-relative-paths">TypeScript 5.7</a> e implementada pelo time do TypeScript diretamente para poder suportar o Node.js &#xE9; a <code>rewriteRelativeImportExtensions</code>, que vai automaticamente substituir <code>.ts</code> por <code>.js</code> nos seus arquivos, permitindo que voc&#xEA; publique o c&#xF3;digo compilado para o NPM sem precisar de nenhuma outra etapa de transpila&#xE7;&#xE3;o.</p><p>Ent&#xE3;o, o adicionamos aqui tamb&#xE9;m:</p><pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;esnext&quot;,
	&quot;module&quot;: &quot;nodenext&quot;,
	&quot;verbatimModuleSyntax&quot;: true,
	&quot;allowImportingTsExtensions&quot;: true,
	&quot;reqriteRelativeImportExtensions&quot;: true
  }
}
</code></pre><h3 id="no-futuro">No futuro</h3><p>Provavelmente, na vers&#xE3;o 5.8, o time do TS vai incluir uma <a href="https://github.com/microsoft/TypeScript/issues/59601?ref=blog.lsantos.dev">flag</a> chamada <code>--erasableSyntaxOnly</code> que vai te avisar se voc&#xEA; estiver usando tipos que n&#xE3;o podem ser apagados (se voc&#xEA; tamb&#xE9;m estiver usando o Node sem o <code>transform-types</code>).</p><h2 id="o-que-isso-significa-para-o-typescript">O que isso significa para o TypeScript?</h2><p>Muita gente acha que esse &#xE9; o fim do TypeScript, mas &#xE9; justamente o contr&#xE1;rio, agora o TypeScript estar&#xE1; mais presente do que nunca! Com todos os runtimes suportando TS nativamente, ele est&#xE1; gradualmente caminhando para ser, provavelmente, a linguagem padr&#xE3;o da web.</p><blockquote>O que &#xE9; uma &#xF3;tima oportunidade para voc&#xEA; garantir o <a href="https://pay.hotmart.com/L84853211Y?checkoutMode=10&amp;utm_source=personal-blog&amp;utm_medium=post&amp;utm_campaign=node-ts&amp;utm_id=fixed&amp;utm_term=nodejs%2Ctypescript%2Camaro">meu curso completo de TypeScript, a Forma&#xE7;&#xE3;o TS</a> e j&#xE1; se preparar para esse momento!</blockquote><p>Claro, ainda existem algumas mudan&#xE7;as que precisam ser feitas, principalmente para a configura&#xE7;&#xE3;o ser mais amig&#xE1;vel e menos dolorosa, mas essa mudan&#xE7;a &#xE9; o in&#xED;cio de uma pequena revolu&#xE7;&#xE3;o que, talvez, substitua o JavaScript como a linguagem mais usada da Web.</p>]]></content:encoded></item><item><title><![CDATA[Backlog #5 - O grande show da bolha dev]]></title><description><![CDATA[Esse é o backlog mais sincero que eu já postei. Aqui você vai ter respostas sinceras para coisas que me perguntam e uma visão autêntica minha sobre a bolha dev.]]></description><link>https://blog.lsantos.dev/backlog-5-o-show-da-bolha/</link><guid isPermaLink="false">677d6812947b6cbc456b8eee</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[opinion]]></category><category><![CDATA[career]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Thu, 09 Jan 2025 11:00:27 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/articles.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2025/01/articles.png" alt="Backlog #5 - O grande show da bolha dev"><p>Hoje come&#xE7;a o primeiro Backlog de 2025, e vamos come&#xE7;ar bem. Esse vai ser o mais sincero que eu j&#xE1; escrevi. Vou falar sobre v&#xE1;rios t&#xF3;picos que sempre me perguntam e, aviso: <strong>n&#xE3;o vai ter filtro</strong>, tudo aqui vai ser aut&#xEA;ntico.</p><p>A motiva&#xE7;&#xE3;o veio ontem &#xE0; noite. Esse Backlog seria sobre outra coisa (relacionada a hist&#xF3;ria, que fica pra pr&#xF3;xima), mas antes de dormir, cometi o maior erro: <em>abri o LinkedIn</em>. O que vi l&#xE1; me deixou com um misto de sentimentos que preciso expor aqui, j&#xE1; que muita gente me pergunta sobre isso.</p><p>Pra n&#xE3;o cortar o assunto no meio, vamos pro aviso dos nossos amigos da Remessa &#x2764;&#xFE0F;. E lembrem-se: Tudo aqui &#xE9; <strong>minha opini&#xE3;o</strong>.</p><hr><h1 id="pausa-para-um-aviso">Pausa para um aviso!</h1><p>Essa newsletter s&#xF3; existe gra&#xE7;as &#xE0; comunidade e aos patrocinadores! E hoje o apoio vem da <strong>Remessa Online</strong>, que est&#xE1; ajudando demais a manter este projeto vivo &#x1F499;.  </p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/logo-2-corte.png" class="kg-image" alt="Backlog #5 - O grande show da bolha dev" loading="lazy" width="300" height="114"></figure><p>Muitas pessoas me procuram para perguntar como &#xE9; trabalhar para fora do Brasil e uma das principais d&#xFA;vidas &#xE9; sobre como receber o sal&#xE1;rio vindo de outro pa&#xED;s. </p><p>Eu recomendo (inclusive j&#xE1; usava) a <strong>Remessa Online</strong>, n&#xE3;o s&#xF3; porque ela me ajudou a facilitar esse processo, mas tamb&#xE9;m porque as taxas s&#xE3;o muito mais baratas (inclusive na convers&#xE3;o) do que se eu recebesse por um banco tradicional. </p><p>E tem mais vantagens: o dinheiro entra super r&#xE1;pido na sua conta, a plataforma &#xE9; super segura, o app intuitivo e todo suporte &#xE9; em portugu&#xEA;s.</p><p>Pra economizar ainda mais, &#xE9; s&#xF3; usar o cupom&#xA0;<strong>LSANTOSDEV</strong> para ter 15% nas suas opera&#xE7;&#xF5;es.</p><p>&#x1F449; <a href="http://go2.remessaonline.com.br/aff_c?offer_id=1248&amp;aff_id=610&amp;ref=blog.lsantos.dev" rel="noreferrer">Clica aqui pra transferir com a menor taxa do mercado!</a></p><p>&#x1F97A; <strong>Quer ajudar a newsletter a crescer?</strong> Se tem uma marca ou produto que se conecta com essa comunidade, manda um e-mail para <strong>hello@lsantos.dev</strong>.&#xA0;</p><hr><h2 id="um-pouco-de-contexto">Um pouco de contexto</h2><p>Quem me acompanha sabe que uma das coisas que mais odeio &#xE9; ver posts de gente se passando por coach, vendendo o que n&#xE3;o pratica e criando conte&#xFA;do raso s&#xF3; por likes e engajamento (esse principalmente). De 2015 a 2020, o cen&#xE1;rio era mais calmo, mas essas figuras sempre existiram. Eu divido essa galera em tr&#xEA;s categorias:</p><ul><li><strong>O Guru Empreendedor:</strong> Acha que tem todas as respostas e promete &#x201C;revolucionar a humanidade&#x201D;, mas nunca entrega nada al&#xE9;m de varia&#xE7;&#xF5;es coloridas de produtos que j&#xE1; existem.</li><li><strong>O Dev de Palco:</strong> Fala como criar a aplica&#xE7;&#xE3;o perfeita baseado na sua experi&#xEA;ncia de dois anos de carreira numa startup de garagem com 10 clientes.</li><li><strong>O Influencer Papagaio:</strong> Ensina entre uma dancinha e outra que <code>parseInt</code> &#xE9; a &#x201C;melhor solu&#xE7;&#xE3;o do JavaScript&#x201D; (<a href="https://x.com/_StaticVoid/status/1510709606569414663?ref=blog.lsantos.dev">n&#xE3;o</a> <a href="https://x.com/_StaticVoid/status/1488589887146274819?ref=blog.lsantos.dev">&#xE9;</a>) sem checar fontes, provando que o b&#xE1;sico mal-feito viraliza mais que conte&#xFA;do &#xFA;til.</li></ul><p>Todos fazem a mesma coisa, mas de formas diferentes. O coach te vende que &#x201C;foguete n&#xE3;o tem r&#xE9;&#x201D;, criando &#x201C;seu produto&#x201D; a qualquer custo. O dev de palco exagera conquistas para se mostrar.</p><blockquote>Muito desse &quot;glamour&quot; do mundo dev vem da galera do &quot;minha rotina trabalhando na &lt;FAANG aqui&gt;&quot;, vendendo um sonho que n&#xE3;o &#xE9; real.</blockquote><p>O ciclo &#xE9; simples: cria-se um &#x201C;hype&#x201D; em torno de uma solu&#xE7;&#xE3;o que promete mudar o mundo, mas no final, o produto ou <a href="https://www.youtube.com/watch?v=iUju3faws4c&amp;pp=ygUIdGhlcmFub3M%3D&amp;ref=blog.lsantos.dev">n&#xE3;o existe</a>, ou <a href="https://www.youtube.com/watch?v=NPOHf20slZg&amp;pp=ygUJcmFiYml0IHIx&amp;ref=blog.lsantos.dev">existe</a> e <a href="https://exame.com/inteligencia-artificial/por-que-o-rabbit-r1-se-tornou-o-produto-mais-mentiroso-de-2024/?ref=blog.lsantos.dev">est&#xE1;</a> <a href="https://www.youtube.com/watch?v=ddTV12hErTc&amp;pp=ygUObWtiZCByYWJiaXQgcjE%3D&amp;ref=blog.lsantos.dev">pela</a> <a href="https://www.youtube.com/watch?v=TitZV6k8zfA&amp;pp=ygUObWtiZCByYWJiaXQgcjE%3D&amp;ref=blog.lsantos.dev">metade</a> ou &#xE9; uma varia&#xE7;&#xE3;o de algo j&#xE1; existente, com uma carinha nova. &#xC9; o &#x201C;fa&#xE7;a o que eu digo, mas n&#xE3;o olhe muito de perto o que eu fa&#xE7;o&#x201D;. Talvez o exemplo mais bem-sucedido dessa pr&#xE1;tica tenha sido <a href="https://www.youtube.com/watch?v=tNmgmwEtoWE&amp;t=2s&amp;pp=ygUNZGV2aW4gYWkgc2NhbQ%3D%3D&amp;ref=blog.lsantos.dev"><a href="https://www.youtube.com/watch?v=PTxoawPHW6A&amp;pp=ygUNZGV2aW4gYWkgc2NhbQ%3D%3D&amp;ref=blog.lsantos.dev" rel="noreferrer">Devin AI</a></a>, um caso emblem&#xE1;tico (que fez um comeback recentemente, aparentemente redimido) de como vender fuma&#xE7;a.</p><blockquote class="kg-blockquote-alt">Todo mundo quer criar conte&#xFA;do, mas ningu&#xE9;m quer fazer o trabalho de garantir que o conte&#xFA;do tenha valor</blockquote><p>Tendo isso em mente eu resolvi trazer a tona o que eu penso sobre cria&#xE7;&#xE3;o de conte&#xFA;do atualmente, sobre coaches tech e responder umas perguntas que a galera faz pra mim.</p><h2 id="um-culto-ao-vazio">Um culto ao vazio</h2><p>Dev de palco n&#xE3;o &#xE9; o problema. Eles podem se vender mais caro do que valem, mas no final s&#xF3; afetam a si mesmos. Muitos acabam sumindo ou, eventualmente, estudam e fazem o que sempre prometeram.</p><p>O problema real &#xE9; uma fatia da galera que se chama de <strong>influenciador tech.</strong> Apesar de eu n&#xE3;o gostar do termo &quot;influenciador&quot;, admito que me tornei um sem perceber &#x2013; s&#xF3; para agora observar de dentro e me perguntar onde isso vai parar. A maioria dos &#x201C;influencers&#x201D; hoje tem como ideia de conte&#xFA;do algo que &#xE9; para engajamento apenas, n&#xE3;o para ensinar. Em vez de trazer debates profundos ou ideias &#xFA;teis, o foco est&#xE1; em dancinhas, frases feitas e narcisismo. </p><blockquote>Claro, n&#xE3;o s&#xE3;o todas as pessoas, existem excelentes influenciadores que conseguem ensinar algo bom e engajar a galera, mas s&#xE3;o raros.</blockquote><p>Isso tudo gera uma bolha de entretenimento, porque &#xE9; engra&#xE7;adinho, &#xE9; engajante, mas quem se destaca n&#xE3;o &#xE9; quem tem algo a ensinar, mas quem sabe entreter ou chamar aten&#xE7;&#xE3;o.</p><blockquote>E criar conte&#xFA;do &#xE9; um trabalho dif&#xED;cil, voc&#xEA; precisa escolher: ou entret&#xE9;m, ou ensina. N&#xE3;o d&#xE1; pra fazer os dois <strong>realmente bem</strong> ao mesmo tempo.</blockquote><p>Isso seria inofensivo se n&#xE3;o tivesse consequ&#xEA;ncias pr&#xE1;ticas. O p&#xFA;blico consome esses conte&#xFA;dos rasos, toma como verdade absoluta e replica sem pensar. J&#xE1; entrevistei pessoas que descobriram durante a entrevista que React n&#xE3;o era &#x201C;O JavaScript&#x201D;. Isso chega ao n&#xED;vel de achar que &#x201C;Facebook &#xE9; a internet&#x201D;.</p><p>J&#xE1; perdi a conta de quantas vezes vi posts que precisam ser corrigidos em v&#xE1;rias redes, desde compara&#xE7;&#xF5;es absurdas entre PHP e Node ou not&#xED;cias incorretas sobre propostas de JavaScript que sequer foram implementadas. O pior n&#xE3;o &#xE9; o erro em si &#x2013; afinal, a gente est&#xE1; aqui pra aprender &#x2013;, mas a falta de compromisso em checar se as fontes s&#xE3;o reais antes de publicar uma informa&#xE7;&#xE3;o. E, do outro lado, a falta de senso cr&#xED;tico para saber que aquilo n&#xE3;o fazia sentido...</p><p>E se tem algo que me deixa puto, &#xE9; algu&#xE9;m ensinando algo errado como se fosse verdade.</p><h2 id="mas-por-que-t%C3%A3o-raso">Mas por que t&#xE3;o raso?</h2><p>O problema n&#xE3;o para nos influenciadores, eles s&#xE3;o a consequ&#xEA;ncia de um mercado que prefere entrega a qualquer custo do que parar e pensar no que voc&#xEA; est&#xE1;, de fato, fazendo. Isso gera uma ind&#xFA;stria que quer tudo r&#xE1;pido, simples e pr&#xE1;tico.</p><p>Todo mundo quer criar conte&#xFA;do, mas ningu&#xE9;m quer fazer o trabalho de garantir que o conte&#xFA;do tenha valor. E, quanto mais gente fica rica e famosa com conte&#xFA;do superficial, mais conte&#xFA;do raso &#xE9; feito, gerando uma bola de neve at&#xE9; chegar em p&#xE9;rolas como essa aqui:</p><blockquote>React: 761 issues, VSCode: 5000+ issues [...]<br>Suas ferramentas n&#xE3;o s&#xE3;o perfeitas, ainda sim elas d&#xE3;o a milh&#xF5;es de pessoas o que elas precisam.<br>Pare de se preocupar com bugs pequenos e problemas de interface. Foque na sua funcionalidade principal.</blockquote><p>Onde claramente a mensagem &#xE9;: n&#xE3;o importa construir algo bom, importa entregar <strong>qualquer coisa</strong>. Essa mentalidade reflete no mercado atual.</p><blockquote class="kg-blockquote-alt">A galera que est&#xE1; se formando agora, ou est&#xE1; nos primeiros anos de carreira simplesmente n&#xE3;o tem vontade de ir a fundo em quase nada.</blockquote><p>Como entrevistador, vi isso de perto: projetos simples, conhecimento raso, devs que sabiam codar, mas n&#xE3;o entendiam como o c&#xF3;digo rodava. </p><p>&#x201C;Como funciona?&#x201D;</p><p>N&#xE3;o importa.</p><h2 id="o-meu-futuro-nisso-tudo">O meu futuro nisso tudo</h2><p>Isso me fez questionar o futuro do que eu crio aqui. N&#xE3;o &#xE9; segredo que eu n&#xE3;o gosto de redes sociais, sou pouco ativo nelas e n&#xE3;o sei criar conte&#xFA;do &#x201C;engajante&#x201D;. Meus poucos posts que geram barulho s&#xE3;o exce&#xE7;&#xF5;es, mas tamb&#xE9;m n&#xE3;o quero fazer parte do culto ao conte&#xFA;do raso. Quero oferecer algo de valor, profundo, que ensine &#x2013; exatamente o motivo pelo qual criei essa newsletter.</p><p>Todo conte&#xFA;do que fa&#xE7;o e farei seguir&#xE1; esse princ&#xED;pio: algo pautado, bem fundamentado, do jeito que gosto de aprender e ensinar. Quero que cada artigo/newsletter/video seja algo que voc&#xEA; veja e pense: &#x201C;Isso valeu meu tempo&#x201D;. Espero que, aos poucos, mais pessoas se juntem a esse caminho e rompam com o show do conte&#xFA;do vazio, trazendo discuss&#xF5;es e aprendizado real.</p><p>Muita gente deixou de me seguir nos &#xFA;ltimos meses, inclusive aqui na newsletter. Por qu&#xEA;? N&#xE3;o sei. Talvez meu conte&#xFA;do n&#xE3;o seja &#x201C;sexy&#x201D; ou chamativo o suficiente para o algoritmo, talvez eu seja direto demais (inclusive, <a href="https://forms.gle/yrgiKweb2PLRTqW78?ref=blog.lsantos.dev">voc&#xEA; pode me ajudar respondendo aqui</a>). Mas o ponto &#xE9; que n&#xE3;o pretendo mudar s&#xF3; para agradar. O <a href="https://blog.lsantos.dev/backlog-0/">motivo principal</a> de escrever isso tudo sempre foi compartilhar ideias e discutir coisas que realmente importam &#x2013; e quem fica, entende esse prop&#xF3;sito.</p><p>Criar conte&#xFA;do de verdade d&#xE1; trabalho. Exige tempo (muito tempo), pesquisa e dedica&#xE7;&#xE3;o &#x2013; bem diferente dos posts r&#xE1;pidos tipo &#x201C;cinco segredos para ser um dev ninja&#x201D;. Quero algo que tenha impacto e ensine de verdade. E, mesmo que n&#xE3;o alcance tanta gente, j&#xE1; valeu a pena, porque aprendi no processo.</p><p>Ent&#xE3;o, se voc&#xEA; est&#xE1; aqui, lendo at&#xE9; esse ponto, &#xE9; porque valoriza o mesmo. Obrigado. &#xC9; para voc&#xEA; que eu continuo escrevendo.</p><h3 id="perguntas-que-me-fazem-e-respostas-que-ningu%C3%A9m-quer-ouvir"><strong>Perguntas que me fazem e respostas que ningu&#xE9;m quer ouvir</strong></h3><p>Agora &#xE9; o momento que eu respondo um monte de perguntas que muita gente me manda ao longo do tempo mas eu acabei nunca respondendo porque eu acabei esquecendo ou acabei n&#xE3;o querendo responder com receio de algum tipo de cancelamento, ent&#xE3;o ai vai:</p><p><strong>Por que voc&#xEA; n&#xE3;o posta mais em redes sociais?</strong></p><p><em>Eu <strong>detesto</strong> ter que ficar pensando em algo novo todo dia, n&#xE3;o &#xE9; sempre que voc&#xEA; tem inspira&#xE7;&#xE3;o pra criar algo, n&#xE3;o &#xE9; sempre que voc&#xEA; tem vontade de criar algo. Mas para a rede social &#xE9; sempre a frequ&#xEA;ncia que importa, e eu n&#xE3;o sou constante, portanto, redes sociais tamb&#xE9;m n&#xE3;o gostam de mim. Al&#xE9;m de que eu produzo o conte&#xFA;do sozinho, e eu tamb&#xE9;m trabalho, ent&#xE3;o n&#xE3;o tem muito tempo pra criar algo de qualidade, e se n&#xE3;o tiver qualidade eu prefiro n&#xE3;o criar.</em></p><p><strong><em>Qual &#xE9; a sua opini&#xE3;o sobre </em></strong><a href="https://canaltech.com.br/empreendedorismo/o-que-e-solopreneur-191530/?ref=blog.lsantos.dev"><a href="https://canaltech.com.br/empreendedorismo/o-que-e-solopreneur-191530/?ref=blog.lsantos.dev"><strong><em>solopreneurs</em></strong></a></a><strong><em> e essa galera coach de sucesso?</em></strong></p><p><em>Muito dela est&#xE1; aqui na newsletter, mas no geral, sempre que eu vejo um &quot;founder&quot; postando algo fazendo um boost sobre a sua pr&#xF3;pria empresa ou sempre que eu vejo &quot;disruptivo&quot;, &quot;mudan&#xE7;a de mindset&quot; ou varia&#xE7;&#xF5;es disso, eu paro de seguir, e as vezes at&#xE9; bloqueio a pessoa. At&#xE9; agora tiveram poucas exce&#xE7;&#xF5;es de pessoas que eu realmente quis seguir que s&#xE3;o empreendedores, uma delas &#xE9; o Zeno Rocha, porque acredito que ele &#xE9; um dos poucos que realmente entregam valor real nos produtos, desde os prim&#xF3;rdios, e o conte&#xFA;do dele n&#xE3;o &#xE9; s&#xF3; inspiracional, mas educativo na maioria das vezes.</em></p><p><strong>IA vai roubar meu emprego?</strong></p><p><em>Se voc&#xEA; acha que IA vai roubar seu emprego nos pr&#xF3;ximos 10 anos, ent&#xE3;o provavelmente ela vai. &#xC9; o que eu sempre falo, se voc&#xEA; se comporta como uma IA, voc&#xEA; vai ser tratado como uma IA. Hoje qualquer coisa que contenha &quot;IA&quot; no nome j&#xE1; me d&#xE1; um certo asco, eu n&#xE3;o uso mais copilot e evito ao m&#xE1;ximo qualquer tipo de c&#xF3;digo escrito completamente por IA. S&#xE3;o &#xF3;timas ferramentas para revis&#xE3;o, rubber ducking, mas n&#xE3;o para pensar por voc&#xEA;. <strong>SEMPRE CHEQUE SUAS FONTES</strong></em></p><p><strong>Voc&#xEA; pretende fazer o que com seu conte&#xFA;do?</strong></p><p><em>Sinceramente, eu pensei em parar m&#xFA;ltiplas vezes. Mas acho que n&#xE3;o &#xE9; justo comigo, porque eu gosto muito de escrever e ensinar (e, mais ainda, aprender), ent&#xE3;o eu tamb&#xE9;m n&#xE3;o quero parar. Provavelmente vou dar uma reduzida agora com projetos como a </em><a href="https://formacaots.com.br/?ref=blog.lsantos.dev" rel="noreferrer"><em>Forma&#xE7;&#xE3;o TS</em></a><em> em foco para poder terminar ela de vez e focar em construir coisas, mostrando como eu estou fazendo no processo, quem sabe em lives. Por mais que eu n&#xE3;o goste da cultura do </em><a href="https://canaltech.com.br/empreendedorismo/o-que-e-solopreneur-191530/?ref=blog.lsantos.dev"><em>solopreneur</em></a><em>, eu admiro muito indie hackers, porque eles passam por muita coisa. </em></p><p><em>Enfim, n&#xE3;o sei, me manda uma sugest&#xE3;o no meu email ou nas redes se tiver alguma ideia!</em></p><p><strong>Voc&#xEA; v&#xEA; futuro no conte&#xFA;do atual?</strong></p><p><em>Sim, a galera que est&#xE1; por ai hoje tem gente muito boa. Muitos que sabem como lidar com as redes sociais, que nasceram nelas, mas ao mesmo tempo tamb&#xE9;m s&#xE3;o muito inteligentes e sabem ensinar, o melhor de todos os mundos. Por&#xE9;m, a quantidade de pessoas que vai para o lado f&#xE1;cil da coisa puxa tudo pra baixo. Se a gente continuar dando palco pra galera que faz conte&#xFA;dos rasos, a tend&#xEA;ncia &#xE9; que mais conte&#xFA;do raso apare&#xE7;a.</em></p><p><strong>Voc&#xEA; acha que devs de hoje tem conserto?</strong></p><p><em>Eu n&#xE3;o acho que a galera esta quebrada. Eu acho que uma pandemia e uma s&#xE9;rie de problemas ajudou a bolha atual a ser o que ela &#xE9;. Mas, enquanto conte&#xFA;do raso e falta de conhecimento forem norma, eu n&#xE3;o tenho que achar nada, porque o mercado vai se encarregar de n&#xE3;o deixar a galera que n&#xE3;o se importa progredir.</em></p><p>Muito obrigado, n&#xE3;o deixa de comentar se gostou nas minhas redes e te vejo no pr&#xF3;ximo backlog!</p>]]></content:encoded></item><item><title><![CDATA[Backlog #4 - A primeira linguagem de programação]]></title><description><![CDATA[E se eu te disser que a primeira linguagem de programação surgiu de um tear? Bora entender o que costura tem a ver com código!]]></description><link>https://blog.lsantos.dev/backlog-primeira-linguagem/</link><guid isPermaLink="false">676ade4aa9fd27ef5289588f</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[computing]]></category><category><![CDATA[development]]></category><category><![CDATA[history]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Wed, 25 Dec 2024 11:00:16 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/articles.png" medium="image"/><content:encoded><![CDATA[<blockquote>Essa edi&#xE7;&#xE3;o do <em>Backlog</em> &#xE9; especial porque &#xE9; a primeira (e provavelmente &#xFA;nica em anos) a ser publicada no Natal. Considere este e-mail meu presente para voc&#xEA;, que acompanha este projeto t&#xE3;o importante para mim. Muito obrigado pelo apoio &#x1F499;</blockquote><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/articles.png" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o"><p>Para come&#xE7;ar, n&#xE3;o haveriam devs sem algo que a gente pudesse escrever para transformar nossos pensamentos em algo &#xFA;til que um computador possa executar. A gente precisa de uma forma, uma linguagem, para dizer ao computador o que a gente quer fazer, e assim tivemos a ideia de criar as <strong>linguagens de programa&#xE7;&#xE3;o</strong>. </p><p>Mas como essas linguagens surgiram? Qual &#xE9; a hist&#xF3;ria por tr&#xE1;s delas? E, mais importante, quem criou a primeira linguagem de programa&#xE7;&#xE3;o realmente &#xFA;til?</p><p>Antes de responder, a gente precisa explorar o contexto da evolu&#xE7;&#xE3;o das linguagens de programa&#xE7;&#xE3;o. Esse processo n&#xE3;o aconteceu do dia para a noite &#x2013; levou mais de 200 anos para chegarmos onde estamos hoje.</p><h2 id="onde-tudo-come%C3%A7ou">Onde tudo come&#xE7;ou</h2><p>Antes de qualquer computador ou m&#xE1;quina de calcular, e mais de 100 anos antes de Alan Turing, um tecel&#xE3;o franc&#xEA;s chamado Joseph Marie Jacquard revolucionou a forma como os teares funcionavam. Em 1804, ele criou e patenteou o famoso <a href="https://en.wikipedia.org/wiki/Jacquard_machine?ref=blog.lsantos.dev">tear de Jacquard</a>, projetado para criar padr&#xF5;es complexos automaticamente.</p><blockquote>Voc&#xEA; achou que eu ia falar da Ada Lovelace n&#xE9;? Achou errado.</blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/f/f8/Loom.jpg" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="1024" height="768"><figcaption><span style="white-space: pre-wrap;">Ironicamente, os cart&#xF5;es eram costurados juntos</span></figcaption></figure><p>O tear de Jacquard era completamente program&#xE1;vel por meio de cart&#xF5;es perfurados de papel. Cada cart&#xE3;o representava uma linha do desenho, e a m&#xE1;quina podia ser acoplada a qualquer tear existente. Isso simplificou e barateou a produ&#xE7;&#xE3;o de tecidos com padr&#xF5;es mais complexos, revolucionando a ind&#xFA;stria t&#xEA;xtil da &#xE9;poca.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Telar_manual_y_m%C3%A1quina_de_Jacquard_12.jpg/1280px-Telar_manual_y_m%C3%A1quina_de_Jacquard_12.jpg" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="1280" height="853"><figcaption><span style="white-space: pre-wrap;">Um tear com o &quot;plugin&quot; de Jacquard</span></figcaption></figure><p>Embora o tear de Jacquard fosse uma aplica&#xE7;&#xE3;o simples de uma DSL (<em>Domain Specific Language</em>, ou uma linguagem projetada para um prop&#xF3;sito espec&#xED;fico), seu trabalho inspirou o desenvolvimento de linguagens mais complexas, capazes de serem interpretadas por diferentes tipos de m&#xE1;quinas.</p><h2 id="ada-lovelace-e-a-nota-g">Ada Lovelace e a nota G</h2><blockquote>Finalmente ela aparece!</blockquote><p>Trinta e seis anos ap&#xF3;s Jacquard patentear seu tear, em 1840, o professor <a href="https://en.wikipedia.org/wiki/Charles_Babbage?ref=blog.lsantos.dev">Charles Babbage</a> foi convidado a dar um semin&#xE1;rio em Torino, na It&#xE1;lia, sobre os avan&#xE7;os de seu projeto mais ambicioso: o motor anal&#xED;tico (um tema para um futuro <em>Backlog</em>). Esse semin&#xE1;rio foi a &#xFA;nica apresenta&#xE7;&#xE3;o p&#xFA;blica que Babbage fez sobre a m&#xE1;quina revolucion&#xE1;ria que estava desenvolvendo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-3.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="317" height="417"><figcaption><span style="white-space: pre-wrap;">Charles Babbage</span></figcaption></figure><p>Durante a palestra, um engenheiro chamado <a href="https://en.wikipedia.org/wiki/Luigi_Menabrea?ref=blog.lsantos.dev">Luigi Menabrea</a> &#x2013; que mais tarde se tornaria primeiro-ministro da It&#xE1;lia &#x2013; tomou notas detalhadas para entender o funcionamento do complexo modelo que, no futuro, seria conhecido como o primeiro computador mec&#xE2;nico do mundo (mesmo que nunca tenha sido constru&#xED;do).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-4.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="498" height="503"><figcaption><span style="white-space: pre-wrap;">Uma constru&#xE7;&#xE3;o do que seria o motor anal&#xED;tico</span></figcaption></figure><p>Babbage tinha uma amiga e mentorada importante: <a href="https://en.wikipedia.org/wiki/Ada_Lovelace?ref=blog.lsantos.dev">Ada Lovelace</a>. Desde 1833, ele e Ada, uma brilhante matem&#xE1;tica e filha do poeta Lord Byron, trocavam cartas e notas sobre suas pesquisas e avan&#xE7;os matem&#xE1;ticos. Ap&#xF3;s uma conversa com Charles Wheatstone, Ada recebeu a sugest&#xE3;o de traduzir as notas de Luigi Menabrea para o ingl&#xEA;s como uma forma de contribuir com o trabalho. Ao concluir a tradu&#xE7;&#xE3;o, Babbage sugeriu que ela adicionasse seus pr&#xF3;prios pensamentos em forma de ap&#xEA;ndices, que Ada chamou simplesmente de &quot;notas&quot;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/f/f9/Ada_Byron_daguerreotype_by_Antoine_Claudet_1843_or_1850_-_cropped_%28cropped%29.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="428" height="545"><figcaption><span style="white-space: pre-wrap;">Ada Lovelace em sua &#xFA;nica &quot;fotografia&quot;, tirada em 1843</span></figcaption></figure><p>Ada compilou sete notas, nomeadas de A a G, detalhando o funcionamento do motor anal&#xED;tico. Na &#xFA;ltima delas, a nota G, ela descreveu um algoritmo para calcular os <a href="https://en.wikipedia.org/wiki/Bernoulli_numbers?ref=blog.lsantos.dev">n&#xFA;meros de Bernoulli</a>, projetado para ser executado exclusivamente na m&#xE1;quina de Babbage. Esse algoritmo &#x2013; e essa nota &#x2013; &#xE9; amplamente reconhecido como <strong>o primeiro programa de computador j&#xE1; escrito</strong>, tornando Ada Lovelace como <strong>a primeira programadora da hist&#xF3;ria</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Diagram_for_the_computation_of_Bernoulli_numbers.jpg/1280px-Diagram_for_the_computation_of_Bernoulli_numbers.jpg" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="1280" height="896"><figcaption><span style="white-space: pre-wrap;">A nota G</span></figcaption></figure><p>As <a href="https://en.wikipedia.org/wiki/Note_G?ref=blog.lsantos.dev">notas</a> de Ada eram tr&#xEA;s vezes mais extensas do que o artigo original de Luigi Menabrea. Al&#xE9;m de descrever o algoritmo (apenas na &#xFA;ltima nota, a G), Ada detalhou todo o funcionamento do motor anal&#xED;tico, explicando como ele diferia da m&#xE1;quina anterior, o motor de diferen&#xE7;as. Na nota C, ela apresentou conceitos revolucion&#xE1;rios, como loops, fluxos de controle (<em>if</em>, <em>else</em>) e fun&#xE7;&#xF5;es &#x2013; a primeira vez que essas ideias apareceram na hist&#xF3;ria.</p><blockquote>Um fato engra&#xE7;ado &#xE9; que nem o pr&#xF3;prio Babbage tinha pensado nisso para a m&#xE1;quina. As ideias de Ada eram muito maiores que as ambi&#xE7;&#xF5;es do seu pr&#xF3;prio criador.</blockquote><p>E ela fez isso sem nunca ter nem visto a m&#xE1;quina em si (que nunca foi completamente constru&#xED;da) ou ter usado qualquer parte dela. E hoje a gente reclama quando n&#xE3;o consegue usar uma API sem documenta&#xE7;&#xE3;o...</p><h1 id="pausa-para-um-aviso">Pausa para um aviso!</h1><p>Essa newsletter s&#xF3; existe gra&#xE7;as &#xE0; comunidade e aos patrocinadores! E hoje o apoio vem da <strong>Remessa Online</strong>, que est&#xE1; ajudando demais a manter este projeto vivo &#x1F499;.  </p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/logo-2-corte.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="300" height="114"></figure><p>Aproveitando o fim do ano, muita gente t&#xE1; planejando viagens ou come&#xE7;ando a vida fora do pa&#xED;s, n&#xE9;? Ent&#xE3;o olha essa promo&#xE7;&#xE3;o exclusiva de f&#xE9;rias:  </p><ul><li><strong>1GB de dados gr&#xE1;tis</strong> com um e-chip pra usar no exterior;  </li><li><strong>35% de desconto no seguro viagem</strong> (que a gente sabe que pesa no bolso).  </li></ul><p>Pra garantir, &#xE9; s&#xF3; abrir sua conta global na Remessa e carregar com pelo menos 200 Euros ou D&#xF3;lares at&#xE9; 31/01/2025. Al&#xE9;m de conectividade, ainda rola a menor taxa do mercado pra transfer&#xEA;ncias!  </p><p>Use o cupom <strong>LSANTOSDEV5</strong> e aproveite.  </p><p>&#x1F449; <a href="https://lsantos.dev/ferias-remessa?ref=blog.lsantos.dev" rel="noreferrer">Clica aqui pra transferir com a menor taxa do mercado!</a></p><p>&#x1F97A; <strong>Quer ajudar a newsletter a crescer?</strong> Se tem uma marca ou produto que se conecta com essa comunidade, manda um e-mail para <strong>hello@lsantos.dev</strong>.&#xA0;</p><p>&#x1F499; <strong>Apoie o meu trabalho</strong>: Se voc&#xEA; gosta do conte&#xFA;do e quer dar uma for&#xE7;a, mesmo com apenas R$1, isso j&#xE1; faz toda a diferen&#xE7;a! <a href="https://github.com/sponsors/khaosdoctor?ref=blog.lsantos.dev">Clique aqui</a>!</p><h2 id="plankalk%C3%BCl-quase-l%C3%A1">Plankalk&#xFC;l, quase l&#xE1;...</h2><p>O mundo da computa&#xE7;&#xE3;o permaneceu praticamente o mesmo por cerca de 100 anos. Mas, entre 1943 e 1948, um cientista alem&#xE3;o chamado <a href="https://en.wikipedia.org/wiki/Konrad_Zuse?ref=blog.lsantos.dev">Konrad Zuse</a> (se pronuncia &#x201C;Zuza&#x201D;) come&#xE7;ou a perceber um grande problema: nenhuma linguagem de computa&#xE7;&#xE3;o existente era <a href="https://en.wikipedia.org/wiki/Turing-complete?ref=blog.lsantos.dev">Turing-completa</a>, o que as tornava inadequadas para seus computadores Z1 a Z3.</p><blockquote>Spoiler: Konrad Zuse vai ganhar uma edi&#xE7;&#xE3;o inteira do <em>Backlog</em>. Ele &#xE9; amplamente reconhecido como o inventor do primeiro computador digital program&#xE1;vel do mundo, o Z3.</blockquote><p>Os computadores de Zuse come&#xE7;aram como m&#xE1;quinas de calcular mec&#xE2;nicas, parecidas com as ideias de Babbage. Mas, ao chegar &#xE0; terceira vers&#xE3;o (o Z3), ele criou algo revolucion&#xE1;rio: um computador totalmente digital e program&#xE1;vel. Agora, tudo o que faltava era uma linguagem que seu computador pudesse entender...</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-13.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="1740" height="1282"><figcaption><span style="white-space: pre-wrap;">O Zuse Z3, o primeiro computador digital do mundo</span></figcaption></figure><p>Por que n&#xE3;o criar a sua pr&#xF3;pria linguagem? Foi exatamente o que Zuse fez. Ele se baseou em conceitos matem&#xE1;ticos, incluindo o c&#xE1;lculo proposicional &#x2013; um campo complexo da matem&#xE1;tica &#x2013; para desenvolver um modelo de programa&#xE7;&#xE3;o. </p><p>No entanto, como implementar diretamente o c&#xE1;lculo proposicional em um computador seria extremamente dif&#xED;cil (e n&#xE3;o era Turing-completo), Zuse decidiu elaborar sua pr&#xF3;pria linguagem, chamada Plankalk&#xFC;l.</p><p>O <a href="https://en.wikipedia.org/wiki/Plankalk%C3%BCl?ref=blog.lsantos.dev">Plankalk&#xFC;l</a> &#xE9; amplamente reconhecido como <strong>a primeira linguagem de programa&#xE7;&#xE3;o de alto n&#xED;vel</strong>, pois abstra&#xED;a grande parte do funcionamento interno do computador. Com ela, os engenheiros n&#xE3;o precisavam lidar diretamente com tarefas repetitivas, como a cria&#xE7;&#xE3;o manual de loops.</p><p>Embora fosse uma linguagem completamente estabelecida teoricamente, o Plankalk&#xFC;l nunca foi implementado nos computadores de Zuse, como o Z3, mesmo tendo sido desenvolvida depois. O Z3 em si era programado usando fitas perfuradas em um filme cinematogr&#xE1;fico, que eram lidas por rel&#xE9;s eletromec&#xE2;nicos para uma mem&#xF3;ria de 1408 bits (64 palavras de 22 bits cada).</p><blockquote>Estou deixando um v&#xED;deo sobre como o Z3 funcionava, ele est&#xE1; em alem&#xE3;o mas existem legendas auto traduzidas do YouTube.</blockquote><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/aUXnhVrT4CI?start=126&amp;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Die Z3 von Konrad Zuse im Deutschen Museum"></iframe></figure><p>Em vez disso, sua principal motiva&#xE7;&#xE3;o era oferecer uma maneira mais eficiente e estruturada de programar, permitindo o desenvolvimento de programas mais sofisticados e de &quot;f&#xE1;cil compreens&#xE3;o&quot;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linube.com/blog/wp-content/uploads/primer-lenguaje-programacion-1280x720.jpg" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="1280" height="720"><figcaption><span style="white-space: pre-wrap;">Um programa em plankalk&#xFC;l</span></figcaption></figure><blockquote>Zuse achava que isso era algo de &quot;f&#xE1;cil compreens&#xE3;o&quot;, tenho pena de quem precisava usar.</blockquote><p>Eu gostaria de explicar como essa linguagem &#x201C;mais simples&#x201D; funciona, mas, sinceramente, n&#xE3;o consegui entender nada (Zuse era muito mais inteligente do que eu). Ent&#xE3;o, vou deixar voc&#xEA; com o b&#xE1;sico:</p><ul><li>A linguagem possui apenas um tipo primitivo, chamado <code>S0</code>, que representa um bit, ou seja, um valor booleano. Um bit pode ser <code>0</code> ou&#x2026; <code>L</code> (sim, isso mesmo, pra que usar o <code>1</code> n&#xE9;?). Ent&#xE3;o, o n&#xFA;mero 2 (10 em bin&#xE1;rio) seria escrito como <code>L0</code>.</li><li>Todos os outros tipos s&#xE3;o compostos, formados por arrays ou tuplas de bits. Por exemplo, uma sequ&#xEA;ncia de 8 bits seria escrita como <code>8 x S0</code>.</li><li>As vari&#xE1;veis s&#xE3;o sempre locais, sem escopo global.</li><li>N&#xE3;o h&#xE1; suporte para recurs&#xE3;o, instru&#xE7;&#xF5;es goto ou refer&#xEA;ncias &#x2013; apenas valores diretos.</li><li>Suporta estruturas de controle como if, else, for e while.</li><li>Tipos compostos s&#xE3;o sempre arrays ou tuplas, sem varia&#xE7;&#xF5;es mais complexas.</li><li>Letras mai&#xFA;sculas, como V, Z, C e R, identificam vari&#xE1;veis, sa&#xED;das, registradores e constantes.</li></ul><p>Eu imagino que isso fazia todo o sentido na cabe&#xE7;a de Zuse (porque na minha n&#xE3;o faz), mas, infelizmente, a guerra e a dissolu&#xE7;&#xE3;o da Alemanha nazista interromperam seu trabalho. </p><p>Com a ocupa&#xE7;&#xE3;o dos aliados, ele foi proibido de continuar desenvolvendo computadores, e focou seus esfor&#xE7;os na cria&#xE7;&#xE3;o de linguagens, mas a linguagem nunca chegou a ser implementada na &#xE9;poca. A primeira implementa&#xE7;&#xE3;o funcional do Plankalk&#xFC;l s&#xF3; aconteceu em 1975, quando Joachin Hohmann a utilizou em sua disserta&#xE7;&#xE3;o acad&#xEA;mica.</p><blockquote>Apesar de n&#xE3;o ter sido implementada originalmente, a publica&#xE7;&#xE3;o de Zuse teve impacto significativo no desenvolvimento de linguagens posteriores, como o ALGOL e o APL, que j&#xE1; discutimos na edi&#xE7;&#xE3;o #2.</blockquote><h2 id="agora-sim-a-m%C3%A3e-de-todas-as-linguagens">Agora sim, a m&#xE3;e de TODAS as linguagens</h2><p>At&#xE9; aqui, a maioria das linguagens foi criada de forma um tanto artesanal: seus criadores basicamente estruturavam tudo o que sabiam sobre computa&#xE7;&#xE3;o em um sistema funcional. Algumas dessas linguagens, como a APT usada no M70 que vimos na outra edi&#xE7;&#xE3;o, eram t&#xE3;o espec&#xED;ficas que exigiam at&#xE9; mesmo teclados especiais, cheios de s&#xED;mbolos exclusivos &#x2013; bem diferente do que usamos hoje.</p><p>Mas isso come&#xE7;ou a mudar em 1954 com o surgimento do <a href="https://en.wikipedia.org/wiki/Fortran?ref=blog.lsantos.dev">FORTRAN</a> (abrevia&#xE7;&#xE3;o de <em><strong>FOR</strong>mula <strong>TRAN</strong>slation</em>), a primeira linguagem de programa&#xE7;&#xE3;o comercial bem-sucedida. Desenvolvido por uma equipe liderada por John Backus na IBM, o FORTRAN trouxe uma abordagem pr&#xE1;tica e eficiente, que revolucionou o jeito de programar.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-6.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="934" height="823"><figcaption><span style="white-space: pre-wrap;">&#xC1;rvore das linguagens de programa&#xE7;&#xE3;o (</span><a href="https://www.levenez.com/lang/lang.pdf?ref=blog.lsantos.dev"><span style="white-space: pre-wrap;">https://www.levenez.com/lang/lang.pdf</span></a><span style="white-space: pre-wrap;">)</span></figcaption></figure><p>Por tr&#xE1;s dessas linguagens revolucion&#xE1;rias, havia um desafio t&#xE9;cnico gigantesco: fazer os computadores entend&#xEA;-las.</p><h3 id="compiladores">Compiladores</h3><p>Entre a inven&#xE7;&#xE3;o de Zuse em 1943 e 1954, qualquer c&#xF3;digo escrito para um computador precisava ser traduzido diretamente em instru&#xE7;&#xF5;es de m&#xE1;quina espec&#xED;ficas para aquele hardware. Era como escrever um programa exclusivo para cada processador, usando uma linguagem que s&#xF3; aquele processador entendia &#x2013; muitas vezes composta por s&#xED;mbolos matem&#xE1;ticos.</p><p>Em 1950, surgiu uma inven&#xE7;&#xE3;o revolucion&#xE1;ria: o <strong>compilador</strong>. Ele permitiu a cria&#xE7;&#xE3;o de um grupo de linguagens chamado <a href="https://en.wikipedia.org/wiki/Autocode?ref=blog.lsantos.dev"><em>Autocode</em></a>, que na &#xE9;poca eram descritas como &#x201C;sistemas de c&#xF3;digo&#x201D;. O termo <em>autocoders</em> se referia a uma fam&#xED;lia de linguagens compiladas, onde um mesmo conjunto de instru&#xE7;&#xF5;es podia ser traduzido para c&#xF3;digos de m&#xE1;quina de diferentes computadores. Em outras palavras, voc&#xEA; podia escrever o c&#xF3;digo uma vez e compilar para v&#xE1;rias m&#xE1;quinas, algo in&#xE9;dito at&#xE9; ent&#xE3;o.</p><p>A primeira dessas linguagens, pasmem, tamb&#xE9;m se chamava <em>Autocode</em>. Ela foi criada em 1952 por Alick Glennie, junto com seu pr&#xF3;prio compilador. Essa linguagem &#xE9; considerada <strong>a primeira linguagem compilada da hist&#xF3;ria</strong>, embora fosse pouco usada fora dos computadores <a href="https://en.wikipedia.org/wiki/Harvard_Mark_I?ref=blog.lsantos.dev">Manchester Mark I</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-1.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="676" height="345"><figcaption><span style="white-space: pre-wrap;">Um programa em autocode para calcular uma fun&#xE7;&#xE3;o c&#xFA;bica</span></figcaption></figure><p>Essa evolu&#xE7;&#xE3;o trouxe uma mudan&#xE7;a radical: agora era poss&#xED;vel criar c&#xF3;digos usando um sistema &#xFA;nico, onde apenas o compilador precisava ser ajustado para cada m&#xE1;quina. Isso simplificou enormemente o desenvolvimento de novas linguagens de programa&#xE7;&#xE3;o e abriu caminho para avan&#xE7;os ainda maiores na &#xE1;rea.</p><h3 id="a-hist%C3%B3ria-do-fortran">A hist&#xF3;ria do FORTRAN</h3><p>No final de 1953, John Backus apresentou uma proposta ousada para seus superiores na IBM: criar uma alternativa mais pr&#xE1;tica e eficiente ao <a href="https://en.wikipedia.org/wiki/Assembly_language?ref=blog.lsantos.dev">Assembly</a> para programar o mainframe IBM 704. A ideia era simplificar a vida da galera, permitindo que eles se concentrassem mais no problema e menos nas instru&#xE7;&#xF5;es de m&#xE1;quina.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/b/b2/John_Backus_2.jpg" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="238" height="356"><figcaption><span style="white-space: pre-wrap;">John Backus em 1977</span></figcaption></figure><p>A principal solu&#xE7;&#xE3;o que a nova linguagem deveria oferecer era simplificar a inclus&#xE3;o de equa&#xE7;&#xF5;es matem&#xE1;ticas em computadores, aproveitando estudos de 1952 que provaram ser poss&#xED;vel converter equa&#xE7;&#xF5;es diretamente em c&#xF3;digo.</p><blockquote>O FORTRAN tinha um objetivo claro: traduzir matem&#xE1;tica para c&#xF3;digo. Da&#xED; seu nome, uma abrevia&#xE7;&#xE3;o de <em>FORmula TRANslator</em> (Tradutor de F&#xF3;rmulas).</blockquote><p>A primeira especifica&#xE7;&#xE3;o da linguagem foi conclu&#xED;da em 1954, sob o t&#xED;tulo &#x201C;<em>The IBM Mathematical Formula Translating System</em>&#x201D;. Em 1957, o primeiro compilador de FORTRAN foi criado, e ele produzia um c&#xF3;digo de m&#xE1;quina r&#xE1;pido o suficiente para convencer a maioria dos programadores de que uma linguagem de alto n&#xED;vel podia ser uma alternativa vi&#xE1;vel &#x2013; mesmo com os v&#xE1;rios bugs iniciais.</p><blockquote>Curiosamente, John Backus criou o FORTRAN porque detestava programar. Enquanto escrevia programas para calcular trajet&#xF3;rias de m&#xED;sseis no IBM 701, ele pensou: &#x201C;Deve ter um jeito mais f&#xE1;cil de fazer isso.&#x201D;</blockquote><p>Depois de 1958, o FORTRAN ganhou um compilador confi&#xE1;vel e rapidamente se tornou amplamente utilizado na maioria dos mainframes da IBM, estabelecendo-se como a principal linguagem de programa&#xE7;&#xE3;o da &#xE9;poca. Seu sucesso foi t&#xE3;o grande que, em 1963, j&#xE1; existiam mais de 40 compiladores de FORTRAN.</p><blockquote>O FORTRAN era especialmente popular entre cientistas que precisavam realizar c&#xE1;lculos intensivos e precisos com n&#xFA;meros longos. Por isso, a linguagem foi continuamente aprimorada e, at&#xE9; hoje, &#xE9; reconhecida como uma das linguagens mais r&#xE1;pidas do mundo para processamento num&#xE9;rico.</blockquote><p>A vers&#xE3;o inicial do FORTRAN tinha 32 palavras-chave (Golang, por exemplo, tem 25) e suportava:</p><ul><li>Switch</li><li>Go to</li><li>I/O em fita ou bloco</li><li>Aritim&#xE9;tica</li></ul><p>Quando ele foi criado, n&#xE3;o existiam discos ou telas, a maioria dos programas era ainda feita em cart&#xF5;es perfurados, ent&#xE3;o os desenvolvedores tinham um &quot;formul&#xE1;rio&quot; para poder criar, apagar e testar o c&#xF3;digo antes de transferir para um cart&#xE3;o final.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-5.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="1271" height="764"><figcaption><span style="white-space: pre-wrap;">Um formul&#xE1;rio para codar FORTRAN</span></figcaption></figure><p>E, nesses cart&#xF5;es perfurados, existiam algumas colunas espec&#xED;ficas que eram destinadas a uso de controle, por exemplo:</p><ul><li>Um C na primeira coluna transformava o cart&#xE3;o todo em um coment&#xE1;rio</li><li>As colunas 1 a 5 eram labels, usadas para retornar em fun&#xE7;&#xF5;es como <code>GO</code> e <code>IF</code></li><li>A coluna 6 era pra dizer se o cart&#xE3;o era uma continua&#xE7;&#xE3;o do anterior</li><li>De 7 a 72 era onde escrev&#xED;amos os programas</li><li>De 73 at&#xE9; 80 eram ignoradas porque o IBM 704 s&#xF3; lia 72 colunas, ent&#xE3;o eram muito usadas para anota&#xE7;&#xF5;es ou identifica&#xE7;&#xE3;o, como a ordem dos cart&#xF5;es e etc.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-9.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="1596" height="732"><figcaption><span style="white-space: pre-wrap;">Um cart&#xE3;o FORTRAN com um statement</span></figcaption></figure><p>Lembrando que cada cart&#xE3;o perfurado representava somente UM statement, ou seja, cada cart&#xE3;o era uma keyword ou uma linha, o cart&#xE3;o acima poderia ter sido um <code>IF</code>.</p><h3 id="evolu%C3%A7%C3%B5es">Evolu&#xE7;&#xF5;es</h3><p>Ap&#xF3;s a vers&#xE3;o inicial, o FORTRAN continuou evoluindo &#x2013; e ainda evolui. &#xC9; a linguagem de programa&#xE7;&#xE3;o mais antiga ainda em uso ativo, com sua vers&#xE3;o mais recente lan&#xE7;ada em 2023. A primeira grande atualiza&#xE7;&#xE3;o, o <strong>FORTRAN II</strong>, trouxe um avan&#xE7;o significativo: o suporte &#xE0; programa&#xE7;&#xE3;o procedural, permitindo a cria&#xE7;&#xE3;o de sub-rotinas e modularizando o c&#xF3;digo de forma mais eficiente.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-2.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="714" height="573"><figcaption><span style="white-space: pre-wrap;">Um programa em FORTRAN II</span></figcaption></figure><p>A vers&#xE3;o inicial do FORTRAN n&#xE3;o tinha fun&#xE7;&#xF5;es ou rotinas, todo o c&#xF3;digo tinha que ser replicado e copiado, mas na vers&#xE3;o II era poss&#xED;vel usar as keywords <code>SUBROUTINE</code>, <code>FUNCTION</code> e <code>END</code> para criar uma rotina, al&#xE9;m de <code>CALL</code> e <code>RETURN</code>. Mas as vers&#xF5;es iniciais ainda n&#xE3;o suportavam recurs&#xE3;o.</p><p>Depois veio o <strong>FORTRAN III</strong>, que introduziu a possibilidade de escrever <em>assembly</em> diretamente junto com o c&#xF3;digo FORTRAN. No entanto, essa vers&#xE3;o nunca foi lan&#xE7;ada como um produto comercial. Em vez disso, a IBM lan&#xE7;ou o <strong>FORTRAN IV</strong> em 1961, trazendo mudan&#xE7;as significativas. A principal foi a remo&#xE7;&#xE3;o de depend&#xEA;ncias espec&#xED;ficas das m&#xE1;quinas IBM, como a instru&#xE7;&#xE3;o <code>READ INPUT TAPE</code>, permitindo que o FORTRAN fosse usado em diferentes computadores al&#xE9;m dos da IBM.</p><p>Mas talvez a evolu&#xE7;&#xE3;o mais importante tenha sido o <strong>FORTRAN 66</strong>. Essa vers&#xE3;o foi a primeira a passar por um processo de padroniza&#xE7;&#xE3;o oficial, muito parecido com o que aconteceu mais tarde com o JavaScript. A especifica&#xE7;&#xE3;o foi elaborada pela <em>American National Standards Institute (ANSI)</em> e por um comit&#xEA; chamado <em>BEMA</em>. Baseada largamente no FORTRAN IV, ela trouxe v&#xE1;rias funcionalidades importantes:</p><ul><li>Subrotinas e fun&#xE7;&#xF5;es</li><li>Novos tipos primitivos <code>INTEGER</code>, <code>REAL</code>, <code>DOUBLE PRECISION</code>, <code>COMPLEX</code> e <code>LOGICAL</code></li><li>A keyword <code>DATA</code> para especificar valores iniciais</li><li><code>GO TO</code> , <code>IF</code>, <code>DO</code> e muitos outros</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-7.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="723" height="721"><figcaption><span style="white-space: pre-wrap;">O mesmo programa do FORTRAN II em FORTRAN 66</span></figcaption></figure><p>11 anos depois, o FORTRAN 77 &#xE9; o que temos como in&#xED;cio do que usamos hoje como linguagem de programa&#xE7;&#xE3;o, incluindo mudan&#xE7;as como:</p><ul><li>O uso de <code>IF</code> estruturado com <code>END IF</code> ao inv&#xE9;s de <code>GO TO</code> e <code>CONTINUE</code></li><li>O primeiro uso de aspas para textos, j&#xE1; que agora era poss&#xED;vel escrever em terminais</li><li>Inclus&#xE3;o de <code>PROGRAM</code> para nomear programas</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-8.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="829" height="672"><figcaption><span style="white-space: pre-wrap;">O mesmo programa do FORTRAN 66 em FORTRAN 77</span></figcaption></figure><p>Uma curiosidade interessante sobre o FORTRAN &#xE9; como ele lidava com coment&#xE1;rios e linhas vazias. Qualquer linha que come&#xE7;asse com a letra C era interpretada como um coment&#xE1;rio. No entanto, o compilador do FORTRAN lia todas as linhas do programa em sequ&#xEA;ncia &#x2013; incluindo as linhas vazias, que frequentemente geravam erros. Para evitar problemas, era comum usar um coment&#xE1;rio vazio para separar uma linha da outra.</p><p>O FORTRAN continuou evoluindo, mas foi apenas 13 anos depois que surgiu uma grande revis&#xE3;o: o <strong>FORTRAN 90</strong>. Essa vers&#xE3;o &#xE9; uma das mais comumente utilizadas at&#xE9; hoje, pois trouxe mudan&#xE7;as significativas que provavelmente voc&#xEA; nem percebeu de imediato, mas que facilitaram muito a vida dos programadores:</p><ul><li>O texto n&#xE3;o precisava ser identado 6 caracteres pra frente antes de qualquer statement (lembra das 6 colunas dos cart&#xF5;es perfurados? Agora olha a identa&#xE7;&#xE3;o dos c&#xF3;digos de antes, veja a identa&#xE7;&#xE3;o)</li><li>As palavras-chave poderiam ser min&#xFA;sculas</li><li>Nomes de vari&#xE1;veis com at&#xE9; 31 letras (antes eram s&#xF3; 6)</li><li>Coment&#xE1;rios inline ao inv&#xE9;s de ocupar a linha toda</li><li>Agora era poss&#xED;vel operar em arrays como um todo</li><li>Recurs&#xE3;o</li><li>M&#xF3;dulos para agrupar procedures e dados juntos e torn&#xE1;-los dispon&#xED;veis para importa&#xE7;&#xE3;o em outros programas, o primeiro conceito de &quot;pacote&quot;<ul><li>Aqui tamb&#xE9;m temos a inclus&#xE3;o de encapsulamento, tendo fun&#xE7;&#xF5;es e partes privadas de um m&#xF3;dulo</li></ul></li><li>Overloads</li><li><code>SELECT CASE</code>, que &#xE9; a primeira vers&#xE3;o de um <code>switch</code></li><li>....</li></ul><p>Agora os programas de FORTRAN s&#xE3;o muito parecidos ao que escrevemos hoje, veja um hello world:</p><pre><code class="language-f90">program helloworld
     print *, &quot;Hello, World!&quot;
end program helloworld</code></pre><p>Depois dessas vers&#xF5;es, ainda temos o FORTRAN 95 at&#xE9; 2023, que implementou muitas mudan&#xE7;as at&#xE9; hoje, tornando o FORTRAN extremamente &#xFA;til ainda hoje em dia.</p><h2 id="o-fortran-atualmente">O FORTRAN atualmente</h2><p>O FORTRAN ainda &#xE9; amplamente utilizado em sistemas cr&#xED;ticos e antigos, como na avia&#xE7;&#xE3;o, em mainframes e em aplica&#xE7;&#xF5;es que demandam computa&#xE7;&#xE3;o extremamente r&#xE1;pida. Sua relev&#xE2;ncia est&#xE1; especialmente em cen&#xE1;rios que exigem alta performance no processamento de grandes volumes de dados.</p><p>A linguagem &#xE9; uma escolha comum em &#xE1;reas como simula&#xE7;&#xF5;es de mec&#xE2;nica de fluidos, modelagem espacial e terrestre, e no c&#xE1;lculo de temperaturas em oceanos. Gra&#xE7;as &#xE0; sua efici&#xEA;ncia em c&#xE1;lculos num&#xE9;ricos intensivos, o FORTRAN continua muito usado em campos que dependem de simula&#xE7;&#xF5;es cient&#xED;ficas e engenharia de alta precis&#xE3;o.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image-10.png" class="kg-image" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o" loading="lazy" width="461" height="554"><figcaption><span style="white-space: pre-wrap;">Computa&#xE7;&#xE3;o da velocidade e temperatura em oceanos usando NEMO (em FORTRAN)</span></figcaption></figure><p>O c&#xF3;digo FORTRAN em si sofreu v&#xE1;rias modifica&#xE7;&#xF5;es at&#xE9; ficar muito parecido com o que a gente entende como um c&#xF3;digo de programa&#xE7;&#xE3;o, por exemplo, abaixo temos um programa para calcular a m&#xE9;dia dos n&#xFA;meros lidos:</p><pre><code class="language-fortran">program average

    ! Read in some numbers and take the average
    ! As written, if there are no data points, an average of zero is returned
    ! While this may not be desired behavior, it keeps this example simple

    implicit none

    real, allocatable :: points(:)
    integer           :: number_of_points
    real              :: average_points, positive_average, negative_average
    average_points   = 0.
    positive_average = 0.
    negative_average = 0.
    write (*,*) &quot;Input number of points to average:&quot;
    read  (*,*) number_of_points

    allocate (points(number_of_points))

    write (*,*) &quot;Enter the points to average:&quot;
    read  (*,*) points

    ! Take the average by summing points and dividing by number_of_points
    if (number_of_points &gt; 0) average_points = sum(points) / number_of_points

    ! Now form average over positive and negative points only
    if (count(points &gt; 0.) &gt; 0) positive_average = sum(points, points &gt; 0.) / count(points &gt; 0.)
    if (count(points &lt; 0.) &gt; 0) negative_average = sum(points, points &lt; 0.) / count(points &lt; 0.)

    ! Print result to terminal stdout unit 6
    write (*,&apos;(a,g12.4)&apos;) &apos;Average = &apos;, average_points
    write (*,&apos;(a,g12.4)&apos;) &apos;Average of positive points = &apos;, positive_average
    write (*,&apos;(a,g12.4)&apos;) &apos;Average of negative points = &apos;, negative_average
    deallocate (points) ! free memory

end program average</code></pre><p>Atualmente ainda existem reposit&#xF3;rios que cont&#xE9;m c&#xF3;digos FORTRAN como em jogos e a linguagem ainda &#xE9; amplamente utilizada.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/fortran-gaming?utm_source=chatgpt.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Fortran Gaming</div><div class="kg-bookmark-description">Modern and resurrected Fortran games. Includes candidates for conversion to Fortran in other languages. - Fortran Gaming</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o"><span class="kg-bookmark-author">GitHub</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://avatars.githubusercontent.com/u/36714293?s=280&amp;v=4" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o"></div></a></figure><h1 id="legado">Legado</h1><p>O FORTRAN foi a primeira linguagem de alto n&#xED;vel a ser largamente distribu&#xED;da e tudo que usamos atualmente &#xE9; id&#xEA;ntico ou foi baseado em algum tipo de implementa&#xE7;&#xE3;o trazida pelo FORTRAN. Linguagens de base como COBOL, BASIC e ALGOL foram fortemente influenciadas pelo FORTRAN e, em troca, influenciaram outras linguagens como o B, C e todas as que se sucederam.</p><p>Recentemente eu estive no <a href="https://www.tnmoc.org/software?ref=blog.lsantos.dev"><strong>Museu Da Hist&#xF3;ria da Computa&#xE7;&#xE3;o</strong></a><strong> </strong>em Bletchley Park (veja no meu <a href="https://instagram.lsantos.dev/?ref=blog.lsantos.dev" rel="noreferrer">instagram</a>) e l&#xE1; a gente tem um mural muito legal de todas as linguagens de programa&#xE7;&#xE3;o que j&#xE1; existiram em um mapa interativo. Voc&#xEA; pode acessar esse mapa aqui e, quem sabe, imprimir para decorar sua casa:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.levenez.com/lang/?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Computer Languages History</div><div class="kg-bookmark-description">A Computer Languages diagram</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.levenez.com/lang/favicon.ico" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o"><span class="kg-bookmark-publisher">&#xC9;ric L&#xE9;v&#xE9;nez</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.levenez.com/lang/lang-little.png" alt="Backlog #4 - A primeira linguagem de programa&#xE7;&#xE3;o"></div></a></figure><p>Esse marca o fim dessa edi&#xE7;&#xE3;o do Backlog! Espero que voc&#xEA; tenha curtido assim como eu saber mais sobre o que foi a primeira linguagem de todas e como ela funcionava! </p><p>Um abra&#xE7;o e um feliz natal!</p><p>Nos vemos na pr&#xF3;xima edi&#xE7;&#xE3;o!</p>]]></content:encoded></item><item><title><![CDATA[Backlog #3 - 29 anos de JavaScript!]]></title><description><![CDATA[Dia 4 de Dezembro de 1995 foi um dia especial porque foi o lançamento da linguagem que todos amam odiar! Vamos mergulhar na história do JavaScript!]]></description><link>https://blog.lsantos.dev/backlog-3-29-anos-de-javascript/</link><guid isPermaLink="false">67579e86d328bafaf650655f</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[javascript]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Thu, 12 Dec 2024 11:00:40 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/articles-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/articles-1.png" alt="Backlog #3 - 29 anos de JavaScript!"><p>O dia 4 de dezembro de 1995 &#xE9; um dia muito especial. N&#xE3;o s&#xF3; porque &#xE9; o ano que eu nasci, mas tamb&#xE9;m porque foi o lan&#xE7;amento da linguagem que, hoje, todo mundo ama odiar! O <strong>JavaScript</strong>.</p><p>Como todo mundo que me acompanha sabe, eu sou um grande f&#xE3; de JavaScript e TypeScript, e gosto ainda mais de mostrar qual &#xE9; a hist&#xF3;ria dessa linguagem, n&#xE3;o s&#xF3; porque a linguagem evoluiu muito e tem um dos arcos de supera&#xE7;&#xE3;o mais incr&#xED;veis da computa&#xE7;&#xE3;o, mas tamb&#xE9;m porque a hist&#xF3;ria dessa linguagem &#xE9; muito interessante. Ent&#xE3;o pra essa edi&#xE7;&#xE3;o do backlog eu quero trazer, em comemora&#xE7;&#xE3;o dos 29 anos de JavaScript:</p><blockquote class="kg-blockquote-alt">A hist&#xF3;ria da linguagem que dominou o mundo.</blockquote><blockquote>Essa edi&#xE7;&#xE3;o &#xE9; baseada <a href="https://doi.org/10.1145/3386327?ref=blog.lsantos.dev">nesse paper de 189 p&#xE1;ginas</a>, escrito pelo pr&#xF3;prio Brendan Eich sobre os primeiros 20 anos de JavaScript.</blockquote><h2 id="de-um-hack-a-um-ecossistema-global">De um &quot;hack&quot; a um ecossistema global</h2><p>A hist&#xF3;ria resumida do JavaScript &#xE9; o que muita gente v&#xEA; por ai. Em 1995, por volta de 10 de Maio, Brendan Eich, um jovem programador para a Netscape Corporation passava da metade da sua sprint de 10 dias para criar uma linguagem que servisse como um apoio ao Netscape Navigator, criando mais intera&#xE7;&#xE3;o com a p&#xE1;gina e possibilitando uma Web (ainda muito recente) mais animada</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">IIRC, 25 years ago, Wednesday, 10-May-1995, I&apos;d just passed the midpoint of the &quot;ten days in May&quot; sprint to create JavaScript (codenamed &quot;Mocha&quot;). I was on the hook for a demo the following Monday, in order to show JS deep browser integration upside to Netscape (vs Java applets).</p>&#x2014; BrendanEich (@BrendanEich) <a href="https://twitter.com/BrendanEich/status/1259403604626038784?ref_src=twsrc%5Etfw&amp;ref=blog.lsantos.dev">May 10, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></figure><p>No tweet acima, Brendan Eich diz que nessa &#xE9;poca (em 2020, no caso) ele j&#xE1; tinha passado mais da metade do per&#xED;odo da sua &quot;sprint de 10 dias&quot; para criar o JavaScript, que na &#xE9;poca era chamado de <em>Mocha</em>. Ele iria ter uma demonstra&#xE7;&#xE3;o na segunda seguinte para mostrar a integra&#xE7;&#xE3;o com o browser versus a tecnologia que dominava que eram os Java Applets.</p><p>E hoje, 29 anos depois, o JavaScript &#xE9; a linguagem que marcou a funda&#xE7;&#xE3;o do desenvolvimento Web moderno, uma linguagem que, hoje em dia, est&#xE1; presente em 98% da Internet. Hoje, a gente n&#xE3;o s&#xF3; celebra o JavaScript como linguagem, mas tamb&#xE9;m como um movimento que moldou a Internet como a gente conhece.</p><h1 id="pausa-para-um-aviso">Pausa para um aviso!</h1><blockquote>Essa newsletter s&#xF3; &#xE9; poss&#xED;vel atrav&#xE9;s da ajuda da comunidade e dos patrocinadores!</blockquote><p>Essa em particular &#xE9; patrocinada pela <strong>Remessa Online!</strong> Se voc&#xEA; trabalha com tecnologia, com certeza j&#xE1; precisou trazer algum dinheiro de fora para o Brasil, e as taxas s&#xE3;o SUPER ALTAS &#x1F62D; Por isso a Remessa &#xE9; a melhor forma de fazer isso com a menor taxa do mercado!</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/logo-2-corte.png" class="kg-image" alt="Backlog #3 - 29 anos de JavaScript!" loading="lazy" width="300" height="114"></figure><p>Se voc&#xEA; j&#xE1; teve que passar por isso, ent&#xE3;o segura a&#xED; porque a <strong>Remessa Online</strong> tem um desconto de 15% pra voc&#xEA; com o cupom <strong>LSANTOSDEV!</strong> Ele &#xE9; v&#xE1;lido pra qualquer recebimento ou envio na conta global e voc&#xEA; economiza MUITO! Ent&#xE3;o aproveita o d&#xF3;lar/euro alto pra fazer a grana render mais!</p><p>Muito obrigado &#xE0; Remessa pelo apoio!</p><p>&#x1F449; <a href="https://lsantos.dev/remessa-online?ref=blog.lsantos.dev">Clica aqui pra transferir com a menor taxa do mercado!</a></p><p>&#x1F31F; <strong>Quer fazer parte desse sonho comigo?</strong> Trazer essa newsletter ao mundo &#xE9; algo que sempre quis fazer, e ver o projeto crescer com seu apoio seria incr&#xED;vel! Se voc&#xEA; tem uma marca ou produto que se conecta com essa comunidade, manda um e-mail para <a rel="noopener"><strong>hello@lsantos.dev</strong></a>. Vou adorar conversar!</p><p>&#x1F499; <strong>Apoie o meu trabalho</strong>: Se voc&#xEA; gosta do conte&#xFA;do e quer dar uma for&#xE7;a, mesmo com apenas R$1, isso j&#xE1; faz toda a diferen&#xE7;a! <a href="https://github.com/sponsors/khaosdoctor?ref=blog.lsantos.dev">Clique aqui</a> para contribuir mensalmente ou fazer uma doa&#xE7;&#xE3;o &#xFA;nica. Cada <a href="https://github.com/sponsors/khaosdoctor?ref=blog.lsantos.dev">apoio</a> me ajuda a manter essa newsletter viva e a fazer dela algo especial. Muito obrigado por estar aqui e por acreditar nesse sonho comigo!</p><h2 id="um-mosaico-de-possibilidades">Um mosaico de possibilidades</h2><p>A hist&#xF3;ria do JS come&#xE7;a com a hist&#xF3;ria da Web. Desenvolvida entre 1989-1991 por Tim Berners-Lee no CERN, a World Wide Web foi primeiramente mais aceita na comunidade de f&#xED;sicos e cientistas, j&#xE1; que era feita para compartilhar papers. Mas n&#xE3;o era muito vista fora dessa comunidade.</p><p>Um dos maiores motivos pelo qual a Web era muito fechada nesta comunidade era porque o seu uso era bastante complicado, baseado em protocolos de texto e n&#xE3;o era muito intuitivo. Isso mudou quando <strong>Marc Andreessen</strong> e <strong>Eric Bina</strong> criaram o <strong>Mosaic</strong> em 1992 enquanto trabalhavam na <strong>NCSA</strong>. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://t.ctcdn.com.br/1pajPRs7UtQ1bef8Tkj6lI1kCvY=/900x675/smart/i329497.jpeg" class="kg-image" alt="Backlog #3 - 29 anos de JavaScript!" loading="lazy" width="900" height="675"><figcaption><span style="white-space: pre-wrap;">Mosaic, o primeiro browser do mundo</span></figcaption></figure><p>O Mosaic foi o primeiro Web Browser do mundo, essencialmente o que criou a categoria de &quot;Browsers&quot; que a gente tem hoje. Ele quem popularizou o conceito da Web fora da comunidade de cientistas do CERN. Claramente, depois que o Mosaic ganhou fama e notoriedade, muita gente se perguntava se era poss&#xED;vel fazer disso algo comercial, na maioria tentando licenciar o pr&#xF3;prio Mosaic ou ent&#xE3;o criando varia&#xE7;&#xF5;es dele. At&#xE9; que um cara chamado Jim Clark, que fundou a Silicon Graphics (uma empresa extremamente importante de hardware) conseguiu um investimento e recrutou os dois estudantes, Marc e Eric, para fundar uma empresa chamada <strong>Netscape Communications Corporation (NCC)</strong> em 1994.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.internethistorypodcast.com/wp-content/uploads/2014/01/marc-andreessen-and-jim-clark-the-founders-of-netscape.jpg" class="kg-image" alt="Backlog #3 - 29 anos de JavaScript!" loading="lazy" width="1024" height="746"><figcaption><span style="white-space: pre-wrap;">Eric e Marc (da esquerda pra direita)</span></figcaption></figure><p>A ideia da NCC era substituir o Mosaic pelo Netscape, uma vers&#xE3;o mais robusta e f&#xE1;cil de utilizar. No final de 1994 e in&#xED;cio de 1995, o <em>Netscape Navigator</em> j&#xE1; era o browser mais utilizado de todos. E o que isso tem a ver com JavaScript? Tudo!</p><h2 id="uma-web-morta">Uma Web morta</h2><p>Originalmente, a Web era centrada em texto plano atrav&#xE9;s de uma linguagem de marca&#xE7;&#xE3;o, o HTML, que era declarativa e est&#xE1;tica e representava a estrutura e conte&#xFA;do de uma p&#xE1;gina da Web. O problema era que essas p&#xE1;ginas eram est&#xE1;ticas, para criar conte&#xFA;do din&#xE2;mico voc&#xEA; precisava requisitar uma outra p&#xE1;gina, ent&#xE3;o qual seria a utilidade para, por exemplo, servir bancos de dados? Pesquisas? Relat&#xF3;rios?</p><p>Existia um interesse consider&#xE1;vel da ind&#xFA;stria em criar uma linguagem de scripting pra poder fazer par com o HTML, dando mais &quot;vida&quot; a ele, e permitindo que as p&#xE1;ginas pudessem ser mais din&#xE2;micas. Da mesma forma como o VBA do Excel e o AppleScript fizeram com o Windows e Mac. Essas linguagens n&#xE3;o eram focadas em criar sistemas complexos, mas sim &quot;colar&quot; partes de v&#xE1;rios sistemas para criar uma integra&#xE7;&#xE3;o melhor e novas oportunidades.</p><p>Em 1995, Brendan Eich foi recrutado para ser um dos programadores da NCC. J&#xE1; tendo trabalhado em grandes empresas como a pr&#xF3;pria Silicon Graphics e MicroUnity, em ambas implementando linguagens espec&#xED;ficas para suportar fun&#xE7;&#xF5;es definidas, ent&#xE3;o ele j&#xE1; tinha o conhecimento necess&#xE1;rio para criar uma outra linguagem que seria a &quot;cola&quot; entre o HTML e o resto dos sistemas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn.facesofopensource.com/wp-content/uploads/2017/07/23193713/brendaneich25607.web_.jpg" class="kg-image" alt="Backlog #3 - 29 anos de JavaScript!" loading="lazy" width="1619" height="2024"><figcaption><span style="white-space: pre-wrap;">Brendan Eich</span></figcaption></figure><p>Originalmente, ele foi contratado para &quot;implementar o Scheme no browser&quot;. (Scheme era uma linguagem funcional, um dialeto do LISP, usada principalmente em &#xE1;reas acad&#xEA;micas) por&#xE9;m, quando ele chegou l&#xE1;, se deparou com um produto muito mais complicado do que esperava, al&#xE9;m de que havia um outro perigo no ar, e ele chamava <strong>Microsoft.</strong></p><h2 id="a-guerra-dos-browsers"><strong>A guerra dos browsers</strong></h2><p>Quando o <em>Netscape</em> foi lan&#xE7;ado, a Microsoft, ainda bem jovem, tinha um projeto chamado &quot;Projeto Blackbird&quot;, que era um conjunto de programas de gerenciamento de informa&#xE7;&#xE3;o e troca de dados para empresas, uma vers&#xE3;o da Web da Microsoft, chamada de <strong>Microsoft Network</strong> (MSN, familiar?).</p><p>A ideia era ter uma aplica&#xE7;&#xE3;o que iria servir conte&#xFA;do din&#xE2;mico, audio e v&#xED;deo sem necessidade de outros plugins. Ela seria constru&#xED;da usando tecnologias como Object Linking and Embedding (OLE) e outras que estavam sendo desenvolvidas naquela &#xE9;poca.</p><p>Mas, com a populariza&#xE7;&#xE3;o r&#xE1;pida da Web, a Microsoft viu esse projeto ser esquecido e mudou de foco para as tecnologias voltadas para essa nova &quot;Web&quot; que todo mundo estava falando. Em 1994, ela tentou comprar a NCC, mas foi recusada pelo valor ser baixo demais. Com isso, os fundadores da NCC j&#xE1; esperavam uma retalia&#xE7;&#xE3;o na forma do famoso <a href="https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish?ref=blog.lsantos.dev">Embrace Extend Extinguish</a>, onde a Microsoft pretenderia adotar o padr&#xE3;o, estender com suas tecnologias e depois matar o padr&#xE3;o em favor ao seu. Com isso, a Microsoft come&#xE7;ou o desenvolvimento do que seria chamado de <strong>Internet Explorer</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://winworldpc.com/res/img/screenshots/fa7f6d40d7bc337984906b36ee146d47cc0f8f71fcae7ce181d7f7720b118a83.png" class="kg-image" alt="Backlog #3 - 29 anos de JavaScript!" loading="lazy" width="640" height="480"><figcaption><span style="white-space: pre-wrap;">Internet Explorer na primeira vers&#xE3;o</span></figcaption></figure><p>Com isso, a Netscape precisava correr com a implementa&#xE7;&#xE3;o de uma linguagem de scripting, porque a Microsoft chegaria com tudo. As candidatas cotadas eram: Perl, Python, TCL e at&#xE9; mesmo o Visual Basic da Microsoft, al&#xE9;m do Scheme. Por&#xE9;m tudo mudou quando o Java chegou.</p><h2 id="java-sem-script">Java (sem script)</h2><p>No in&#xED;cio de 1995, a Sun Microsystems come&#xE7;ou uma campanha pesada de marketing para divulgar a sua, ent&#xE3;o n&#xE3;o lan&#xE7;ada, linguagem chamada Java. A Netscape logo viu uma oportunidade de neg&#xF3;cio, visto que o Java tamb&#xE9;m queria derrubar o monop&#xF3;lio da Microsoft sobre o Windows, que j&#xE1; era o SO mais usado em todas as m&#xE1;quinas, com a JVM e a sua proposta de rodar em <em>qualquer lugar.</em></p><blockquote>Para voc&#xEA; entender a import&#xE2;ncia da Microsoft naquela &#xE9;poca, ela n&#xE3;o era s&#xF3; a dona do maior (e quase &#xFA;nico) SO usado em mais de 90% dos computadores, mas tamb&#xE9;m dona de quase todas as linguagens que criavam programas para esses computadores.</blockquote><p>Logo que a Netscape e a Sun fizeram um acordo onde a linguagem escolhida n&#xE3;o seria nenhuma das anteriores, mas sim o Java! E isso se tornou p&#xFA;blico no dia 23 de Maio de 1995 (eu tinha 1 m&#xEA;s de idade &#x1F476;).</p><p>Agora com tudo decidido, todas as demais linguagens foram descartadas por interesses comerciais, ou ent&#xE3;o pela dificuldade que seria integrar uma linguagem completa no navegador. N&#xE3;o haveria tempo suficiente para terminar a implementa&#xE7;&#xE3;o e lan&#xE7;ar no mercado antes da Microsoft lan&#xE7;ar seu navegador. E a linguagem que a Microsoft escolhesse para ser o par do Internet Explorer seria o que iria definir todo o padr&#xE3;o dali para frente.</p><p>A Microsoft tinha a faca e o queijo na m&#xE3;o, eles tinham o VBA que j&#xE1; era uma linguagem de scripting usada no Excel, tinham o conhecimento de como criar um browser e como criar uma linguagem, j&#xE1; tinham mercado, s&#xF3; faltava o produto. Ent&#xE3;o, Bill Joy (olha ele aparecendo de novo), o fundador da Sun sugeriu que a sa&#xED;da seria implementar uma &quot;pequena linguagem&quot; que faria par com o Java e complementaria a funcionalidade.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dri.es/files/images/blog/james-gosling.jpg" class="kg-image" alt="Backlog #3 - 29 anos de JavaScript!" loading="lazy" width="1022" height="681"><figcaption><span style="white-space: pre-wrap;">James Gosling, o criador do Java</span></figcaption></figure><p>As principais d&#xFA;vidas que surgiam na Netscape eram se o Java em si j&#xE1; n&#xE3;o era uma linguagem que poderia ser integrada, algo que claramente n&#xE3;o era poss&#xED;vel j&#xE1; que, para criar um programa em Java, voc&#xEA; precisava</p><ol><li>Colocar o corpo do programa em um m&#xE9;todo est&#xE1;tico chamado <code>main</code></li><li>Dentro de uma declara&#xE7;&#xE3;o de classe</li><li>Dentro de um pacote</li><li>Declarar tipos para todas as vari&#xE1;veis e retornos</li></ol><p>Isso n&#xE3;o era a experi&#xEA;ncia que a Netscape estava buscando para aquela galera que seria um &quot;scripter&quot;. A linguagem deveria ser muito mais simples, n&#xE3;o podia ser baseada em classes, nem ter tipos. Foi assim que Marc Andreessen prop&#xF4;s o codinome <strong>Mocha</strong> para a futura linguagem, na esperan&#xE7;a que ela fosse chamada &quot;<em>JavaScript&quot;</em> no futuro. Ela teria que &quot;se parecer com Java&quot;, ser f&#xE1;cil de user e &quot;baseada em objetos&quot; e n&#xE3;o em classes.</p><h2 id="mocha">Mocha</h2><p>O Java estava para ser lan&#xE7;ado, ent&#xE3;o o tempo era importante nesse contexto. Por isso que o <strong>mocha foi implementado em 10 dias cont&#xED;nuos em Maio de 1995.</strong> O fato mais famoso do JavaScript que, na verdade, &#xE9; distorcido, porque o Mocha era uma linguagem bem diferente do que o JavaScript se tornou. A implementa&#xE7;&#xE3;o em 10 dias foi o in&#xED;cio do que seria o JS, mas a implementa&#xE7;&#xE3;o no final desses dias era uma vers&#xE3;o crua, b&#xE1;sica e simples do que essa integra&#xE7;&#xE3;o poderia ser.</p><p>Tecnicamente, o Mocha continha um lexer escrito a m&#xE3;o e um parser recursivo. Esse parser emitia <a href="https://dev.to/_staticvoid/node-js-por-baixo-dos-panos-8-entendendo-bytecodes-jib?ref=blog.lsantos.dev">bytecodes</a>, algo que era necess&#xE1;rio para que o servidor do Netscape (chamado de LiveWire) pudesse entender as instru&#xE7;&#xF5;es. O resultado final era uma linguagem simples e muito lenta, mas fact&#xED;vel.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.rfox.eu/en/Programming/Series_about_Self/Environment_and_the_programming_language_Self_part_two_language/dict6.png" class="kg-image" alt="Backlog #3 - 29 anos de JavaScript!" loading="lazy" width="715" height="480"><figcaption><span style="white-space: pre-wrap;">O ambiente da linguagem Self</span></figcaption></figure><p>Foi aqui que a maioria das escolhas que <a href="https://x.com/_StaticVoid/status/1510709606569414663?ref=blog.lsantos.dev">todo mundo adora odiar</a> foram feitas. Como a linguagem tinha que parecer com Java, tudo que era mais parecido com VB foi removido, mas ao mesmo tempo &quot;parecer com Java&quot; fazia com que ela &quot;parece que funcionava como Java&quot;, o que n&#xE3;o era verdade. </p><p>A outra defini&#xE7;&#xE3;o explicita era que a linguagem tinha que ser t&#xE3;o f&#xE1;cil de usar, que ela poderia ser escrita diretamente no HTML. E a partir da&#xED;, Eich come&#xE7;ou a trabalhar nos outros pontos que tornariam o JS o que ele &#xE9; hoje, por exemplo:</p><ul><li><a href="https://medium.com/trainingcenter/heran%C3%A7a-e-prot%C3%B3tipos-no-javascript-2c1e60e005a2?ref=blog.lsantos.dev">Heran&#xE7;a protot&#xED;pica</a> veio de uma linguagem chamada Self</li><li>A ideia de High Order Functions e fun&#xE7;&#xF5;es como tipos de primeira classe veio do Lisp</li><li><code>this</code> veio diretamente do Java (que pegou do C++)</li><li>A ideia de cria&#xE7;&#xE3;o din&#xE2;mica de propriedades</li><li>O <code>Object</code> global de onde todos os demais tipos herdam</li><li>O <code>eval</code></li><li>O <code>var</code></li><li>Controles de fluxo emprestados do C</li></ul><p>A apresenta&#xE7;&#xE3;o do Mocha foi um sucesso e todos estavam otimistas com o lan&#xE7;amento de uma vers&#xE3;o mais completa e integrada do Mocha no Netscape 2, agendado para ser lan&#xE7;ado em Setembro daquele ano.</p><blockquote>O c&#xF3;digo fonte do Mocha est&#xE1; dispon&#xED;vel no <a href="https://github.com/m1t0s1s/netscape-communicator-3-0-2-source/tree/main/mocha/src?ref=blog.lsantos.dev">GitHub</a> com detalhe especial &#xE0; <a href="https://github.com/m1t0s1s/netscape-communicator-3-0-2-source/blob/ec144cc852e4cec98ba0114663b5f270c13c4ad7/mocha/src/mo_java.c?ref=blog.lsantos.dev#L59-L61">nomenclatura &quot;JavaScript&quot;</a> que o Netscape esperava que fosse adotado</blockquote><h2 id="java-com-script">Java (com script)</h2><p>O JavaScript foi lan&#xE7;ado no dia 4 de dezembro (ap&#xF3;s mais ou menos 7 meses de desenvolvimento) em uma confer&#xEA;ncia de imprensa como sendo uma &quot;linguagem de scripting com objetos&quot; que seria usada para escrever scripts que iriam &quot;modificar dinamicamente as propriedades e objetos Java&quot; e serviria como um complemento ao Java na Web.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/12/image.png" class="kg-image" alt="Backlog #3 - 29 anos de JavaScript!" loading="lazy" width="679" height="501"><figcaption><span style="white-space: pre-wrap;">Figura 2 do paper demonstrando um console para o Mocha</span></figcaption></figure><p>Antes de o JavaScript ser chamado de JavaScript, ele foi aberto ao p&#xFA;blico em um beta aberto do Netscape 2 sob o nome de LiveScript (por conta do LiveWire) em Setembro de 95, e 1 m&#xEA;s depois transformado em JavaScript para criar uma marca forte entre o Java e a Netscape.</p><p>O JavaScript n&#xE3;o era para ser nenhum tipo de grande linguagem, nem ter muitas features lan&#xE7;adas, tanto que as funcionalidades da linguagem foram severamente cortadas e o JavaScript 1.0 foi lan&#xE7;ado com todas as funcionalidades que estavam &quot;praticamente prontas&quot;, inclusive com muitos bugs que foram corrigidos durante o desenvolvimento.</p><p>Quando ele foi entrevistado em 1996, Brendan Eich disse que ele queria que a a linguagem continuasse pequena e continuasse ub&#xED;qua na Web como a melhor forma de &quot;grudar&quot; elementos HTML e a&#xE7;&#xF5;es uns nos outros e tamb&#xE9;m conectar esses componentes com Java Applets, que seria o resto do ecossistema. Tanto que ele falava que um dos exemplos de uso do JS era &quot;criar um link que mudava de acordo com a hora do dia&quot;.</p><p>O JavaScript teve um rival chamado JScript, a vers&#xE3;o do JavaScript da Microsoft, que come&#xE7;ou com Robert Welland no time do IE, mas antes trabalhou na Apple com o suporte para o Apple Newton (um tipo de PalmTop) com o NewtonScript, que era uma linguagem tamb&#xE9;m baseada em objetos tamb&#xE9;m influenciada pelo Self. E a Microsoft teve uma sacada interessante que foi criar um <em>debugger</em> para JavaScript embutido no IE, algo que o pr&#xF3;prio Netscape n&#xE3;o tinha. Al&#xE9;m de que eles perceberam que o IE n&#xE3;o seria nada se ele n&#xE3;o tivesse compatibilidade completa com os sites que o Netscape apresentava. E isso levou o JScript e o IE a fazer uma engenharia reversa do Netscape para tentar fazer com que ambos estejam mais ou menos parecidos.</p><h2 id="ecmascript-e-atualidade">ECMAScript e atualidade</h2><p>O JavaScript estava claramente ganhando a corrida dos browsers, e ter duas linguagens diferentes n&#xE3;o era uma coisa legal. A falta de uma especifica&#xE7;&#xE3;o, de um padr&#xE3;o, era um grande problema. Al&#xE9;m disso, quando o projeto do Mocha come&#xE7;ou em 1995 j&#xE1; era claro que uma especifica&#xE7;&#xE3;o iria precisar ser feita para que fosse poss&#xED;vel a interoperabilidade com toda a Web.</p><p>Por isso tanto a Sun quanto a Netscape planejaram propor uma especifica&#xE7;&#xE3;o para o W3C e a IETF. Mas nem uma nem a outra eram boas para ter uma especifica&#xE7;&#xE3;o independente de uma marca, a IETF focava em protocolos, a W3C n&#xE3;o queria ter uma linguagem pr&#xF3;pria porque isso ia contra os prop&#xF3;sitos da organiza&#xE7;&#xE3;o. Mas a necessidade n&#xE3;o era s&#xF3; para ter um padr&#xE3;o, mas tamb&#xE9;m porque a Microsoft estava pressionando para ter o VB como linguagem padr&#xE3;o, ent&#xE3;o ter uma especifica&#xE7;&#xE3;o formal iria ajudar o JavaScript a se estabelecer como uma linguagem s&#xE9;ria.</p><p>Foi ai que Carl Cargill, um especialista em especifica&#xE7;&#xF5;es trabalhando para Netscape, colocou a empresa em contato com a ECMA International e prop&#xF4;s que a ECMA tomasse o controle da especifica&#xE7;&#xE3;o. Ent&#xE3;o, no dia 4 de Novembro de 1996 a ECMA montou uma reuni&#xE3;o para definir o comit&#xEA; t&#xE9;cnico (Technical Committee, ou TC) de n&#xFA;mero 39, o TC39. Se houvesse interesse suficiente, esse comit&#xEA; seria efetivado. O que aconteceu, e a primeira reuni&#xE3;o do TC39 aconteceu no dia 21 de Novembro do mesmo ano.</p><p>Eu tenho um v&#xED;deo explicando como o TC39 funciona se voc&#xEA; estiver interessado!</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/hDQu3AvvDfg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Como o JavaScript Evolui"></iframe></figure><p>O resto dessa hist&#xF3;ria &#xE9; bastante conhecida, mas existem muitos detalhes interessantes que, infelizmente, v&#xE3;o ficar de fora desse texto. Mas, a partir da&#xED;, o JavaScript teve v&#xE1;rias evolu&#xE7;&#xF5;es desde a primeira especifica&#xE7;&#xE3;o, mas o que fez do JS a linguagem mais conhecida foi a chegada do Node em 2009 que transformou o ecossistema da Web e fez com que o JavaScript tivesse uma ado&#xE7;&#xE3;o astron&#xF4;mica, incluindo novas especifica&#xE7;&#xF5;es e evolu&#xE7;&#xF5;es da linguagem que transformaram o JavaScript no que a gente conhece hoje.</p><p>Mas essa &#xE9; uma hist&#xF3;ria para outro Backlog!</p><p>Muito obrigado por chegar at&#xE9; aqui, e te vejo na pr&#xF3;xima edi&#xE7;&#xE3;o!</p>]]></content:encoded></item><item><title><![CDATA[Backlog #2 - Trabalhar duro não vai te levar tão longe]]></title><description><![CDATA[O talento é um mito, trabalho e esforço não são nada sem contexto. Nessa edição, vamos explorar porque o sucesso é pura sorte, ou quase...]]></description><link>https://blog.lsantos.dev/backlog-2/</link><guid isPermaLink="false">673f9dc8f7d8d0d665f98455</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[opinion]]></category><category><![CDATA[career]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Thu, 28 Nov 2024 11:00:38 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/articles-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/articles-2.png" alt="Backlog #2 - Trabalhar duro n&#xE3;o vai te levar t&#xE3;o longe"><p>E se eu te falasse que sucesso &#xE9; pura sorte? Que o m&#xEA;s que voc&#xEA; nasceu pode ter feito a diferen&#xE7;a entre voc&#xEA; ser super rico ou n&#xE3;o? Nessa edi&#xE7;&#xE3;o, vamos discutir sobre por que o <strong>sucesso &#xE9; pura sorte, ou quase...</strong></p><p>H&#xE1; alguns meses eu terminei de ler um dos livros mais interessantes que eu j&#xE1; li, <strong>Outliers</strong> (ou <strong>Fora de S&#xE9;rie</strong>) por Malcolm Gladwell, que tamb&#xE9;m &#xE9; autor de outros livros como &quot;Blink&quot; e &quot;O Ponto da Virada&quot;. No geral, ele sempre toca em assuntos sobre carreira e ideias que a gente n&#xE3;o costuma pensar tanto no dia-a-dia. Nesse em espec&#xED;fico ele foca em uma quest&#xE3;o:</p><blockquote class="kg-blockquote-alt">Por que alguns tem sucesso, e outros n&#xE3;o?</blockquote><h2 id="o-mito-do-talento">O Mito do Talento</h2><p>Desde pequeno eu ouvi que &quot;quem trabalha duro e se esfor&#xE7;a consegue tudo&quot;, que &quot;determina&#xE7;&#xE3;o &#xE9; a chave do sucesso&quot;, ou at&#xE9; mesmo que eu tinha &quot;talento&quot; para alguma coisa. Mas a realidade &#xE9; que isso tudo n&#xE3;o passa de uma hist&#xF3;ria para fazer a gente se sentir bem com a gente mesmo. Ou ser&#xE1; que n&#xE3;o?</p><p>A realidade &#xE9; que talento como um todo &#xE9; algo muito superestimado. Por exemplo, a gente tende a louvar pessoas que tem um talento incr&#xED;vel, um jogador de futebol, um guitarrista, um artista pl&#xE1;stico. Mas, enquanto o talento &#xE9; sim importante para que essas pessoas chegassem onde chegaram, ele n&#xE3;o &#xE9; tudo. Elas provavelmente n&#xE3;o teriam tanto sucesso quanto elas tiveram tendo talento, mas continuariam tendo sucesso da mesma forma sem ele. Eu chamo isso de &quot;o mito do talento&quot;.</p><blockquote class="kg-blockquote-alt">Talento como um todo &#xE9; algo muito superestimado.</blockquote><p>Outliers &#xE9; o livro que popularizou o conceito de que voc&#xEA; precisa aplicar 10.000 horas de pr&#xE1;tica para ser um mestre no que seja que voc&#xEA; est&#xE1; fazendo. E isso &#xE9; totalmente verdade, para que voc&#xEA; seja realmente bom em algo, voc&#xEA; precisa de <strong>muita</strong> pr&#xE1;tica deliberada. E isso tamb&#xE9;m &#xE9; uma das m&#xE9;tricas para o sucesso.</p><p>Ou voc&#xEA; acha que os Beatles come&#xE7;aram e j&#xE1; foram um sucesso logo de cara?</p><p>A hist&#xF3;ria dos Beatles, contada no livro, diz que, durante os primeiros anos de banda, eles se encontraram com um empres&#xE1;rio que conseguiu diversos shows para eles em Hamburgo. A casa de shows que eles tocavam era um local que precisava de uma atra&#xE7;&#xE3;o que ficasse tocando durante a madrugada inteira, como iniciantes eles viram a oportunidade perfeita de n&#xE3;o s&#xF3; construir um repert&#xF3;rio fazendo covers, mas tamb&#xE9;m testar m&#xFA;sicas pr&#xF3;prias, al&#xE9;m de ganhar experi&#xEA;ncia de palco e condicionamento para longos shows.</p><p>Quando os Beatles estouraram, eles j&#xE1; tinham feito mais de 1200 shows somente naquele bar em Hamburgo, quase 9600 horas tocando sem parar as mais diversas m&#xFA;sicas para os mais diversos p&#xFA;blicos. Isso os colocou em contato com muitas pessoas que j&#xE1; conheciam a banda, al&#xE9;m de outros administradores e empres&#xE1;rios que tinham outros contatos para outros shows.</p><p>A hist&#xF3;ria dos Beatles mostra que talento sozinho n&#xE3;o basta. Mesmo sendo m&#xFA;sicos excepcionais, sem os 1200 shows em Hamburgo, eles n&#xE3;o teriam a experi&#xEA;ncia ou os contatos necess&#xE1;rios para alcan&#xE7;ar o sucesso. Voc&#xEA; precisa sim colocar um grande esfor&#xE7;o, mas muito depende do quanto voc&#xEA; est&#xE1; preparado quando a hora chegar.</p><blockquote class="kg-blockquote-alt">Talento importa, mas o contexto &#xE9; essencial</blockquote><p>O talento &#xE9; uma mistura de v&#xE1;rios fatores, muitos deles ligados a fatores externos que voc&#xEA; n&#xE3;o tem como controlar, como:</p><ul><li>Contexto hist&#xF3;rico</li><li>Heran&#xE7;a cultural</li><li>Oportunidades</li></ul><p>Ou at&#xE9; mesmo coisas que parecem sorte aleat&#xF3;ria. Talento e trabalho duro com certeza importam, mas s&#xE3;o amplificados quando voc&#xEA; atende a outras condi&#xE7;&#xF5;es, e essa n&#xE3;o &#xE9; a &#xFA;nica hist&#xF3;ria que eu tenho pra te contar. Como uma das pessoas mais ricas do mundo aproveitou suas oportunidades para se tornar quem se tornou.</p><h1 id="pausa-para-um-aviso">Pausa para um aviso!</h1><blockquote>Essa newsletter s&#xF3; &#xE9; poss&#xED;vel atrav&#xE9;s da ajuda da comunidade e dos patrocinadores!</blockquote><p>Essa em particular &#xE9; patrocinada pela <strong>Remessa Online!</strong> Se voc&#xEA; trabalha com tecnologia, com certeza j&#xE1; precisou trazer algum dinheiro de fora para o Brasil, e as taxas s&#xE3;o SUPER ALTAS &#x1F62D; Por isso a Remessa &#xE9; a melhor forma de fazer isso com a menor taxa do mercado! E ELES EST&#xC3;O COM PROMO&#xC7;&#xC3;O DE BLACK FRIDAY!</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/logo-2-corte.png" class="kg-image" alt="Backlog #2 - Trabalhar duro n&#xE3;o vai te levar t&#xE3;o longe" loading="lazy" width="300" height="114"></figure><p>A campanha <strong>Black&amp;Blue</strong> da Remessa Online &#xE9; realmente uma das campanhas mais interessantes que eu j&#xE1; vi! Eles n&#xE3;o v&#xE3;o s&#xF3; te dar desconto, eles te d&#xE3;o dinheiro! Dos dias 25 a 29 de Novembro voc&#xEA; pode usar o meu cupom <strong>BFLUCASSANTOS</strong> para ganhar mais <strong>R$0,03</strong> no c&#xE2;mbio para recebimentos de transfer&#xEA;ncias internacionais e uma redu&#xE7;&#xE3;o do mesmo valor para envios de pagamento, ent&#xE3;o seu dinheiro vale, literalmente, mais!</p><p>&#x1F449; <a href="https://lsantos.dev/remessa-online?ref=blog.lsantos.dev">Clica aqui pra transferir com a menor taxa do mercado!</a></p><p>&#x1F31F; <strong>Quer fazer parte desse sonho comigo?</strong> Trazer essa newsletter ao mundo &#xE9; algo que sempre quis fazer, e ver o projeto crescer com o apoio de voc&#xEA;s seria incr&#xED;vel! Se voc&#xEA; tem uma marca ou produto que se conecta com essa comunidade, manda um e-mail para <a rel="noopener"><strong>hello@lsantos.dev</strong></a>. Vou adorar conversar sobre como voc&#xEA; pode apoiar essa jornada!</p><p>&#x1F499; <strong>Apoie o meu trabalho</strong>: Se voc&#xEA; gosta do conte&#xFA;do e quer dar uma for&#xE7;a, mesmo com apenas R$1, isso j&#xE1; faz toda a diferen&#xE7;a! <a href="https://github.com/sponsors/khaosdoctor?ref=blog.lsantos.dev">Clique aqui</a> para contribuir mensalmente ou fazer uma doa&#xE7;&#xE3;o &#xFA;nica. Cada <a href="https://github.com/sponsors/khaosdoctor?ref=blog.lsantos.dev">apoio</a> me ajuda a manter essa newsletter viva e a fazer dela algo especial. Muito obrigado por estar aqui e por acreditar nesse sonho comigo!</p><h2 id="a-sorte-no-sucesso">A sorte no sucesso</h2><p>Voc&#xEA; est&#xE1; lendo essa newsletter agora, provavelmente gosta de computadores (ou voc&#xEA; n&#xE3;o iria me conhecer), ent&#xE3;o voc&#xEA; deve conhecer <a href="https://en.wikipedia.org/wiki/Bill_Gates?ref=blog.lsantos.dev">Bill Gates</a>. O Co-Fundador da Microsoft, a maior empresa de softwares do mundo (e meu ex-chefe), j&#xE1; foi o homem mais rico do mundo e continua nessa lista at&#xE9; hoje. E se eu te disser que tudo isso foi sorte? Claro, o talento estava l&#xE1;, mas a sorte foi o principal fator para o seu sucesso. O livro tamb&#xE9;m conta a sua hist&#xF3;ria.</p><blockquote class="kg-blockquote-alt">Fatores externos moldam a sua vida, mesmo que voc&#xEA; n&#xE3;o tenha nenhum poder sobre eles</blockquote><p>O ano em que voc&#xEA; nasceu pode determinar muito sobre sua trajet&#xF3;ria. Eu, por exemplo, nasci em 1995. Se tivesse nascido 10 anos mais tarde, teria perdido a explos&#xE3;o dos computadores e da internet. Dez anos mais cedo, talvez nunca tivesse entrado na &#xE1;rea de tecnologia. Meu momento me deu vantagens espec&#xED;ficas, como aprender a trabalhar bem sem internet e lidar com coisas anal&#xF3;gicas. E o mesmo aconteceu com o tio Bill.</p><p>Bill Gates nasceu em 1955, na &#xE9;poca perfeita para aproveitar a revolu&#xE7;&#xE3;o dos computadores pessoais dos anos 70. Se tivesse nascido 10 anos antes, seria velho demais. Dez anos depois, novo demais. Gates tamb&#xE9;m teve sorte de estudar na Lakeside School, uma escola particular de elite que, em 1968, adquiriu um terminal de computador. L&#xE1;, ele come&#xE7;ou a programar jovem e j&#xE1; acumulando suas 10.000 horas de pr&#xE1;tica</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://i.insider.com/5a1c67373dbef4a7748b7fb5?width=700" class="kg-image" alt="Backlog #2 - Trabalhar duro n&#xE3;o vai te levar t&#xE3;o longe" loading="lazy" width="700" height="525"><figcaption><span style="white-space: pre-wrap;">Escola Lakeside em Washington</span></figcaption></figure><p>Al&#xE9;m disso, outra coincid&#xEA;ncia improv&#xE1;vel &#xE9; que, se voc&#xEA; lembrar <a href="https://blog.lsantos.dev/backlog-1-o-primeiro-pc-de-todos/">da &#xFA;ltima edi&#xE7;&#xE3;o</a>, na &#xE9;poca os computadores usavam tempo compartilhado, ou seja, eles eram conectados a um mainframe pr&#xF3;ximo. </p><p>Por morar pr&#xF3;ximo &#xE0; Universidade de Washington, que tinha um mainframe e terminais dispon&#xED;veis para uso noturno. Ele passava madrugadas programando, gra&#xE7;as a pais compreensivos que o deixavam ficar fora at&#xE9; tarde. O esfor&#xE7;o contou, mas o contexto foi essencial.</p><p>Se ele tivesse a oportunidade e n&#xE3;o tivesse programado durante madrugadas, nada teria acontecido, foi a vis&#xE3;o de entender que essa era uma oportunidade e agarrar essa oportunidade que fez a diferen&#xE7;a.</p><blockquote class="kg-blockquote-alt">N&#xE3;o &#xE9; sobre esfor&#xE7;o individual, &#xE9; sobre o contexto desse esfor&#xE7;o</blockquote><p>Para coroar, aos 16 anos, ele ainda teve a oportunidade de trabalhar na TRW, ao lado de engenheiros experientes, em um projeto de software. Essa experi&#xEA;ncia o colocou anos &#xE0; frente da maioria dos estudantes de sua gera&#xE7;&#xE3;o. Tudo isso culminou na cria&#xE7;&#xE3;o do interpretador BASIC para o Altair 8800, junto com Paul Allen. Se tivesse nascido 5 ou 10 anos depois, nada disso teria acontecido.</p><p>O ponto n&#xE3;o &#xE9; diminuir o esfor&#xE7;o ou talento dele, mas destacar que ele soube aproveitar um contexto de oportunidades &#xFA;nicas.</p><blockquote>Eu n&#xE3;o estou dizendo que esfor&#xE7;o &#xE9; in&#xFA;til, ou que talento n&#xE3;o conta, mas dizendo que talento e esfor&#xE7;o sem aproveitar a oportunidades n&#xE3;o vale nada</blockquote><p>Uma outra hist&#xF3;ria parecida &#xE9; a de <a href="https://en.wikipedia.org/wiki/Bill_Joy?ref=blog.lsantos.dev">Bill Joy</a>, criador do Vi (hoje Vim) e co-fundador da Sun Microsystems, que eu vou contar com mais detalhes em uma edi&#xE7;&#xE3;o futura do Backlog. Ele tamb&#xE9;m foi extremamente talentoso, mas muito gra&#xE7;as ao local onde ele estava e ao momento que ele viveu. Mas, e se o talento realmente n&#xE3;o importasse?</p><h2 id="por-que-o-arroz-importa">Por que o arroz importa?</h2><p>At&#xE9; agora, vimos como o talento foi importante, mas n&#xE3;o decisivo, para algumas hist&#xF3;rias de sucesso. Por&#xE9;m, existem casos em que o talento realmente n&#xE3;o tem nada a ver com o sucesso ou habilidades de algu&#xE9;m.</p><p>Por exemplo, h&#xE1; um estere&#xF3;tipo de que pessoas asi&#xE1;ticas s&#xE3;o &#xF3;timas em matem&#xE1;tica. Mas e se eu te dissesse que isso tem mais a ver com arroz do que com gen&#xE9;tica?</p><blockquote class="kg-blockquote-alt">Os agricultores asi&#xE1;ticos trabalhavam 3000 horas por ano versus as 1200 horas de um europeu m&#xE9;dio</blockquote><p>Durante s&#xE9;culos, o cultivo de arroz foi o principal pilar econ&#xF4;mico e cultural em partes da &#xC1;sia, especialmente na China. Diferente de outros cultivos, plantar arroz exige aten&#xE7;&#xE3;o constante o ano todo: a quantidade certa de solo sobre a semente, o nivelamento perfeito do terreno e o controle preciso da irriga&#xE7;&#xE3;o. Sistemas complexos de alagamento e drenagem precisavam ser ajustados regularmente, tornando o cultivo um processo incrivelmente meticuloso e trabalhoso. Ent&#xE3;o o trabalho duro est&#xE1; ali, eles est&#xE3;o fazendo todos os dias</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://media.istockphoto.com/id/109724079/es/foto/plantaci%C3%B3n-de-arroz.jpg?s=612x612&amp;w=0&amp;k=20&amp;c=8u27-T07pMkA-ztKaya2oUyRJj_L36YnII5Io7jEXak=" class="kg-image" alt="Backlog #2 - Trabalhar duro n&#xE3;o vai te levar t&#xE3;o longe" loading="lazy" width="612" height="405"><figcaption><span style="white-space: pre-wrap;">Um Arrozal</span></figcaption></figure><p>Os agricultores asi&#xE1;ticos trabalhavam, em m&#xE9;dia, 3.000 horas por ano, enquanto os europeus, 1.200. O cultivo de arroz era meticuloso e exigia esfor&#xE7;o constante &#x2014; desistir n&#xE3;o era uma op&#xE7;&#xE3;o, ou ningu&#xE9;m comeria. Essa cultura de esfor&#xE7;o intenso, precis&#xE3;o e foco no longo prazo foi passada de gera&#xE7;&#xE3;o em gera&#xE7;&#xE3;o, criando um legado que persiste at&#xE9; hoje.</p><blockquote class="kg-blockquote-alt">E essa persist&#xEA;ncia e foco em resolver quest&#xF5;es dif&#xED;ceis faz com que essa galera n&#xE3;o desista f&#xE1;cil, e persista mesmo quando tudo parece dar errado.</blockquote><p>E &#xE9; por isso que eles s&#xE3;o melhores em matem&#xE1;tica, porque &#xE9; algo que exige resili&#xEA;ncia, esfor&#xE7;o, voc&#xEA; n&#xE3;o pode desistir porque est&#xE1; com um problema dif&#xED;cil. Essas coisas precisam de tempo, esfor&#xE7;o. &#xC9; essa caracter&#xED;stica que o arroz proporcionou para essa cultura: a persist&#xEA;ncia.</p><p>Enquanto na maioria do mundo ocidental as crian&#xE7;as e adolescentes tendem a abandonar uma tarefa dif&#xED;cil ap&#xF3;s 5 minutos em m&#xE9;dia sem conseguir progresso, as crian&#xE7;as orientais tendem a se esfor&#xE7;ar por pelo menos 30 minutos, seis vezes mais. E essa persist&#xEA;ncia e foco em resolver quest&#xF5;es dif&#xED;ceis faz com que essa galera n&#xE3;o desista f&#xE1;cil, e persista mesmo quando tudo parece dar errado.</p><p>Isso n&#xE3;o tem nada a ver com talento, mas sim com uma <strong>heran&#xE7;a cultural</strong> que &#xE9; passada se voc&#xEA; nasceu em um determinado local, e apenas ali. Nesse caso &#xE9; uma caracter&#xED;stica positiva, mas e se essa heran&#xE7;a fosse o maior problema da sua vida?</p><h2 id="o-preconceito-como-oportunidade">O preconceito como oportunidade</h2><p>Uma outra hist&#xF3;ria contada no livro &#xE9; como o preconceito contra estrangeiros acabou por transformar esses estrangeiros em advogados de sucesso. E como coisas completamente fora do seu controle, como sua heran&#xE7;a racial, podem ser decisivas para sua hist&#xF3;ria.</p><blockquote class="kg-blockquote-alt">Se voc&#xEA; fosse filho de imigrantes do Leste Europeu voc&#xEA; sofreria preconceito</blockquote><p>Na d&#xE9;cada de 1940, o mercado jur&#xED;dico nos EUA era dominado por grandes escrit&#xF3;rios tradicionais, que recrutavam apenas advogados de fam&#xED;lias protestantes ricas, formados em universidades de prest&#xED;gio como Harvard ou Yale. Filhos de imigrantes do Leste Europeu, em sua maioria judeus, enfrentavam preconceito por n&#xE3;o serem t&#xE3;o ricos e, mesmo com boas forma&#xE7;&#xF5;es, eram exclu&#xED;dos desses escrit&#xF3;rios.</p><p>Sem acesso &#xE0;s &#xE1;reas tradicionais, esses advogados se especializaram em campos menos prestigiados na &#xE9;poca, como lit&#xED;gios corporativos e fus&#xF5;es e aquisi&#xE7;&#xF5;es &#x2014; &#xE1;reas vistas como &#x201C;sujas&#x201D; e evitadas pelos grandes escrit&#xF3;rios. Para eles, essas pr&#xE1;ticas eram as &#xFA;nicas oportunidades dispon&#xED;veis, mas tamb&#xE9;m o in&#xED;cio de algo muito maior.</p><blockquote class="kg-blockquote-alt">Sorte &#xE9; estar preparado quando a hora chegar</blockquote><p>Por&#xE9;m, na d&#xE9;cada de 1970, o mercado mudou completamente. Fus&#xF5;es e aquisi&#xE7;&#xF5;es se tornaram extremamente lucrativas, e, de repente, o mercado jur&#xED;dico precisava de especialistas. Os melhores? Justamente os advogados judeus, que tinham mais de uma d&#xE9;cada de experi&#xEA;ncia nessas &#xE1;reas negligenciadas.</p><p>Essa exclus&#xE3;o inicial, fora do controle deles, os for&#xE7;ou a se especializar em um campo que mais tarde se tornou central no direito corporativo. Sem essa barreira, talvez tivessem seguido caminhos convencionais e nunca se destacado como l&#xED;deres. Preconceito nunca &#xE9; algo positivo, mas essa hist&#xF3;ria mostra como situa&#xE7;&#xF5;es adversas podem, inesperadamente, abrir portas para novas oportunidades.</p><blockquote class="kg-blockquote-alt">E isso n&#xE3;o tem NADA A VER com talento</blockquote><p>Se a gente fizer a transposi&#xE7;&#xE3;o dessa mesma ideia para os dias de hoje, tirando a parte de ser algo &quot;sujo&quot;, os antigos engenheiros de Machine Learning e IA que antes eram considerados como &#xE1;reas &quot;descart&#xE1;veis&quot; ou &quot;de pouca import&#xE2;ncia&quot; agora se tornaram indispens&#xE1;veis para uma gera&#xE7;&#xE3;o que depende cada vez mais deles.</p><p>Do mesmo jeito que essas hist&#xF3;rias mostram como coisas aparentemente sem import&#xE2;ncia podem virar oportunidades incr&#xED;veis, minha trajet&#xF3;ria tamb&#xE9;m teve um pouco disso.</p><h2 id="a-minha-hist%C3%B3ria">A Minha Hist&#xF3;ria</h2><p>Para finalizar essa edi&#xE7;&#xE3;o, eu quero contar um pouco do que eu acho que minha hist&#xF3;ria tem a ver com isso. E eu acho que &#xE9; at&#xE9; um pouco parecida com a hist&#xF3;ria de outros como Bill Gates (s&#xF3; um tiquinho menor).</p><blockquote class="kg-blockquote-alt">Desde pequeno eu tive contato constante com hardware, software</blockquote><p>Nasci em 1995 e tive muita sorte de crescer em um ambiente curioso e cheio de experimenta&#xE7;&#xE3;o, gra&#xE7;as aos meus pais, especialmente meu pai. Ele tinha uma locadora de VHS e usava um computador para fazer as planilhas, o que me deu contato constante com tecnologia desde pequeno.</p><p>Meu pai era super autodidata e consertava tudo sozinho &#x2014; l&#xE2;mpadas, cabos, chuveiros &#x2014; e eu estava sempre por perto, absorvendo tudo. Com o tempo, essa curiosidade virou aprendizado. Aos 6 anos, eu j&#xE1; desmontava e montava computadores (&#xE0;s vezes pra limpar as pe&#xE7;as da locadora) e sabia identificar resistores, transistores e capacitores &#x2014; mesmo sem entender exatamente pra que serviam. Esse contato precoce com hardware e software foi uma vantagem enorme que pouca gente teve.</p><blockquote class="kg-blockquote-alt">Com 6 anos eu conseguia montar e desmontar computadores</blockquote><p>Nas d&#xE9;cadas de 2000, no boom da Internet e dos computadores, eu j&#xE1; estava mexendo com m&#xE1;quinas desde cedo, mas ainda era novo pra conseguir um emprego. Quando entrei na escola t&#xE9;cnica, j&#xE1; dominava boa parte do que era ensinado, o que facilitou muito minha vida na hora de buscar trabalho.</p><p>Um dia, em um evento que, digamos, n&#xE3;o era exatamente popular com a galera descolada, me ofereceram uma bolsa em uma escola de design &#x2014; algo que eu sempre quis aprender. Decidi come&#xE7;ar o curso, e foi a&#xED; que rolou a primeira coincid&#xEA;ncia. L&#xE1;, conheci algu&#xE9;m que me conectou ao meu primeiro emprego de verdade, onde fiquei por 5 anos, mesmo sem ter faculdade ou forma&#xE7;&#xE3;o formal na &#xE1;rea. Eu nunca fiz um est&#xE1;gio.</p><blockquote class="kg-blockquote-alt">Nos 3 anos seguintes eu acumulei experi&#xEA;ncias que poucos na minha faculdade possu&#xED;am</blockquote><p>Quando entrei na faculdade, j&#xE1; trabalhava como desenvolvedor h&#xE1; mais de 2 anos nessa consultoria, o lugar perfeito pra aprender, j&#xE1; que eu lidava com diferentes clientes quase toda semana. Nos 3 anos seguintes, acumulei mais experi&#xEA;ncias do que em anos na &#xE1;rea, algo que poucos colegas tinham, porque enquanto eles s&#xF3; estudavam, eu fazia os dois &#x2013; ao custo da minha sa&#xFA;de, infelizmente.</p><p>Quando me tornei desenvolvedor s&#xEA;nior, eu tinha 24 anos, e tinha 6 anos de experi&#xEA;ncia. Eu j&#xE1; palestrava e compartilhava o que sabia &#x2014; em parte pra n&#xE3;o esquecer &#x2014; isso me conectou com muitas pessoas e abriu ainda mais portas.</p><p>N&#xE3;o me considero um programador excepcional, nem extremamente talentoso. Eu s&#xF3; estava no lugar certo, na hora certa, com as habilidades certas para o momento. Uma mistura de trabalho duro, sorte e contexto. Novamente, <strong>nunca</strong> &#xE9; s&#xF3; talento.</p><p>A pergunta final que eu deixo pra voc&#xEA; &#xE9; o seguinte:</p><blockquote class="kg-blockquote-alt">Como pode aproveitar as oportunidades ao seu redor para transformar seu contexto em sucesso?</blockquote>]]></content:encoded></item><item><title><![CDATA[Backlog #1 - O primeiro PC da história!]]></title><description><![CDATA[Vamos explorar a história da computação dentro da nossa história! Pra começar, qual foi o primeiro computador pessoal do mundo?]]></description><link>https://blog.lsantos.dev/backlog-1-o-primeiro-pc-de-todos/</link><guid isPermaLink="false">6730d1a8a7c8a32b5e77d619</guid><category><![CDATA[backlog-newsletter]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Thu, 14 Nov 2024 11:00:54 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/articles.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/articles.png" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!"><p>Ol&#xE1; e seja bem vindo(a) a mais uma edi&#xE7;&#xE3;o do <strong>Backlog!</strong> A newsletter onde eu destilo tudo que eu gostaria de falar sobre t&#xF3;picos que eu acho muito interessantes! </p><p>Hoje a gente vai conversar sobre um dos assuntos que eu mais gosto: <em>hist&#xF3;ria!</em> <strong>Voc&#xEA; sabe qual foi o PC que provavelmente deu origem a todos os computadores pessoais da hist&#xF3;ria?</strong></p><h1 id="computadores-e-pessoas"><strong>Computadores e pessoas</strong></h1><p>Voc&#xEA; agora est&#xE1; lendo essa newsletter no seu computador, no seu celular, no seu video game (quem sabe?), a gente muitas vezes nem p&#xE1;ra para pensar como chegamos aqui, para a maioria de n&#xF3;s (eu com certeza) quando nascemos, o computador j&#xE1; existia, as pessoas j&#xE1; conheciam o conceito do <strong>computador pessoal</strong>, mas isso nem sempre foi assim.</p><p>Os primeiros computadores do mundo foram criados na d&#xE9;cada de 1940 com o &#xFA;nico objetivo de quebrar cifras alem&#xE3;s na segunda guerra, o primeiro computador program&#xE1;vel do mundo foi o Colossus, constru&#xED;do em 1944, ele ocupava uma sala inteira e era composto de mais de 2500 v&#xE1;lvulas, al&#xE9;m de milhares de rel&#xEA;s eletromec&#xE2;nicos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.computerhistory.org/timeline/timeline_computers_1944.colossus.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="800" height="545"><figcaption><span style="white-space: pre-wrap;">Colossus operando em Bletchley Park (fonte: CHM - 1944)</span></figcaption></figure><blockquote>Eu vou falar do Colossus nas pr&#xF3;ximas edi&#xE7;&#xF5;es. Eu recentemente fui at&#xE9; l&#xE1; em Bletchley Park (olhem meus highlights no <a href="https://instagram.lsantos.dev/?ref=blog.lsantos.dev" rel="noreferrer">instagram</a>) e eu vi esse computador eu mesmo, nessa mesma sala da foto.</blockquote><p>Ao longo dos anos eles foram ficando cada vez menores, por&#xE9;m n&#xE3;o o suficiente para podermos chamar de um computador port&#xE1;til. A pr&#xF3;xima itera&#xE7;&#xE3;o de um computador &#xFA;til, o ENIAC, ocupava 3 andares de um pr&#xE9;dio e pesava 30 toneladas, isso n&#xE3;o &#xE9; necessariamente algo interessante para o p&#xFA;blico, mas tudo bem! Porque...</p><blockquote class="kg-blockquote-alt">Ningu&#xE9;m precisava de um computador!</blockquote><p>Por que algu&#xE9;m iria precisar de um computador? Naquela &#xE9;poca, eles eram complexos demais e serviam a tarefas espec&#xED;ficas. Tanto &#xE9; que todos os computadores at&#xE9; ent&#xE3;o n&#xE3;o tinham nenhum tipo de entrada de dados, como um teclado ou mouse, isso aconteceu BEM DEPOIS, eles eram operados por alavancas e patch boards</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.computerhistory.org/timeline/timeline_computers_1950.seac-swac.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="800" height="550"><figcaption><span style="white-space: pre-wrap;">O painel de controle de um SEAC (fonte: CHM - 1951)</span></figcaption></figure><h2 id="personal-computers">Personal computers</h2><p>Nos final dos anos 50 os computadores reduziram um pouco de tamanho. Esses computadores eram os considerados &quot;personal computers&quot;, porque precisavam de somente uma pessoa para operar, enquanto os anteriores precisavam de v&#xE1;rias e, geralmente, um local refrigerado especial onde pudessem ficar. Perto de 1960, o Librascope LGP-30 foi o primeiro computador &quot;pessoal&quot; que tinha um input humano ou uma HID (Human Interface Device), que era uma m&#xE1;quina de escrever. Ele exigia menos operadores e uma instala&#xE7;&#xE3;o mais simples.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.computerhistory.org/timeline/timeline_computers_1956.lgp30.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="800" height="600"><figcaption><span style="white-space: pre-wrap;">Librescope LGP-30 (fonte: CHM 1957)</span></figcaption></figure><p>Muitos anos depois em 1965, a IBM lan&#xE7;a uma linha de computadores chamado IBM System/360, ainda focado em empresas, ele foi um dos primeiros a ter um software &#xFA;nico para todas as m&#xE1;quinas, al&#xE9;m de v&#xE1;rios perif&#xE9;ricos, provando que todo funcion&#xE1;rio poderia usar o computador, com menos treinamento do que antes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.computerhistory.org/timeline/timeline_computers_1964.ibm360.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="800" height="600"><figcaption><span style="white-space: pre-wrap;">Um System/360, todo o resto s&#xE3;o HDs (fonte: CHM 1965)</span></figcaption></figure><blockquote>O IBM System/360 modelo 40 era um dos menores mainframes da &#xE9;poca, ele &quot;s&#xF3;&quot; ocupava uma sala de aula e podia custar mais de $300.000 d&#xF3;lares (de 1965)</blockquote><hr><h1 id="pausa-para-o-aviso">Pausa para o aviso!</h1><p>Essa newsletter s&#xF3; &#xE9; poss&#xED;vel atrav&#xE9;s da ajuda da comunidade e dos patrocinadores!</p><p>Essa em particular &#xE9; patrocinada pela <strong>Remessa Online!</strong> Se voc&#xEA; trabalha com tecnologia, com certeza j&#xE1; precisou trazer algum dinheiro de fora para o Brasil, e as taxas s&#xE3;o SUPER ALTAS &#x1F62D; Por isso a Remessa &#xE9; a melhor forma de fazer isso com a menor taxa do mercado e SEM BUROCRACIA! </p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/logo-2-corte.png" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="300" height="114"></figure><p>Voc&#xEA; pode automatizar seus recebimentos depois da primeira opera&#xE7;&#xE3;o e ainda economiza muito porque a Remessa tem as melhores taxas do mercado! Se voc&#xEA; ainda n&#xE3;o conhece e n&#xE3;o come&#xE7;ou a usar a plataforma, aproveita que &#xE9; s&#xF3; clicar aqui embaixo e usar meu cupom <strong>LSANTOSDEV</strong> pra ganhar 15% de desconto nas suas transa&#xE7;&#xF5;es.</p><p>&#x1F449; <a href="https://lsantos.dev/remessa-online?ref=blog.lsantos.dev">Clica aqui pra transferir com a menor taxa do mercado!</a></p><p>&#x1F31F; <strong>Quer fazer parte desse sonho comigo?</strong> Trazer essa newsletter ao mundo &#xE9; algo que sempre quis fazer, e ver o projeto crescer com o apoio de voc&#xEA;s seria incr&#xED;vel! Se voc&#xEA; tem uma marca ou produto que se conecta com essa comunidade, manda um e-mail para <a rel="noopener"><strong>hello@lsantos.dev</strong></a>. Vou adorar conversar sobre como voc&#xEA; pode apoiar essa jornada!</p><p>&#x1F499; <strong>Apoie o meu trabalho</strong>: Se voc&#xEA; gosta do conte&#xFA;do e quer dar uma for&#xE7;a, mesmo com apenas $1, isso j&#xE1; faz toda a diferen&#xE7;a! <a href="https://github.com/sponsors/khaosdoctor?ref=blog.lsantos.dev">Clique aqui</a> para contribuir mensalmente ou fazer uma doa&#xE7;&#xE3;o &#xFA;nica. Cada <a href="https://github.com/sponsors/khaosdoctor?ref=blog.lsantos.dev">apoio</a> me ajuda a manter essa newsletter viva e a fazer dela algo especial. Muito obrigado por estar aqui e por acreditar nesse sonho comigo!</p><hr><h2 id="scamp-e-miniaturiza%C3%A7%C3%A3o">SCAMP e miniaturiza&#xE7;&#xE3;o</h2><p>Computadores s&#xF3; eram t&#xE3;o grandes usavam rel&#xEA;s, v&#xE1;lvulas, transistores e outros componentes eletromec&#xE2;nicos, com a inven&#xE7;&#xE3;o de t&#xE9;cnicas de miniaturiza&#xE7;&#xE3;o como o circuito integrado, come&#xE7;ou a ser poss&#xED;vel reduzir o tamanho dos computadores.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.computerhistory.org/timeline/Scamp.png" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="800" height="795"><figcaption><span style="white-space: pre-wrap;">Paul Friedl e o SCAMP (fonte: CHM 1973)</span></figcaption></figure><p>O SCAMP (Special Computer APL Machine Portable) foi um computador desenvolvido na IBM em 1973 como um prot&#xF3;tipo de uma m&#xE1;quina port&#xE1;til que poderia ser carregada com todos os perif&#xE9;ricos para qualquer lugar e foi o que deu origem ao que a gente chama hoje de IBM PC, mas ainda sim era caro e focado em usos comerciais, ele ainda era bem caro.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-shop.adafruit.com/1200x900/976-01.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="1200" height="900"><figcaption><span style="white-space: pre-wrap;">Transistores comuns, hoje um processador tem bilh&#xF5;es deles</span></figcaption></figure><p>Computadores pequenos eram muito mais caros, os computadores mais &quot;baratos&quot; eram enormes, n&#xE3;o existiam computadores que fossem pequenos e baratos. Al&#xE9;m disso, nenhum computador era necessariamente f&#xE1;cil de programar, voc&#xEA; precisava de um conhecimento quase arcano para conseguir entender o que estava acontecendo e como operar o computador.</p><blockquote>Geralmente esses computadores tinham manuais de instru&#xE7;&#xF5;es que eram verdadeiros comp&#xEA;ndios de texto. Livros com mais de 800 p&#xE1;ginas descrevendo em detalhes n&#xE3;o s&#xF3; cada opera&#xE7;&#xE3;o, mas o caminho l&#xF3;gico de cada circuito do mainframe. Igualzinho a gente faz com documenta&#xE7;&#xE3;o hoje em dia...</blockquote><h2 id="revolu%C3%A7%C3%A3o-em-1975">Revolu&#xE7;&#xE3;o em 1975</h2><p>Mas isso mudou bastante em 1975 quando uma empresa chamada MITS criou um computador vision&#xE1;rio chamado <strong>Altair 8800</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.computerhistory.org/timeline/timeline_computers_1975.mitsaltair.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="800" height="642"><figcaption><span style="white-space: pre-wrap;">Um MITS Altair 8800 (fonte: CHM 1975)</span></figcaption></figure><p>O Altair &#xE9; considerado por muitos como o primeiro computador pessoal da hist&#xF3;ria, porque ele n&#xE3;o era focado em empresas ou em aplica&#xE7;&#xF5;es comerciais, ele era essencialmente um processador program&#xE1;vel que continha uma linguagem de alto n&#xED;vel (BASIC) e um interpretador para essa linguagem (criado por Bill Gates e Paul Allen). </p><p>Esse computador custava $297 USD, ordens de grandeza mais barato que um computador empresarial. Ele tinha 255 bytes de mem&#xF3;ria (expans&#xED;vel at&#xE9; 64kb), mas n&#xE3;o exibia nada em telas, a &#xFA;nica sa&#xED;da de um Altair eram luzes vermelhas.</p><blockquote>Pra quem tiver curiosidade, o filme &quot;Piratas do Vale do Sil&#xED;cio&quot; mostra em detalhes a saga do Bill Gates e do Paul Allen com o Altair 8800, vale bastante a pena assistir</blockquote><p>O Altair se tornou o que todos conhecemos como o primeiro computador pessoal bem sucedido de todos, ele era pequeno, barato, era f&#xE1;cil de carregar e n&#xE3;o era focado em um p&#xFA;blico comercial, mas sim hobbystas da computa&#xE7;&#xE3;o que queriam brincar com essa tecnologia em suas casas, mas existe uma parte perdida, antes do Altair, a hist&#xF3;ria do MCM/70, o <strong>real</strong> computador pessoal, ou pelo menos a primeira tentativa de um...</p><h1 id="o-real-computador-pessoal">O real computador pessoal</h1><p>Pouqu&#xED;ssimas pessoas conhecem a hist&#xF3;ria de uma empresa chamada MCM (Micro Computer Machines), criada perto de 1971 pelo canadense <a href="https://en.wikipedia.org/wiki/Mers_Kutt?ref=blog.lsantos.dev">Mers Kutt</a>. Mers era um professor de matem&#xE1;tica na Queen&apos;s University em Ontario que tinha um problema s&#xE9;rio com como o m&#xE9;todo de como os alunos e professores tinham que esperar dias para rodar programas no modelo de <a href="https://pt.wikipedia.org/wiki/Tempo_compartilhado?ref=blog.lsantos.dev">computa&#xE7;&#xE3;o compartilhada</a>, que consistia nos seguintes passos:</p><ol><li>Escrever seu programa em cart&#xF5;es perfurados</li><li>Mandar os cart&#xF5;es perfurados fisicamente para um mainframe (como o IBM360)</li><li>A galera que operava o mainframe iria rodar seu programa e te dar a resposta</li></ol><p>Existiam v&#xE1;rios problemas ai, o primeiro era que se voc&#xEA; errasse o programa e ele n&#xE3;o rodasse no computador, voc&#xEA; teria que passar por tudo isso de novo. O outro &#xE9; que as pessoas que rodavam os programas tinham que priorizar o que era executado e, se voc&#xEA; tivesse alguma briga com algum deles, seu programa provavelmente iria pro final da lista.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Hand-operated_Card_Punch-2.jpg/1024px-Hand-operated_Card_Punch-2.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="1024" height="499"><figcaption><span style="white-space: pre-wrap;">Isso era um Keypunch, usado para perfurar cart&#xF5;es (Wikip&#xE9;dia)</span></figcaption></figure><p>Todo o processo era muito lento e ele queria transformar o uso de computadores porque ele acreditava que todas as pessoas que usassem um computador poderiam criar coisas incr&#xED;veis, mas estavam sendo barradas por causa das limita&#xE7;&#xF5;es t&#xE9;cnicas. com essa ideia em mente, ele partiu para propor uma ideia de um computador que fosse:</p><ul><li>Pequeno o suficiente para ser levado por a&#xED;</li><li>Barato para que as pessoas pudessem ter</li><li>F&#xE1;cil de usar para que todos pudessem construir algo</li></ul><p>Esses eram os tr&#xEA;s principais problemas da &#xE9;poca, e ele queria resolver todos os tr&#xEA;s de uma vez s&#xF3;. Por sorte, ele conhecia <a href="https://en.wikipedia.org/wiki/Robert_Noyce?ref=blog.lsantos.dev">Robert Noyce</a>, o primeiro CEO da Intel (e fundador) que disse que a ideia poderia funcionar em um processador que a Intel estava trabalhando, o <a href="https://en.wikipedia.org/wiki/Intel_8008?ref=blog.lsantos.dev">Intel 8008</a>.</p><blockquote>Vale lembrar que, enquanto a gente sabe e conhece o conceito de computador pessoal, isso n&#xE3;o era algo existente na &#xE9;poca, ningu&#xE9;m sabia o que era um PC.</blockquote><p>&#xC9; importante ressaltar que a Intel n&#xE3;o era uma corpora&#xE7;&#xE3;o como &#xE9; hoje, ela era basicamente uma startup pequena. O Intel 8008 era pequeno, relativamente barato ($120) e tinha um clock de 0.8Mhz, o que era suficiente para <strong>uma</strong> pessoa rodar <strong>um</strong> programa.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/KL_Intel_C8008-1.jpg/1024px-KL_Intel_C8008-1.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="1024" height="657"><figcaption><span style="white-space: pre-wrap;">Intell 8008 (Wikip&#xE9;dia)</span></figcaption></figure><blockquote>Pra por em perspectiva, um Hert &#xE9; 1 ciclo por segundo, 0.8Mhz &#xE9; o equivalente a 800.000 Hertz, ou seja, o processador rodava 800.000 vezes por segundo. Hoje, um processador ruim roda a 2GHz, isso &#xE9; 2.000.000.000 vezes por segundo. Seu processador deve rodar a 4.7 ou 5Ghz isso &#xE9; 5800x mais r&#xE1;pido que o Intel 8008</blockquote><p>Isso resolvia uma parte do problema, era poss&#xED;vel conseguir computa&#xE7;&#xE3;o relativamente barata e pequena, agora e o resto? Para mem&#xF3;ria f&#xED;sica era poss&#xED;vel usar fitas cassete, mas elas eram usadas principalmente para audio, para dados digitais a maioria dos leitores eram do tamanho de um micro-ondas, al&#xE9;m disso, mem&#xF3;ria RAM era extremamente cara, um Intel 2102 com 1kb de mem&#xF3;ria custava $20 d&#xF3;lares por chip, voc&#xEA; precisaria de, pelo menos 8kb, para fazer qualquer coisa.</p><p>E ainda tinha o problema do uso... Como fazer um computador f&#xE1;cil de usar? Bom, vamos por partes. Kutt nomeou esse projeto de M/C, que acabou virando o <a href="https://en.wikipedia.org/wiki/MCM/70?ref=blog.lsantos.dev"><strong>MCM/70</strong></a><strong>, o primeiro computador verdadeiramente pessoal do mundo.</strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/MCM_Model_70_microcomputer_1974.jpg/1280px-MCM_Model_70_microcomputer_1974.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="1280" height="1033"><figcaption><span style="white-space: pre-wrap;">O MCM/70 (Wikip&#xE9;dia)</span></figcaption></figure><h1 id="hardware">Hardware</h1><p>Com o processador resolvido, a RAM era uma quest&#xE3;o simples, porque n&#xE3;o tinham muitas op&#xE7;&#xF5;es, ent&#xE3;o o MCM/70 tinha 8kb de RAM (8 chips 2102, $160 d&#xF3;lares) e uma ROM que iria conter a linguagem do computador.</p><p>Para armazenar os dados externamente eles usaram um leitor de fita cassete sequencial, era como se fosse uma fita comum de audio, eram compactas mas lentas... Para deixar tudo mais f&#xE1;cil, o MCM/70 tinha um display SELF-SCAN de 32 caracteres (que era algo inovador na &#xE9;poca), igual ao abaixo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://live.staticflickr.com/5820/29711670753_961d59f360.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="500" height="375"><figcaption><span style="white-space: pre-wrap;">Um SELF-SCAN display</span></figcaption></figure><p>SELF-SCAN &#xE9; o nome dado a uma fam&#xED;lia de displays de plasma que podiam exibir caracteres com mais detalhes do que os tradicionais 7-segments, mas usavam muito mais recursos, mas isso era necess&#xE1;rio, porque, para deixar o computador mais f&#xE1;cil, eles teriam que usar algo que a galera pudesse entender.</p><h2 id="software">Software</h2><p>Com os problemas de hardware quase resolvidos, o &#xFA;ltimo problema era como deixar o computador f&#xE1;cil de usar. Para isso Kutt, que j&#xE1; acompanhava o trabalho do <a href="https://en.wikipedia.org/wiki/Kenneth_E._Iverson?ref=blog.lsantos.dev">Ken Iverson</a> para criar a linguagem <a href="https://en.wikipedia.org/wiki/APL_(programming_language)?ref=blog.lsantos.dev">APL</a>, uma linguagem matem&#xE1;tica que usava s&#xED;mbolos especiais mas era poderosa o suficiente e tinha como ser executada em pouca mem&#xF3;ria.</p><p>O problema era que o custo de criar um teclado diferenciado para APL era mais alto, mas isso, na teoria, pagaria o projeto.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/MCM_Model_70_microcomputer_1974_APL_keyboard.jpg/1280px-MCM_Model_70_microcomputer_1974_APL_keyboard.jpg" class="kg-image" alt="Backlog #1 - O primeiro PC da hist&#xF3;ria!" loading="lazy" width="1280" height="812"><figcaption><span style="white-space: pre-wrap;">Teclado APL (Wikip&#xE9;dia)</span></figcaption></figure><p>Mas, Kutt n&#xE3;o era um programador, ent&#xE3;o ele contratou Gord Ramer - que j&#xE1; tinha feito um interpretador de APL com baixo uso de recursos antes - para poder criar o interpretador e colocar ele diretamente na ROM do computador. E essa parte &#xE9; uma das mais interessantes de toda essa hist&#xF3;ria.</p><p><strong>Codando para um 8008 sem um 8008</strong></p><p>Eles n&#xE3;o tinham um Intel 8008 dispon&#xED;vel porque eles come&#xE7;aram o desenvolvimento do prot&#xF3;tipo antes de o chip ficar pronto, mas a universidade Kingston tinha um IBM360 com um emulador de um Intel 8008. Voc&#xEA; colocava um c&#xF3;digo 8008 ali e ele iria te devolver um c&#xF3;digo hexadecimal para rodar no hardware, simples assim. O problema era que o IBM360 operava com cart&#xF5;es perfurados, ent&#xE3;o todo o interpretador de APL era escrito em cart&#xF5;es perfurados do IBM360, levados para a universidade para serem lidos e o c&#xF3;digo de resposta era tamb&#xE9;m escrito em cart&#xF5;es perfurados e depois digitado manualmente pelos devs dentro do MCM/70 (o prot&#xF3;tipo).</p><p>E como a viagem entre o escrit&#xF3;rio e a faculdade era de uns 10 minutos, n&#xE3;o era algo que voc&#xEA; iria fazer rotineiramente, como dev, voc&#xEA; iria usar um <em>debugger</em> que permitia que voc&#xEA; editasse o seu c&#xF3;digo direto no processador, anotasse as mudan&#xE7;as, e depois recompilasse o c&#xF3;digo correto na universidade.</p><h1 id="o-que-aconteceu">O que aconteceu?</h1><p>O MCM/70 foi lan&#xE7;ado em 1974, um ano antes do Altair 8800. Ele custava $4950 d&#xF3;lares canadenses na vers&#xE3;o com 2Kb de RAM e sem cassetes e $9800 com 8Kb e dois cassetes. Pela primeira vez um computador foi chamado de computador pessoal, tendo clientes al&#xE9;m de governos e grandes institui&#xE7;&#xF5;es e come&#xE7;ando a entrar em locais menores como hospitais e lojas.</p><p>Nos dois anos seguintes o MCM/70 foi renomeado para MCM/700 e, em 1976, o sucessor MCM/800 foi lan&#xE7;ado com um processador mais r&#xE1;pido, 16Kb de RAM e poderia usar um monitor externo. At&#xE9; 1978 a MCM lan&#xE7;ou o 900 e o 1000. Mas, mesmo depois de vender muitas unidades, sendo o primeiro computador vendido comercialmente que j&#xE1; continua um monitor, teclado, mem&#xF3;ria e tendo um pre&#xE7;o relativamente barato ele nunca chegou a ser altamente usado fora do meio acad&#xEA;mico ou comercial. No final dos anos 70 a MCM j&#xE1; tinha v&#xE1;rios competidores com computadores mais baratos e mais simples (como a MITS e o Altair) que ca&#xED;ram no gosto do p&#xFA;blico geral.</p><blockquote>Em grande parte, o problema do MCM era a linguagem APL que era extremamente complexa e complicada porque era totalmente composta de s&#xED;mbolos matem&#xE1;ticos, o que n&#xE3;o era o caso do Altair e o BASIC que era muito mais simples e direto.</blockquote><p>Em 1983, ap&#xF3;s tentar conseguir um financiamento para um modelo mais avan&#xE7;ado e falhar, a empresa fechou as portas e vendeu suas patentes e projetos para outras empresas, inclusive a Alcatel.</p><h2 id="mais-detalhes">Mais detalhes</h2><p>Se voc&#xEA; quiser saber mais sobre essa hist&#xF3;ria, Cam Farnell, um dos empregados da MCM na &#xE9;poca, deu uma palestra que fala sobre o MCM/70.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/9z3o7s-2fcI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="World of Commodore 2023 - The MCM/70: An Early Personal Computer - ft. Cam Farnell"></iframe></figure><blockquote>Al&#xE9;m disso existe um livro chamado <em>&quot;Inventing the MCM/70&quot;</em> publicado pelo professor Zbigniew Stachniak, mas eu n&#xE3;o consegui achar ele em nenhum lugar...</blockquote><p>E essa foi a hist&#xF3;ria por tr&#xE1;s da hist&#xF3;ria do primeiro computador pessoal do mundo. O MCM/70 pavimentou o caminho para o que conhecemos como computadores pessoais hoje. </p><p>Ele solucionou quest&#xF5;es cruciais de tamanho, acessibilidade e usabilidade, embora tenha sido ofuscado por concorrentes mais simplificados. Corrigindo esses erros, futuras gera&#xE7;&#xF5;es de PCs seguiram caminhos que moldaram tudo o que a gente conhece como <strong>computador</strong>.</p>]]></content:encoded></item><item><title><![CDATA[Backlog #0 - Um desabafo]]></title><description><![CDATA[Uma história pessoal sobre quase desistir e ter um novo começo. Bem vindos ao meu novo projeto, o Backlog.]]></description><link>https://blog.lsantos.dev/backlog-0/</link><guid isPermaLink="false">672e9d2805ee810c7aff83d3</guid><category><![CDATA[backlog-newsletter]]></category><category><![CDATA[opinion]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Sat, 09 Nov 2024 00:44:58 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/Logo-3.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/11/Logo-3.png" alt="Backlog #0 - Um desabafo"><p>Ol&#xE1;! </p><p>Voc&#xEA; n&#xE3;o me v&#xEA; por aqui h&#xE1; um tempo n&#xE3;o &#xE9; mesmo? E foi por um bom motivo. Essa daqui &#xE9; uma nova newsletter que eu comecei, ela ser&#xE1; bi-semanal e vai focar em um conte&#xFA;do mais pessoal, de coisas que eu gosto de escrever. </p><blockquote>Essa edi&#xE7;&#xE3;o vai ter s&#xF3; texto, mas a ideia &#xE9; intercalar com imagens e coisas interessantes.</blockquote><p>Eu quis mandar esse email agora (podemos chamar de  pr&#xE9;-newsletter) para contar uma hist&#xF3;ria, a hist&#xF3;ria de como eu cansei de tudo que eu estava fazendo e resolvi come&#xE7;ar tudo de novo. Uma hist&#xF3;ria que eu queria contar pra voc&#xEA; h&#xE1; muitos e muitos anos... Vai parecer estranho no in&#xED;cio, mas fica comigo at&#xE9; o fim que espero que essa mensagem mude a sua vida como mudou a minha.</p><h1 id="criar-conte%C3%BAdo-%C3%A9-cansativo">Criar conte&#xFA;do &#xE9; cansativo</h1><p>Crio conte&#xFA;do desde 2014. S&#xE3;o 10 anos publicando na internet: textos, v&#xED;deos, podcasts, palestras, participa&#xE7;&#xF5;es em outros canais, no total s&#xE3;o mais de 2000 conte&#xFA;dos... A cria&#xE7;&#xE3;o de conte&#xFA;do &#xE9;, simultaneamente, minha forma de documentar o que aprendo e minha maneira de retribuir &#xE0; comunidade que me proporcionou tanto. Posso dizer, sem hesitar, que n&#xE3;o teria chegado onde estou hoje se n&#xE3;o fosse por criar conte&#xFA;do.</p><p>Por&#xE9;m, cria&#xE7;&#xE3;o de conte&#xFA;do &#xE9; muito mais do que s&#xF3; escrever um texto, criar um artigo, fazer um v&#xED;deo. Aquilo que voc&#xEA; v&#xEA; ali &#xE9; o resultado final de muitas horas de trabalho e, as vezes, anos de pesquisa e experi&#xEA;ncia. Muitos dos meus artigos l&#xE1; no meu <a href="https://blog.lsantos.dev/">blog</a> demoraram horas para serem escritos &#x2013; alguns, como o de <a href="https://blog.lsantos.dev/criptografia-assimetrica-com-rsa/">criptografia RSA</a>, levaram dias! Entre pesquisar algo, resumir, verificar, escrever, verificar novamente e, no final, tentar arrumar um jeito de deixar o conte&#xFA;do chamativo, mas ao mesmo tempo educativo.</p><h2 id="o-desafio-do-criador-clt%C2%AE">O desafio do Criador CLT&#xAE;</h2><p>Tudo isso enquanto mantenho um emprego formal - sou o famoso <em>&quot;Criador de Conte&#xFA;do CLT&quot;</em>, ou seja, eu <strong>amo</strong> o que eu fa&#xE7;o, por&#xE9;m n&#xE3;o paga as contas. Adoraria criar conte&#xFA;do em tempo integral mas, diferente do que muitos pensam, a n&#xE3;o ser que voc&#xEA; seja extremamente grande, <strong>criar conte&#xFA;do n&#xE3;o &#xE9; t&#xE3;o lucrativo assim</strong>. A previsibilidade de um emprego ainda &#xE9; necess&#xE1;ria na maioria dos casos.</p><p>Como fa&#xE7;o grande parte sozinho, preciso usar v&#xE1;rios chap&#xE9;us: empres&#xE1;rio, designer (sim, todos os gr&#xE1;ficos que voc&#xEA; v&#xEA; aqui foram feitos por mim), social media, marketing e outros. O trabalho n&#xE3;o termina na publica&#xE7;&#xE3;o - &#xE9; preciso divulgar, alcan&#xE7;ar mais pessoas... mas para qu&#xEA;?</p><h1 id="as-m%C3%A9tricas-da-vaidade">As m&#xE9;tricas da vaidade</h1><p>Por mais que a gente fale que n&#xE3;o se importa com a quantidade de seguidores, o n&#xFA;mero de likes, ou qualquer coisa do tipo, a realidade &#xE9; que isso &#xE9; necess&#xE1;rio para  te dar uma m&#xE9;trica de como voc&#xEA; est&#xE1; impactando as pessoas. </p><p>Eu adoraria esconder todas as m&#xE9;tricas e focar apenas nos coment&#xE1;rios de feedbacks, mas eles s&#xE3;o raros. As pessoas n&#xE3;o interagem tanto nos conte&#xFA;dos, ent&#xE3;o as m&#xE9;tricas acabam sendo nossa &#xFA;nica forma de avaliar se o conte&#xFA;do funciona, se precisamos mudar a abordagem.</p><p>E, como criador de conte&#xFA;do, o lado comercial tamb&#xE9;m &#xE9; importante. Marcas e anunciantes olham essas m&#xE9;tricas para saber em m&#xE9;dia a quantidade de pessoas que eles podem atingir ao veicular um produto ou an&#xFA;ncio com voc&#xEA;.</p><blockquote>Ah, mas an&#xFA;ncios s&#xE3;o ruins, por que tem que ter an&#xFA;ncios?</blockquote><p>Concordo que an&#xFA;ncios podem ser problem&#xE1;ticos, mas s&#xE3;o frequentemente a &#xFA;nica forma de equilibrar tempo e retorno financeiro. O desafio &#xE9; que muitos anunciantes acabam interferindo no conte&#xFA;do, algo que felizmente nunca precisei aceitar.</p><p>Mas ent&#xE3;o quer dizer que eu s&#xF3; crio conte&#xFA;do porque eu quero algo em troca? N&#xE3;o, na verdade esse &#xE9; todo o ponto dessa newsletter. &#xC9; uma rebeli&#xE3;o, n&#xE3;o contra os anunciantes, mas contra as redes sociais e a forma como nosso conte&#xFA;do &#xE9; feito atualmente.</p><h1 id="a-minha-rebeli%C3%A3o-silenciosa">A minha rebeli&#xE3;o silenciosa</h1><p>Eu estou escrevendo essa edi&#xE7;&#xE3;o &#xE0; 01:10 da manh&#xE3;, enquanto olho para o contador de palavras e penso: &quot;Eu acho que isso est&#xE1; ficando longo demais&quot;, mas a realidade &#xE9; que esse email vai ser t&#xE3;o longo quanto eu quiser que seja, essa &#xE9; a minha newsletter, e eu vou falar o que eu quiser falar, por quanto tempo eu quiser falar, eu estou fazendo isso n&#xE3;o para ganhar dinheiro ou para ficar famoso, eu estou fazendo isso porque <strong>eu adoro isso que eu fa&#xE7;o, e eu quero compartilhar com voc&#xEA;</strong>!</p><h2 id="r%C3%A1pido-e-superficial">R&#xE1;pido e superficial</h2><p>O cen&#xE1;rio atual privilegia conte&#xFA;do r&#xE1;pido e superficial. As redes sociais nos condicionaram assim porque conte&#xFA;dos curtos significam mais tempo rolando feed, vendo mais an&#xFA;ncios, gerando mais lucro para elas. Agora temos especialistas de dez segundos em reels compartilhando assuntos (&#xE0;s vezes interessantes) de forma t&#xE3;o reduzida que muito se perde, focando apenas no que gera mais views (as vezes &#xE0;s custas da verdade).</p><p>Ao longo do tempo isso me desgastou tanto que eu pensei em parar de produzir conte&#xFA;do totalmente m&#xFA;ltiplas vezes, porque eu adoro escrever (como voc&#xEA; pode ver), e eu escrevo bastante, com detalhes, porque eu esque&#xE7;o das coisas e meu pr&#xF3;prio blog &#xE9; um recurso que eu consulto tanto quanto os leitores. N&#xE3;o gosto de superficialidade, mas o modelo atual mudou n&#xE3;o s&#xF3; para conte&#xFA;do raso e curto, mas tamb&#xE9;m para priorizar v&#xED;deo sobre texto, o que for&#xE7;a a gente a continuar criando (porque v&#xED;deos n&#xE3;o s&#xE3;o simples de editar...)</p><h1 id="o-que-vem-por-a%C3%AD">O que vem por a&#xED;?</h1><p>E essa &#xE9; a hist&#xF3;ria dessa newsletter. Esse aqui &#xE9; um espa&#xE7;o onde eu vou escrever muito, o que eu penso, vou ter opini&#xF5;es (as vezes fortes), vou incitar discuss&#xF5;es e te convido a comentar e participar comigo! Mas, acima de tudo: <strong>eu vou escrever o que eu gosto</strong>. </p><p>Aqui voc&#xEA; vai encontrar:</p><ul><li>Hist&#xF3;ria da computa&#xE7;&#xE3;o</li><li>Resumos e opini&#xF5;es sobre livros</li><li>Experi&#xEA;ncias pessoais interessantes</li><li>Reflex&#xF5;es sobre tecnologia e al&#xE9;m</li><li>Todo aquele conte&#xFA;do do meu &quot;<strong>backlog</strong> mental&quot; que sempre quis compartilhar</li><li>Sugest&#xF5;es s&#xE3;o bem vindas, s&#xF3; mandar nas minhas <a href="https://twitter.lsantos.dev/?ref=blog.lsantos.dev">redes</a></li></ul><p>Na pr&#xF3;xima edi&#xE7;&#xE3;o, vou trazer um tema que tem me fascinado ultimamente: <strong>hist&#xF3;ria da computa&#xE7;&#xE3;o</strong>! Mais precisamente a hist&#xF3;ria do primeiro computador de todos pra manter o nosso ritmo de recome&#xE7;os &#x1F61C;</p><p>Espero que voc&#xEA; goste desse novo espa&#xE7;o. Te vejo semana que vem!</p>]]></content:encoded></item><item><title><![CDATA[Deno 2.0: Será que agora o Node já era?]]></title><description><![CDATA[Deno finalmente chegou na versão 2.0! Saiba o que temos de mudanças no runtime mais popular de TypeScript! E por que ele pode substituir o Node.js]]></description><link>https://blog.lsantos.dev/deno-2/</link><guid isPermaLink="false">67114813a5f2bfb4b63aae11</guid><category><![CDATA[deno]]></category><category><![CDATA[typescript]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Wed, 30 Oct 2024 11:00:52 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/10/articles-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/10/articles-1.png" alt="Deno 2.0: Ser&#xE1; que agora o Node j&#xE1; era?"><p>Em 2020 eu participei de um dos epis&#xF3;dios do Hipsters.tech onde a gente falou bastante sobre o que era esse tal de Deno, a nova ferramenta que tava surgindo por a&#xED; e prometia ser um substituto do Node.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.hipsters.tech/deno-o-novo-node-hipsters-203/?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Deno, o novo Node? - Hipsters #203 - Hipsters Ponto Tech</div><div class="kg-bookmark-description">&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i0.wp.com/www.hipsters.tech/wp-content/uploads/2016/07/cropped-hipsters-logo.png?fit=192%2C192&amp;ssl=1" alt="Deno 2.0: Ser&#xE1; que agora o Node j&#xE1; era?"><span class="kg-bookmark-author">Hipsters Ponto Tech</span><span class="kg-bookmark-publisher">Admin</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i0.wp.com/hipsters.tech/wp-content/uploads/2020/06/Hipsters-Ponto-Tech-203-1200x628-1.png?fit=1200%2C628&amp;ssl=1" alt="Deno 2.0: Ser&#xE1; que agora o Node j&#xE1; era?"></div></a></figure><p>Quatro anos depois, o Deno finalmente chegou na vers&#xE3;o 2.0, e dessa vez eu acho que ele realmente tem a capacidade de ser o substituto do Node.js. Mas deixa eu te dizer por que eu acho isso.</p><h2 id="o-que-%C3%A9-deno">O que &#xE9; Deno?</h2><p>Antes de a gente come&#xE7;ar, o que &#xE9; o Deno? H&#xE1; um ano eu e o Roz fizemos uma palestra sobre ele no Iugu Talks4Devs. Vale a pena dar uma olhada:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/TgW0vW7NO8I?list=PLnOICPAPShyRZd7nnbC7h8kCQwM-6K3KW" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></figure><p>Em resumo, o Deno &#xE9; um outro runtime criado pelo Ryan Dahl, o mesmo criador do Node.js, a ideia &#xE9; que o Deno veio para corrigir os problemas que ele achava que poderiam ser prejudiciais para o Node.js, inclusive a presen&#xE7;a de um gerenciador de pacotes que fosse privado como o NPM.</p><p>Deno &#xE9; escrito em Rust e roda TypeScript nativamente, ent&#xE3;o voc&#xEA; n&#xE3;o precisa de uma etapa de compila&#xE7;&#xE3;o ou algo do tipo para poder rodar seu c&#xF3;digo, &#xE9; como se, automaticamente, ele entendesse tudo que voc&#xEA; quisesse fazer com o TypeScript e j&#xE1; interpretasse o c&#xF3;digo como JavaScript diretamente. Mas eu n&#xE3;o vou me estender nisso aqui, temos um artigo aqui no blog que fala s&#xF3; sobre Deno:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.lsantos.dev/deno/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Vamos falar sobre o Deno</div><div class="kg-bookmark-description">O Node.js est&#xE1; finalmente morrendo? Seria esse o momento de migrarmos para o Deno? Bora entender tudo sobre ele nesse artigo!</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.lsantos.dev/assets/icons/apple-icon-180x180.png?v=b3f7833e70" alt="Deno 2.0: Ser&#xE1; que agora o Node j&#xE1; era?"><span class="kg-bookmark-author">Lucas Santos</span><span class="kg-bookmark-publisher">Lucas Santos</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2022/12/Blog-cover-Template-1.png" alt="Deno 2.0: Ser&#xE1; que agora o Node j&#xE1; era?"></div></a></figure><h2 id="deno-20">Deno 2.0</h2><p>O Deno 2.0 ainda se mant&#xE9;m fiel &#xE0;s funcionalidades que ele veio inicialmente para prover, e os problemas que ele veio inicialmente para resolver. Embora ele tenha se perdido um pouco no meio do caminho (j&#xE1; vamos falar sobre isso), ele ainda se manteve bem constante no que ele promete e no que ele entrega.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Um fato engra&#xE7;ado &#xE9; que o Deno &#xE9; o segundo projeto mais popular no GitHub escrito em Rust, estando somente atr&#xE1;s do pr&#xF3;prio reposit&#xF3;rio da linguagem em si.</div></div><p>As principais propostas do Deno eram que:</p><ul><li>Ele teria suporte <strong>nativo</strong> a TypeScript, o que significa que voc&#xEA; n&#xE3;o teria que instalar nem o TypeScript nem nenhuma outra biblioteca como o <a href="https://blog.lsantos.dev/tsx-loader/">TSX</a> para executar TS no runtime</li><li>Constru&#xED;do usando Web Standards, ou seja, ele teria implementa&#xE7;&#xF5;es que seguissem estritamente as propostas do TC39 e da IETF. Isso &#xE9; t&#xE3;o verdade que o Deno foi o primeiro runtime que implementou o <a href="https://blog.lsantos.dev/temporal-api/">Temporal</a>, mas n&#xE3;o s&#xF3; isso, <a href="https://dev.to/_staticvoid/series/1993?ref=blog.lsantos.dev">Promises</a>, Fetch, <a href="https://blog.lsantos.dev/os-ecmascript-modules-estao-aqui/">ESM</a> e muitos outros j&#xE1; est&#xE3;o implementados nativamente</li><li>Ele teria todas as ferramentas necess&#xE1;rias para poder criar e manter um projeto a longo prazo como: Linter, Formatter, Type Checker, um framework de testes, habilidade de compilar para um execut&#xE1;vel e mais</li><li>Seguran&#xE7;a em primeiro lugar com sistemas de permiss&#xF5;es e etc</li></ul><p>E isso continua sendo verdade, o que &#xE9; impressionante, porque, geralmente quando runtimes como esses crescem (como &#xE9; o caso do Node), concess&#xF5;es acabam sendo feitas de forma que as propostas originais meio que se perdem nos pedidos e nas ideias da comunidade.</p><p>As funcionalidades do Deno 2.0 s&#xE3;o bastante interessantes, eu diria que s&#xE3;o at&#xE9; bem corajosas:</p><ul><li>Suporte completo ao Node e NPM, ent&#xE3;o voc&#xEA; pode rodar qualquer aplica&#xE7;&#xE3;o Node.js no Deno sem nenhuma configura&#xE7;&#xE3;o extra<ul><li>Isso inclui o suporte nativo ao <code>package.json</code> e ao <code>node_modules</code></li></ul></li><li>A adi&#xE7;&#xE3;o de um package manager que voc&#xEA; pode chamar com <code>deno add</code>, <code>deno install</code> e remover pacotes com <code>deno remove</code></li><li>A biblioteca padr&#xE3;o (stdlib) est&#xE1; oficialmente estabilizada e na vers&#xE3;o 1.0</li><li>Suporte para registros privados do NPM</li><li>Suporte para workspaces e monorepo</li><li>Deno agora vai ter calend&#xE1;rio de releases e suporte a LTS</li><li>A cria&#xE7;&#xE3;o do JSR, que &#xE9; um registro de pacotes similar ao NPM que suporte m&#xFA;ltiplos runtimes</li></ul><p>Al&#xE9;m disso outras funcionalidades que j&#xE1; existiam agora est&#xE3;o melhores:</p><ul><li><code>deno fmt</code> agora tamb&#xE9;m formata HTML, CSS e YAML</li><li><code>deno lint</code> agora tem regras espec&#xED;ficas do Node e pode arrumar erros automaticamente com <code>deno lint --fix</code></li><li><code>deno test</code> suporta o <a href="https://blog.lsantos.dev/comecando-com-o-node-js-test-runner/">Node.js Test Runner</a></li><li><code>deno task</code> tamb&#xE9;m roda scripts do <code>package.json</code></li><li>A documenta&#xE7;&#xE3;o gerada pelo <code>deno doc</code> agora &#xE9; mais bonita com um layout melhor</li><li><code>deno compile</code> suporta assinar pacotes e &#xED;cones no Windows</li><li><code>deno serve</code> agora suporta rodar server usando m&#xFA;ltiplos n&#xFA;cleos do processador em paralelo</li><li><code>deno init</code> tem a capacidade de scaffolding, ent&#xE3;o voc&#xEA; pode ter templates de libs e servers</li><li><code>deno jupyter</code> para quem usa jupyter notebooks agora tem sa&#xED;da de imagens, gr&#xE1;ficos e HTML</li><li><code>deno bench</code> para rodar benchmarks tem medidas mais precisas</li><li><code>deno coverage</code> tem sa&#xED;das de cobertura de testes em HTML</li></ul><p>Eu n&#xE3;o vou passar parte a parte sobre cada mudan&#xE7;a, esse artigo n&#xE3;o tem esse foco, a ideia aqui &#xE9; a gente discutir essas novidades e o que isso significa para o Deno e para o ecossistema de runtimes em geral, mas se voc&#xEA; quiser que eu fa&#xE7;a mais conte&#xFA;do sobre isso, me chama l&#xE1; nas minhas <a href="https://lsantos.dev/?ref=blog.lsantos.dev" rel="noreferrer">redes sociais</a> e me avisa!</p><div class="kg-card kg-header-card kg-v2 kg-layout-split kg-width-full " style="background-color: #007acc;" data-background-color="#007acc">
            
            <div class="kg-header-card-content">
                
            <picture><img class="kg-header-card-image" src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/01/Afiliados.jpg" loading="lazy" alt="Deno 2.0: Ser&#xE1; que agora o Node j&#xE1; era?"></picture>
        
                <div class="kg-header-card-text kg-align-center">
                    <h2 id="vem-aprender-comigo" class="kg-header-card-heading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><span style="white-space: pre-wrap;">Vem aprender comigo!</span></h2>
                    <p id="quer-aprender-mais-sobre-deno-e-boas-prticas-com-typescript" class="kg-header-card-subheading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><span style="white-space: pre-wrap;">Quer aprender mais sobre Deno e boas pr&#xE1;ticas com #TypeScript?</span></p>
                    <a href="https://formacaots.com.br/?ref=blog.lsantos.dev" class="kg-header-card-button " style="background-color: #00b18b;color: #FFFFFF;" data-button-color="#00b18b" data-button-text-color="#FFFFFF">Se inscreva na Forma&#xE7;&#xE3;o TS!</a>
                </div>
            </div>
        </div><h1 id="opni%C3%B5es">Opni&#xF5;es</h1><p>No geral, eu gostei bastante dessa nova vers&#xE3;o do Deno, por&#xE9;m tem algumas coisas que eu achei um pouco estranhas. A primeira delas &#xE9; o suporte a <code>package.json</code> e <code>node_modules</code> que foram coisas que explicitamente foram ditas que o Node tinha de ruim e que n&#xE3;o seriam implementadas nesse novo runtime. Por&#xE9;m aqui estamos com suporte completo ao Node.</p><p>Enquanto eu entendo que, sem isso, n&#xE3;o tem como o Deno competir com o Node de forma nenhuma, porque simplesmente o ambiente Node.js &#xE9; muito maior do que o ambiente Deno e a comunidade tamb&#xE9;m. Ent&#xE3;o era meio necess&#xE1;rio que a galera do Deno implementasse compatibilidade para que pessoas que j&#xE1; usassem Node pudessem usar Deno de forma direta, sem nenhuma configura&#xE7;&#xE3;o, e isso inclui ter que suportar o ambiente do Node.</p><p>Ningu&#xE9;m gosta do <code>node_modules</code>, isso &#xE9; claro em v&#xE1;rios memes.</p><figure class="kg-card kg-image-card"><img src="https://preview.redd.it/tfugj4n3l6ez.png?width=640&amp;crop=smart&amp;auto=webp&amp;s=50d398b1889aebb6344e5d3912f5ea57afc2ce22" class="kg-image" alt="Deno 2.0: Ser&#xE1; que agora o Node j&#xE1; era?" loading="lazy" width="640" height="460"></figure><p>Ent&#xE3;o a solu&#xE7;&#xE3;o aqui foi realmente suportar tanto o <code>package.json</code> quanto o <code>node_modules</code>, mas n&#xE3;o for&#xE7;ar que eles sejam obrigat&#xF3;rios. Isso foi uma boa sacada. Se voc&#xEA; quiser usar pacotes do NPM mas n&#xE3;o quiser ter o <code>node_modules</code> instalado, voc&#xEA; pode simplesmente substituir todas as declara&#xE7;&#xF5;es de imports tipo:</p><pre><code class="language-ts">import Express from &apos;express&apos; // express &#xE9; uma dep no package.json</code></pre><p>Para usar o prefixo <code>npm:</code>:</p><pre><code class="language-ts">import Express from &apos;npm:express&apos;</code></pre><p>Agora n&#xE3;o &#xE9; mais necess&#xE1;rio ter o Express no <code>package.json</code>, e nem instalar nada no <code>node_modules</code> porque o Deno vai tomar o controle desse pacote e instalar ele no cache. Em projetos que s&#xE3;o maiores voc&#xEA; pode utilizar os <em>import maps</em> (que s&#xE3;o um web standard) para poder mapear o nome do pacote para outro nome (o que &#xE9; essencialmente um outro tipo de <code>package.json</code>, mas ajuda a saber o que est&#xE1; instalado):</p><pre><code class="language-ts">// deno.json
{
  &quot;imports&quot;: {
    &quot;express&quot;: &quot;npm:express&quot;
  }
}</code></pre><p>E isso me leva a outro assunto, que &#xE9; o <code>deno.json</code> em si, que era uma das propostas originais de n&#xE3;o ter um arquivo JSON que define todo o projeto. Enquanto ele n&#xE3;o &#xE9; necess&#xE1;rio nem obrigat&#xF3;rio (a n&#xE3;o ser que voc&#xEA; queira publicar algo no JSR), meio que se tornou uma boa pr&#xE1;tica ter esse arquivo ali. E isso &#xE9;, basicamente, outro <code>package.json</code>.</p><h2 id="jsr-e-deno-pm">JSR e Deno PM</h2><p>O Deno seguiu um pouco nos passos do Bun incluindo um package manager dentro do bin&#xE1;rio, o que eu acho que vai completamente contra o que eles propuseram inicialmente (inclusive tem at&#xE9; um <a href="https://deno.com/blog/package-json-support?ref=blog.lsantos.dev">blog post do pr&#xF3;prio Ryan Dahl sobre isso</a>). Eu, pessoalmente, gosto muito do modelo de importa&#xE7;&#xE3;o direto por URL que t&#xED;nhamos antes (e, acredito, que ainda temos no Deno) que &#xE9; uma forma mais decentralizada de manter os seus pacotes e n&#xE3;o entregar o controle dele para organiza&#xE7;&#xF5;es privadas, que podem simplesmente remover, alterar, ou at&#xE9; tomar conta de um pacote p&#xFA;blico.</p><p>Isso &#xE9; t&#xE3;o verdade que existem v&#xE1;rios exemplos disso acontecendo, onde empresas tem o controle total de pacotes p&#xFA;blicos, como &#xE9; o caso mais recente do <a href="https://www.advancedcustomfields.com/blog/acf-plugin-no-longer-available-on-wordpress-org/?ref=blog.lsantos.dev">WordPress que tomou conta (quase sequestrando) um dos plugins mais utilizados do ambiente</a>. Substitua WordPress por NPM, Deno, JSR, ou qualquer outra coisa e voc&#xEA; tem o mesmo resultado. Claro, tudo depende de como essas empresas se comportam, e o caso do WordPress &#xE9; sim um caso muito separado por ter uma pessoa chave que tem o controle da maioria das coisas, mas ainda sim &#xE9; uma possibilidade.</p><div class="kg-card kg-signup-card kg-width-full kg-content-wide kg-style-accent" data-lexical-signup-form style="; display: none;">
            
            <div class="kg-signup-card-content">
                
                <div class="kg-signup-card-text kg-align-center">
                    <h2 class="kg-signup-card-heading" style="color: #FFFFFF;"><span style="white-space: pre-wrap;">Obrigado! Voc&#xEA; chegou aqui! &#x1F389;</span></h2>
                    <p class="kg-signup-card-subheading" style="color: #FFFFFF;"><span style="white-space: pre-wrap;">Se voc&#xEA; gosta do meu conte&#xFA;do, considere assinar a minha newsletter!</span></p>
                    
        <form class="kg-signup-card-form" data-members-form="signup">
            
            <div class="kg-signup-card-fields">
                <input class="kg-signup-card-input" id="email" data-members-email type="email" required="true" placeholder="Your email">
                <button class="kg-signup-card-button " style="background-color: #f6b219;color: #000000;" type="submit">
                    <span class="kg-signup-card-button-default">Quero me inscrever!</span>
                    <span class="kg-signup-card-button-loading"><svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewbox="0 0 24 24">
        <g stroke-linecap="round" stroke-width="2" fill="currentColor" stroke="none" stroke-linejoin="round" class="nc-icon-wrapper">
            <g class="nc-loop-dots-4-24-icon-o">
                <circle cx="4" cy="12" r="3"/>
                <circle cx="12" cy="12" r="3"/>
                <circle cx="20" cy="12" r="3"/>
            </g>
            <style data-cap="butt">
                .nc-loop-dots-4-24-icon-o{--animation-duration:0.8s}
                .nc-loop-dots-4-24-icon-o *{opacity:.4;transform:scale(.75);animation:nc-loop-dots-4-anim var(--animation-duration) infinite}
                .nc-loop-dots-4-24-icon-o :nth-child(1){transform-origin:4px 12px;animation-delay:-.3s;animation-delay:calc(var(--animation-duration)/-2.666)}
                .nc-loop-dots-4-24-icon-o :nth-child(2){transform-origin:12px 12px;animation-delay:-.15s;animation-delay:calc(var(--animation-duration)/-5.333)}
                .nc-loop-dots-4-24-icon-o :nth-child(3){transform-origin:20px 12px}
                @keyframes nc-loop-dots-4-anim{0%,100%{opacity:.4;transform:scale(.75)}50%{opacity:1;transform:scale(1)}}
            </style>
        </g>
    </svg></span>
                </button>
            </div>
            <div class="kg-signup-card-success" style="color: #FFFFFF;">
                Email sent! Check your inbox to complete your signup.
            </div>
            <div class="kg-signup-card-error" style="color: #FFFFFF;" data-members-error></div>
        </form>
        
                    <p class="kg-signup-card-disclaimer" style="color: #FFFFFF;"><span style="white-space: pre-wrap;">Conte&#xFA;do de qualidade com a curadoria de mais de uma d&#xE9;cada como dev</span></p>
                </div>
            </div>
        </div><p>Por outro lado, centralizar pacotes dessa forma torna o ambiente mais seguro, e evita problemas como o que <a href="https://www.revenera.com/blog/software-composition-analysis/the-story-behind-colors-js-and-faker-js/?ref=blog.lsantos.dev">aconteceu com o Faker</a> e o <a href="https://en.wikipedia.org/wiki/Npm_left-pad_incident?ref=blog.lsantos.dev">Left-pad</a> (que mostra outro problema completamente diferente e muito mais s&#xE9;rio, mas vamos nos ater a essa hist&#xF3;ria). Nesses dois casos, o NPM conseguiu intervir e for&#xE7;adamente tomar controle dos pacotes, republicando e/ou restaurando vers&#xF5;es anteriores. Isso &#xE9; um exemplo onde ter controle total &#xE9; uma coisa boa, mas somente se a empresa que tem o controle tem boas inten&#xE7;&#xF5;es. Mas a pergunta que fica &#xE9;: </p><blockquote class="kg-blockquote-alt">Qual empresa tem boas inten&#xE7;&#xF5;es?</blockquote><p>Voltando ao Deno, a cria&#xE7;&#xE3;o do JSR e o uso do Deno como package manager n&#xE3;o &#xE9; necessariamente algo ruim porque ele basicamente se conecta a muitos gerenciadores e &#xE9; utilizado como um cliente de cada um para baixar pacotes em m&#xFA;ltiplos lugares diferentes. O Deno meio que virou o <code>yarn</code>, inclusive ele se compara a eles:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/10/package-install-timings.png" class="kg-image" alt="Deno 2.0: Ser&#xE1; que agora o Node j&#xE1; era?" loading="lazy" width="3840" height="2160"></figure><p>A ideia &#xE9; boa, por exemplo, se voc&#xEA; rodar <code>deno install</code>:</p><ul><li>Se voc&#xEA; tiver um <code>package.json</code>, ele vai se comportar como um <code>npm install</code>, criando um <code>node_modules</code> e instalando todos os pacotes dentro dele</li><li>Se voc&#xEA; n&#xE3;o tem um <code>package.json</code> ele vai cachear todas as depend&#xEA;ncias no cache global, a mesma coisa que a gente fazia com <code>deno cache</code></li></ul><p>Isso significa que voc&#xEA; pode usar literalmente qualquer tipo de pacote que voc&#xEA; quiser de qualquer origem que voc&#xEA; quiser, ou seja, voc&#xEA; pode usar pacotes presentes no JSR com <code>import x from &apos;jsr:pacote@versao&apos;</code> junto com <code>import x from &apos;https://url.com&apos;</code> e <code>import x from &apos;npm:pacote@versao&apos;</code>. Apesar de interessante, eu imagino a bagun&#xE7;a que isso vai ser em projetos grandes.</p><h1 id="ser%C3%A1-o-fim-do-nodejs">Ser&#xE1; o fim do Node.js?</h1><p>Pela primeira vez eu tenho que dizer que realmente n&#xE3;o sei. Com a ado&#xE7;&#xE3;o do Deno em maior escala a cada dia que passa, e a inabilidade do Node.js implementar as mesmas funcionalidades na mesma velocidade, eu vejo que muita gente vai acabar migrando para Deno sim, mas n&#xE3;o acho que seja o fim do Node.js.</p><p>Apesar de ser mais devagar, o Node.js tem feito grandes feitos e est&#xE1; implementando coisas muito interessantes, como o suporte para rodar arquivos TypeScript com <code>--experimental-strip-types</code> e <code>--experimental-transform-types</code>. A adi&#xE7;&#xE3;o do Node Test Runner, a melhoria desses pacotes e muitas coisas que est&#xE3;o sendo adicionadas conforme falamos.</p><p>Mas eu n&#xE3;o acho que todas essas adi&#xE7;&#xF5;es sejam suficientes para manter o projeto no ar, o Node &#xE9; um projeto que tem muitas depend&#xEA;ncias, tem muitas cabe&#xE7;as envolvidas e muita pol&#xED;tica tamb&#xE9;m, muitas empresas dependem desse projeto e est&#xE3;o tentando guiar para seu pr&#xF3;prio benef&#xED;cio com membros nos comit&#xEA;s. Eventualmente, o Deno (ou o Bun, ou o pr&#xF3;ximo runtime) vai aparecer com uma funcionalidade que n&#xE3;o temos como negar, por exemplo, no caso do Deno, para mim voc&#xEA; poder compilar tudo para um bin&#xE1;rio &#xE9; algo que &#xE9; incr&#xED;vel, e muitas pessoas pensam o mesmo, mas isso raramente vai chegar ao Node.</p><h1 id="conclus%C3%A3o">Conclus&#xE3;o</h1><p>O Deno 2.0 vem com muitas coisas boas e realmente vale a pena testar, talvez at&#xE9; mesmo implementar em um projeto e deixar ele rodando por um tempo, vou fazer alguns testes com projetos Node.js que tenho e quem sabe posto os futuros resultados por aqui, ou na minha newsletter!</p><p>Se voc&#xEA; quiser ver alguma coisa por aqui n&#xE3;o esquece de me chamar!</p>]]></content:encoded></item><item><title><![CDATA[O JavaScript será completamente diferente em 2025]]></title><description><![CDATA[O JavaScript pode mudar bastante no ano de 2025, algumas propostas muito interessantes foram aprovadas, veja quais!]]></description><link>https://blog.lsantos.dev/js-2025-de-novo/</link><guid isPermaLink="false">67095f227df8a46204779995</guid><category><![CDATA[javascript]]></category><category><![CDATA[ecmascript]]></category><category><![CDATA[development]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Wed, 16 Oct 2024 11:00:01 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/10/articles.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/10/articles.png" alt="O JavaScript ser&#xE1; completamente diferente em 2025"><p>N&#xE3;o muito tempo atr&#xE1;s eu fiz uma s&#xE9;rie de <a href="https://blog.lsantos.dev/js-2025/">previs&#xF5;es para o JS em 2025</a>, e eu n&#xE3;o estava t&#xE3;o longe assim da realidade! O TC39 se reuniu essa semana em Tokyo para poder discutir as propostas que seriam passadas para frente nas pr&#xF3;ximas vers&#xF5;es do JS, essa foi a 104a reuni&#xE3;o do comit&#xEA; desde a sua cria&#xE7;&#xE3;o.</p><p>Como sempre acontece, o Rob Palmer, que &#xE9; um dos membros do TC39, posta no seu <a href="https://x.com/robpalmer2/status/1843448233340875143?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1843448233340875143%7Ctwgr%5E%7Ctwcon%5Es1_c10&amp;ref_url=https%3A%2F%2Fsocket.dev%2Fblog%2Ftc39-advances-10-ecmascript-proposals-key-features-to-watch&amp;ref=blog.lsantos.dev">Twitter</a> tudo que ser&#xE1; discutido durante as reuni&#xF5;es. Este ano as pautas eram:</p><ul><li>Array.zip</li><li>Atomics.pause</li><li>Error.isError</li><li>Extractors</li><li>Immutable ArrayBuffer</li><li>Iterator helpers</li><li>Math.sumPrecise</li><li>Promise.try</li><li>RegExp modifiers</li><li>Structs</li></ul><p>E algumas delas realmente foram passadas para os pr&#xF3;ximos est&#xE1;gios, nem todas as que eu previ, mas pelo menos 50% delas! Essa foi minha maior taxa de acerto desde sempre! Vamos ver tudo que foi discutido:</p><h2 id="iterator-helpers"><a href="https://github.com/tc39/proposal-iterator-helpers?ref=blog.lsantos.dev">Iterator helpers</a></h2><p>Uma proposta que, na verdade, s&#xE3;o v&#xE1;rias. Aqui estamos falando n&#xE3;o s&#xF3; dos helpers (que passaram para o est&#xE1;gio 4 e v&#xE3;o ser implementadas), mas tamb&#xE9;m de outra proposta que eu comentei que poderiam ter avan&#xE7;os.</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/10/image.png" class="kg-image" alt="O JavaScript ser&#xE1; completamente diferente em 2025" loading="lazy" width="509" height="414"></figure><p>Essa proposta adiciona uma s&#xE9;rie de m&#xE9;todos de ajuda em iteradores (como Map, Set e generators), como o <code>map</code>, <code>filter</code>, <code>reduce</code> e muitos outros para transformar o uso de iteradores em algo mais pr&#xF3;ximo de um array. </p><p>Algo que hoje n&#xE3;o &#xE9; muito f&#xE1;cil de entender hoje em dia, porque, por exemplo:</p><pre><code class="language-js">const arr = [1,2,3]
arr.map((v) =&gt; v) // ok

const set = new Set([1,2,3])
set.map((v) =&gt; v) // erro, n&#xE3;o temos map em sets</code></pre><p>Veja que o Array, que &#xE9; um iterable, tem <code>map</code>, mas o Set n&#xE3;o tem, porque, por mais que a principal forma de usar um Set seja atrav&#xE9;s de itera&#xE7;&#xF5;es, ele n&#xE3;o &#xE9; um Iterable.</p><p>Al&#xE9;m dessa proposta, outra que eu tamb&#xE9;m comentei (que estava em est&#xE1;gio 2) passou para o 2.7, <a href="https://github.com/tc39/proposal-iterator-sequencing?ref=blog.lsantos.dev">Iterator Sequencing</a>. Que permite que a gente crie iterators concatenando outros iterators com <code>Iterator.concat</code> assim como fazemos com <code>Array.concat</code>.</p><h2 id="import-attributes-json-modules"><a href="https://github.com/tc39/proposal-import-attributes?ref=blog.lsantos.dev">Import attributes</a> &amp; <a href="http://github.com/tc39/proposal-json-modules?ref=blog.lsantos.dev">JSON Modules</a></h2><p>Agora vamos, finalmente, poder usar o que a gente j&#xE1; estava usando h&#xE1; meses. As duas propostas que modificam a forma que importamos JSON e outros m&#xF3;dulos passaram para o est&#xE1;gio 4 e ser&#xE3;o implementadas!</p><p>Agora poderemos fazer isso:</p><pre><code class="language-js">import json from &apos;./arquivo.json&apos; with { type: &apos;json&apos; }</code></pre><p>Originalmente as duas propostas eram uma s&#xF3;, mas elas foram separadas. O motivo &#xE9; que, para os import attributes (o <code>with</code>) isso pode abrir oportunidades para que possamos importar outros tipos de arquivos nativamente que n&#xE3;o sejam apenas JSON, por exemplo, XML ou CSV.</p><p>E ent&#xE3;o, cada m&#xF3;dulo que ser&#xE1; importado ter&#xE1; uma nova proposta como os JSON modules tiveram. Isso garante que os engines n&#xE3;o tenham implementa&#xE7;&#xF5;es espec&#xED;ficas para cada coisa, por exemplo, imagina que droga que seria se cada browser lesse JSON de forma diferente...</p><p>Ambas as propostas foram passadas e agora teremos uma forma nativa de ler arquivos JSON diretamente do JS, algo que o Node j&#xE1; implementava, mas n&#xE3;o era parte da especifica&#xE7;&#xE3;o.</p><h2 id="regexp-modifiers"><a href="https://github.com/tc39/proposal-regexp-modifiers?ref=blog.lsantos.dev">RegExp Modifiers</a></h2><p>Mais uma que passou para o est&#xE1;gio 4. Agora vamos poder usar os modificadores como <code>/i</code>, <code>/m</code> e outros diretamente nas RegExps do JS. Essa foi uma que eu n&#xE3;o sabia que estava sendo votada, eu admito, achei que essa funcionalidade j&#xE1; estivesse presente no engine atual, mas aparentemente n&#xE3;o era algo que foi implementado (diferente de todas as linguagens anteriores que implementaram logo de cara... Vai saber)</p><h2 id="structs"><a href="https://github.com/tc39/proposal-structs?ref=blog.lsantos.dev">Structs</a></h2><p>Essa &#xE9; uma proposta que eu realmente pensei que n&#xE3;o fosse avan&#xE7;ar t&#xE3;o r&#xE1;pido. Structs adicionam quatro objetos l&#xF3;gicos no JS:</p><ul><li>Structs: Objetos com layout fixo que se comportam como classes, mas com algumas restri&#xE7;&#xF5;es que deixam elas mais r&#xE1;pidas e mais f&#xE1;ceis de serem analizadas estaticamente por um compilador</li><li>Shared Structs: Structs um pouco mais restritas que podem ser acessadas por m&#xFA;ltiplas threads em paralelo. Essa estrutura sozinha &#xE9; respons&#xE1;vel por permitir paralelismo de verdade no JS</li><li>Mutex e Condition: Abstra&#xE7;&#xF5;es para sincronizar acessos &#xE0; structs compartilhadas</li><li>Unsafe Blocks: Objetos que dizem onde uma mem&#xF3;ria n&#xE3;o segura pode ser inicializada e trabalhada</li></ul><p>A grande ideia dessa proposta come&#xE7;ou com Structs, que seriam objetos fixos, que n&#xE3;o podem ter mais ou menos campos, o que &#xE9; incr&#xED;vel porque a maioria dos objetos que usamos s&#xE3;o dessa forma. Assim o compilador n&#xE3;o precisa otimizar todos os objetos para serem din&#xE2;micos por padr&#xE3;o.</p><p>As SharedStructs v&#xE3;o permitir que possamos utilizar objetos que compartilham mem&#xF3;ria entre arquivos, sem precisar usar Realms ou outras estruturas. Essa proposta acabou de passar para o est&#xE1;gio 2 e agora ser&#xE1; o design que vai ser trabalhado!</p><h2 id="extractors"><a href="https://github.com/tc39/proposal-extractors?ref=blog.lsantos.dev">Extractors</a></h2><p>Extractors avan&#xE7;aram para o est&#xE1;gio 2. Eles nada mais s&#xE3;o do que uma fun&#xE7;&#xE3;o que pode ser aplicada quando estamos fazendo um destructuring de um objeto. Isso permite que a gente fa&#xE7;a tanto valida&#xE7;&#xE3;o quando normaliza&#xE7;&#xE3;o dos valores, por exemplo, podemos deixar todas as chaves min&#xFA;sculas:</p><pre><code class="language-js">const LowercaseExtractor = {
  [Symbol.customMatcher](valor) {
    if (typeof valor === &apos;string&apos;) {
      return valor.toLowerCase()
    }
  }
}

const LowercaseExtractor({ nome, rua }) = { nome: &apos;LUCAS&apos;, rua: &apos;RUA&apos; }
console.log({ nome, rua }) // { nome: &apos;lucas&apos;, rua: &apos;rua&apos; }</code></pre><h2 id="promisetry"><a href="https://github.com/tc39/proposal-promise-try?ref=blog.lsantos.dev">Promise.try</a></h2><p>Depois de <a href="https://x.com/ljharb/status/1843884468647682382?ref=blog.lsantos.dev">8 anos</a>, o Promise.try finalmente entrou em est&#xE1;gio 4 e ser&#xE1; implementado na linguagem! Essa aqui eu tinha previsto no outro artigo tamb&#xE9;m!</p><p>A grande ideia aqui &#xE9; algo bem simples, na verdade, quando temos um valor que n&#xE3;o sabemos se &#xE9; ou n&#xE3;o uma promise, geralmente enrolamos ele em uma Promise e seguimos a nossa vida:</p><pre><code class="language-js">// N&#xE3;o sabemos se o retorno de F &#xE9; uma promise ou n&#xE3;o
const p = new Promise(resolve =&gt; resolve(F()))
// mas p sempre vai ser uma promise</code></pre><p>Com essa proposta vamos poder mudar esse c&#xF3;digo para algo como:</p><pre><code class="language-js">await Promise.try(F) // retorna F como promise</code></pre><p>Isso n&#xE3;o &#xE9; uma forma de rodar fun&#xE7;&#xF5;es em paralelo ou de forma ass&#xED;ncrona, ele simplesmente chama fun&#xE7;&#xE3;o, que antes seria s&#xED;ncrona, de uma forma unificada como uma promise.</p><h2 id="erroriserror"><a href="https://github.com/tc39/proposal-is-error?ref=blog.lsantos.dev">Error.isError</a></h2><p>Mais uma das que eu tinha previsto que poderiam sair do est&#xE1;gio atual, o <code>Error.isError</code> foi para o est&#xE1;gio 2.7 e est&#xE1; aguardando testes e valida&#xE7;&#xF5;es. A ideia aqui &#xE9; bem simples e eu realmente n&#xE3;o sei porque n&#xE3;o temos isso desde sempre, mas essa proposta permite que fa&#xE7;amos algo parecido com o <code>Array.isArray</code>, s&#xF3; que com erros:</p><pre><code class="language-js">if (Error.isError(err)) {
  // err &#xE9; um erro
}}</code></pre><p>O que vai limitar o uso de <code>instanceof Error</code>, j&#xE1; que o <code>instanceof</code> pode ser modificado externamente.</p><h1 id="conclus%C3%A3o">Conclus&#xE3;o</h1><p>Existem outras propostas que tamb&#xE9;m avan&#xE7;aram, mas sinceramente, n&#xE3;o s&#xE3;o algumas que v&#xE3;o fazer muita diferen&#xE7;a na vida de todo mundo, duas mais interessantes foram o <a href="https://github.com/tc39/proposal-array-zip?ref=blog.lsantos.dev">Array.zip</a> e os <a href="https://github.com/Agoric/tc39-proposal-immutable-arraybuffer?ref=blog.lsantos.dev">Immutable ArrayBuffers</a> que podem ser modificadas nos pr&#xF3;ximos dias.</p><p>Outras propostas podem ser cotadas para discuss&#xE3;o tamb&#xE9;m como:</p><ul><li>AsyncContext</li><li>Dataview Clamped Methods</li><li>Decimal</li><li>Discard Bindings</li><li>ESM Phase Imports</li><li>Explicit Compile Hints</li><li>Intl.DurationFormat</li><li>JSSugar</li><li>Math.emplace</li><li>Measure Object</li><li>Observables</li><li>Porffor</li><li>Smart Units</li><li>Temporal</li></ul><p>Pelo que eu vi recentemente, o Temporal est&#xE1; em alta e pode realmente ser que ele seja cotado para sair no ano que vem, ent&#xE3;o vamos observar.</p>]]></content:encoded></item><item><title><![CDATA[Primeiros passos com Neovim]]></title><description><![CDATA[Eu me rendi ao Vim e não foi fácil deixar ele do jeito que eu queria. Então eu quero te ensinar pra você não ter que passar pelo mesmo problema!]]></description><link>https://blog.lsantos.dev/instalando-e-configurando-o-neovim/</link><guid isPermaLink="false">66ad387db020deb82514d731</guid><category><![CDATA[vim]]></category><category><![CDATA[tools]]></category><category><![CDATA[development]]></category><dc:creator><![CDATA[Lucas Santos]]></dc:creator><pubDate>Wed, 25 Sep 2024 11:00:53 GMT</pubDate><media:content url="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/articles-l2.png" medium="image"/><content:encoded><![CDATA[<img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/articles-l2.png" alt="Primeiros passos com Neovim"><p>Eu sempre gostei do Vim, mas esse editor &#xE9; mundialmente conhecido por ser uma das pe&#xE7;as de software mais complexas de aprender j&#xE1; criadas, at&#xE9; ganhando a fama de ser o lugar que voc&#xEA; entra e nunca mais sai.</p><figure class="kg-card kg-image-card"><img src="https://i.redd.it/m9eh2jw08qm61.jpg" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="583" height="344"></figure><p>Por&#xE9;m existe a promessa da &quot;produtividade super-humana&quot; uma vez que voc&#xEA; consegue se sentir confortavel o suficiente com ele.</p><p>Recentemente eu resolvi deixar de usar o VSCode 100% e come&#xE7;ar a usar apenas o Neovim, e eu vou te mostrar como eu fiz pra deixar ele exatamente desse jeito:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/image-2.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1312" height="1048"></figure><p>Se voc&#xEA; j&#xE1; conhece o editor, pode pular direto para a parte de instala&#xE7;&#xE3;o. Ou, se voc&#xEA; quiser saber mais sobre a hist&#xF3;ria do Vim, Vi e Neovim, deixa eu te contar.</p><h2 id="um-pouco-sobre-vim">Um pouco sobre Vim</h2><p>Se voc&#xEA; n&#xE3;o sabe o que &#xE9; o <a href="https://en.wikipedia.org/wiki/Vi_(text_editor)?ref=blog.lsantos.dev">Vim</a>, em poucas palavras, &#xE9; um dos editores de texto mais antigos que ainda est&#xE3;o em uso. Ele foi criado por um cara chamado <a href="https://en.wikipedia.org/wiki/Bram_Moolenaar?ref=blog.lsantos.dev">Bram Molenaar</a> em 1991 como uma melhoria ao editor original <em>Vi</em>, criado por <a href="https://en.wikipedia.org/wiki/Bill_Joy?ref=blog.lsantos.dev">Bill Joy</a> em 1976 como um modo<em> <u>vi</u></em>sual para um outro editor chamado <code>ed</code>. Por isso que Vim &#xE9; o acr&#xF4;nimo de &quot;Vi improved&quot;.</p><p>O Vi, assim como o Vim, introduziu uma mudan&#xE7;a dr&#xE1;stica na forma de editar textos, a movimenta&#xE7;&#xE3;o quase cir&#xFA;rgica do cursor, e tamb&#xE9;m a movimenta&#xE7;&#xE3;o usando as teclas HJKL, como eu expliquei nessa thread:</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="pt" dir="ltr">&#x1F913; Hist&#xF3;ria da computa&#xE7;&#xE3;o pt 2: POR QUE O VIM USA H, J, K e L COMO SETAS????<br><br>J&#xE1; que voc&#xEA;s curtiram minha &#xFA;ltima thread sobre TTY eu vou falar uma outra parte da hist&#xF3;ria da computa&#xE7;&#xE3;o aqui e por que a tecnologia de hoje &#xE9; basicamente a mesma de 60 anos atr&#xE1;s.<br><br>S&#xF3; mais colorida <a href="https://t.co/qw4QU18OXt?ref=blog.lsantos.dev">pic.twitter.com/qw4QU18OXt</a></p>&#x2014; Lucas Santos &#x1F1E7;&#x1F1F7;&#x1F1F8;&#x1F1EA; &#x2022; formacaots.com.br &#x1F48E; (@_StaticVoid) <a href="https://twitter.com/_StaticVoid/status/1815722344142279159?ref_src=twsrc%5Etfw&amp;ref=blog.lsantos.dev">July 23, 2024</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></figure><p>Desde ent&#xE3;o muita gente adora usar o Vim porque ele &#xE9; extremamente leve, f&#xE1;cil de configurar e tem basicamente uma linguagem pr&#xF3;pria de programa&#xE7;&#xE3;o (VimL) que permite que voc&#xEA; fa&#xE7;a macros e muitas outras coisas de forma absurdamente poderosa. </p><p>O &#xFA;nico problema &#xE9; que ele tem uma das maiores curvas de aprendizado da hist&#xF3;ria porque os comandos s&#xE3;o definidos como sequ&#xEA;ncias de teclas individuais e combina&#xE7;&#xE3;o de letras, mas quem consegue dominar o Vim tem um aumento estrondoso de produtividade simplesmente pelo fato de que o editor &#xE9; extremamente responsivo.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">N&#xE3;o vou focar em como usar o Vim aqui, at&#xE9; porque eu mesmo n&#xE3;o sou um mestre do uso dele, mas existem v&#xE1;rios sites legais como o <a href="https://vim-adventures.com/?ref=blog.lsantos.dev">Vim Adventures</a> e extens&#xF5;es do <a href="https://marketplace.visualstudio.com/items?itemName=vintharas.learn-vim&amp;ref=blog.lsantos.dev">VSCode</a> que voc&#xEA; pode pesquisar.</div></div><p>Infelizmente o Vim sozinho, do jeito que ele vem &quot;de f&#xE1;brica&quot;, apesar de totalmente us&#xE1;vel, n&#xE3;o &#xE9; o que eu chamaria de um bom editor de c&#xF3;digo, ele poderia ter sido l&#xE1; em 1991, mas com o avan&#xE7;o das tecnologias, a integra&#xE7;&#xE3;o cada vez mais pr&#xF3;xima das linguagens com os editores e o movimento saindo dos grandes e complexos IDEs para editores menores com suporte a plugins deixou o Vim um pouco defasado, mesmo que ele tenha ganhado suporte a plugins.</p><h3 id="entra-o-neovim">Entra o Neovim</h3><p>Neovim &#xE9; um fork do Vim original feito por um Brasileiro chamado <a href="https://github.com/tarruda?ref=blog.lsantos.dev">Thiago Arruda</a> depois que ele <a href="https://groups.google.com/g/vim_dev/c/65jjGqS1_VQ?pli=1&amp;ref=blog.lsantos.dev">n&#xE3;o conseguiu apoio</a> para implementar uma mudan&#xE7;a no Vim original que permitiria que o editor tivesse m&#xFA;ltiplas threads e pudesse ser controlado por processos externos. O primeiro commit do Neovim aconteceu em <a href="https://github.com/neovim/neovim/commit/72cf89bce8e4230dbc161dc5606f48ef9884ba70?ref=blog.lsantos.dev">31 de janeiro de 2014</a>.</p><p>Dentre as muitas novidades do Neovim, o suporte nativo a <a href="https://en.wikipedia.org/wiki/Lua_(programming_language)?ref=blog.lsantos.dev">Lua</a> &#xE9; uma das principais, o que significa que voc&#xEA; pode escrever plugins e ferramentas de forma muito mais simples do que usando C ou VimL que, apesar de boas, s&#xE3;o complicadas. Al&#xE9;m de ter processamento ass&#xED;ncrono e ter o suporte nativo a <a href="https://en.wikipedia.org/wiki/Language_Server_Protocol?ref=blog.lsantos.dev">LSP</a>s (Language Server Protocol) que permitem a comunica&#xE7;&#xE3;o em tempo real do que voc&#xEA; est&#xE1; escrevendo e um servidor em background que vai analisar o seu c&#xF3;digo (assim que a gente consegue auto completions, intellisense e an&#xE1;lise de erros).</p><p>A partir da&#xED; o NVim ganhou cada vez mais suporte da comunidade e um aporte de algumas empresas atrav&#xE9;s do OpenCollective e agora &#xE9; um projeto open source completamente auto sustent&#xE1;vel e mantido por alguns devs em tempo integral. E vai ser ele que vamos modificar hoje.</p><div class="kg-card kg-header-card kg-v2 kg-layout-split kg-width-full " style="background-color: #007acc;" data-background-color="#007acc">
            
            <div class="kg-header-card-content">
                
            <picture><img class="kg-header-card-image" src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/01/Afiliados.jpg" loading="lazy" alt="Primeiros passos com Neovim"></picture>
        
                <div class="kg-header-card-text kg-align-center">
                    <h2 id="vem-aprender-comigo" class="kg-header-card-heading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><span style="white-space: pre-wrap;">Vem aprender comigo!</span></h2>
                    <p id="quer-aprender-tudo-sobre-typescript-e-ficar-pronto-para-o-mercado" class="kg-header-card-subheading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><span style="white-space: pre-wrap;">Quer aprender tudo sobre #TypeScript e ficar pronto para o mercado?</span></p>
                    <a href="https://formacaots.com.br/?ref=blog.lsantos.dev" class="kg-header-card-button " style="background-color: #00b18b;color: #FFFFFF;" data-button-color="#00b18b" data-button-text-color="#FFFFFF">Se inscreva na Forma&#xE7;&#xE3;o TS!</a>
                </div>
            </div>
        </div><h2 id="pr%C3%A9-requisitos">Pr&#xE9; requisitos</h2><p>Antes de a gente come&#xE7;ar eu vou falar alguns pr&#xE9;-requisitos que voc&#xEA; precisa ter para poder seguir esse tutorial de um jeito que voc&#xEA; consiga aproveitar</p><h3 id="1tenha-algum-tipo-de-linux">1 - Tenha algum tipo de Linux</h3><p>Embora seja sim poss&#xED;vel <a href="https://dev.to/hoo12f/setting-up-neovim-with-windows-powershell-2208?ref=blog.lsantos.dev">instalar o Neovim em Windows com o Powershell</a>, eu vou fazer a mesma coisa com um sistema Linux. Voc&#xEA; pode estar usando Mac, alguma distribui&#xE7;&#xE3;o Linux, ou at&#xE9; mesmo o WSL no Windows com a distro que voc&#xEA; preferir.</p><p>Eu estou escrevendo esse artigo em um Arch Linux, mas tudo que eu falar aqui pode ser transposto para o Mac (Darwin) sem problemas, os arquivos ficam no mesmo lugar.</p><h3 id="2tenha-uma-shell-pronta">2 - Tenha uma shell pronta</h3><p>Eu estou usando um ZSH com o Zinit e v&#xE1;rios plugins (voc&#xEA; pode ver meus dotfiles <a href="github.lsantos.dev/dotfiles/blob/master/general/base/.zshrc" rel="noreferrer">aqui</a>), a shell em si n&#xE3;o importa, voc&#xEA; pode usar bash, sh, Fish, ou o que for, o importante &#xE9; que voc&#xEA; tenha ela totalmente configurada para evitar problemas com vari&#xE1;veis de ambiente.</p><h3 id="3instale-o-neovim">3 - Instale o Neovim</h3><p>Voc&#xEA; pode instalar o Neovim seguindo diretamente as instru&#xE7;&#xF5;es do <a href="https://github.com/neovim/neovim/blob/master/INSTALL.md?ref=blog.lsantos.dev">site oficial</a>, no geral, para Mac voc&#xEA; j&#xE1; deve ter ele instalado por padr&#xE3;o, caso contr&#xE1;rio &#xE9; s&#xF3; usar o <a href="https://brew.sh/?ref=blog.lsantos.dev" rel="noreferrer">Homebrew</a> com <code>brew install neovim</code>.</p><p>No caso do Arch eu usei o <a href="https://github.com/Jguer/yay?ref=blog.lsantos.dev">YaY</a> com <code>yay -S neovim</code>, provavelmente sua distribui&#xE7;&#xE3;o tem alguma coisa do mesmo tipo.</p><p>Depois de instalado, quando voc&#xEA; executar o neovim pela primeira vez digitando <code>nvim</code>, sem nenhuma configura&#xE7;&#xE3;o, ele vai parecer com isso aqui:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/image-3.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1436" height="727"></figure><blockquote>&#xC9; poss&#xED;vel sim sair do Neovim apertando <code>esc</code> e depois <code>:q!&lt;enter&gt;</code> </blockquote><h3 id="4nerdfonts">4 - NerdFonts</h3><p>Uma parte important&#xED;ssima desse setup s&#xE3;o as <a href="https://www.nerdfonts.com/?ref=blog.lsantos.dev">NerdFonts</a>. Uma NerdFont &#xE9; uma fonte comum, por&#xE9;m empacotada com <strong>todos os &#xED;cones e glifos imaginados</strong>. Basicamente &#xE9; como se sua fonte Arial tivesse um monte de desenhos junto, incluindo &#xED;cones do Font Awesome e um monte de outros glifos transformados em fontes que a gente v&#xEA; por ai.</p><p>Voc&#xEA; pode instalar a fonte que voc&#xEA; preferir, mas uma fonte obrigat&#xF3;ria &#xE9; a MesloLG. Voc&#xEA; pode instalar essas fontes de v&#xE1;rias formas, a mais simples &#xE9; ir at&#xE9; a p&#xE1;gina de <a href="https://www.nerdfonts.com/font-downloads?ref=blog.lsantos.dev">downloads</a> achar a fonte e incluir na sua biblioteca de fontes.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Como regra geral, prefira sempre instalar as varia&#xE7;&#xF5;es NerdFont da sua fonte preferida se elas existirem, a chance de voc&#xEA; ter problemas com textos n&#xE3;o sendo exibidos vai ser muito menor.</div></div><p>Outra forma que eu prefiro &#xE9; instalar usando o seu gerenciador de pacotes, no caso do brew voc&#xEA; pode procurar por fontes usando <code>brew search font-&lt;nome&gt;</code> e baixar a que estiver com o nome <code>nerd-font</code> no final, por exemplo:</p><pre><code class="language-bash">$ brew install --cask font-meslo-lg-nerd-font</code></pre><p>No caso do Arch &#xE9; a mesma coisa s&#xF3; que com o yay:</p><pre><code class="language-sh">$ yay -S ttf-meslo-nerd</code></pre><p>Se voc&#xEA; quiser instalar outras fontes, eu tamb&#xE9;m recomendo a <em>CaskaydiaCove Nerd Font </em>(minha atual fonte)<em>, Fira Code Nerd Font</em>, e a <em>Hack</em> que s&#xE3;o fontes bem interessantes e f&#xE1;ceis de ver.</p><h3 id="5lazygit">5 - Lazygit</h3><p>Instale o LazyGit, que &#xE9; um cliente de git direto pelo terminal. Voc&#xEA; pode instalar ele diretamente pelo brew com o <code>brew install lazygit</code> ou <code>yay lazygit</code> no caso do Arch.</p><h2 id="lazy-e-lazyvim">Lazy e LazyVim</h2><p>Eu n&#xE3;o vou entrar em detalhes das bases do Vim, ou do Neovim, mas eu quero ir direto ao ponto e mostrar como voc&#xEA; pode come&#xE7;ar o mais r&#xE1;pido poss&#xED;vel de um jeito bem simples com ele.</p><p>Existe um projeto de um plugin manager chamado <a href="https://lazy.folke.io/?ref=blog.lsantos.dev">lazy.nvim</a>.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/292349/208301737-68fb279c-ba70-43ef-a369-8c3e8367d6b1.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1272" height="754"></figure><p>A ideia de um gerenciador de plugins, assim como um gerenciador de pacotes tipo NPM, RubyGems ou qualquer outra coisa &#xE9; literalmente tornar f&#xE1;cil o carregamento de funcionalidades externas atrav&#xE9;s de plugins no Neovim, pense nele como se fossem as extens&#xF5;es do VSCode.</p><p>Pois bem, o mesmo criador do lazy.nvim deu um passo a mais e criou um &quot;kit iniciante&quot; para quem quer come&#xE7;ar com neovim j&#xE1; com v&#xE1;rios bons setups iniciais, uma s&#xE9;rie de plugins e uma s&#xE9;rie de configura&#xE7;&#xF5;es prontas. E esse &#xE9; o <a href="https://www.lazyvim.org/?ref=blog.lsantos.dev">LazyVim</a></p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/292349/213447056-92290767-ea16-430c-8727-ce994c93e9cc.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1815" height="1123"></figure><p>O LazyVim &#xE9; extremamente parecido com o VSCode, o que torna todo o processo bem simples e f&#xE1;cil de transitar, al&#xE9;m de ter uma s&#xE9;rie de comandos que j&#xE1; est&#xE3;o prontos e uma busca de keybindings pra voc&#xEA; n&#xE3;o se perder. Fora que ele tamb&#xE9;m suporta mouse, ent&#xE3;o caso voc&#xEA; queira clicar em alguma coisa &#xE9; bem simples.</p><h3 id="instalando">Instalando</h3><p>A instala&#xE7;&#xE3;o do LazyVim &#xE9; bem direta, primeiro voc&#xEA; faz um backup das suas configura&#xE7;&#xF5;es:</p><pre><code class="language-sh">mv ~/.config/nvim{,.bak}
mv ~/.local/share/nvim{,.bak}
mv ~/.local/state/nvim{,.bak}
mv ~/.cache/nvim{,.bak}</code></pre><p>Lembrando que nem todas as pastas v&#xE3;o existir, ainda mais se voc&#xEA; criou a instala&#xE7;&#xE3;o do Neovim agora.</p><blockquote>Por padr&#xE3;o todas as configura&#xE7;&#xF5;es v&#xE3;o ficar salvas em <code>$HOME/.config/nvim</code> mas o LazyVim vai ser instalado em <code>$HOME/.local/share/nvim/lazy</code>, incluindo todas as configura&#xE7;&#xF5;es e plugins que ele j&#xE1; tem. Lembrando que voc&#xEA; <strong>N&#xC3;O</strong> deve mexer nesse diret&#xF3;rio.</blockquote><p>Depois &#xE9; s&#xF3; clonar o reposit&#xF3;rio com o Git:</p><pre><code class="language-sh">git clone https://github.com/LazyVim/starter ~/.config/nvim</code></pre><p>E ai remover a pasta <code>.git</code> de dentro desse reposit&#xF3;rio pra que voc&#xEA; possa modificar sem ter o hist&#xF3;rico.</p><p>Agora &#xE9; rodar o comando <code>nvim</code>, voc&#xEA; j&#xE1; deve ver algumas mudan&#xE7;as na sua configura&#xE7;&#xE3;o e deve estar vendo a tela padr&#xE3;o do Lazy</p><figure class="kg-card kg-image-card"><img src="https://i.redd.it/l1i77cpeyzaa1.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="896" height="620"></figure><p>Digite <code>:LazyHealth</code> e aperte enter, para garantir que tudo est&#xE1; rodando legal.</p><h3 id="a-tecla-leader">A tecla &lt;leader&gt;</h3><p>O Lazy, assim como muitos outros, tem uma tecla base para as demais combina&#xE7;&#xF5;es, essa tecla &#xE9; a <code>&lt;leader&gt;</code> que &#xE9; mapeada para a barra de espa&#xE7;o por padr&#xE3;o, aperte <code>&lt;leader&gt;</code> e voc&#xEA; vai ver um guia de keybindings aparecendo na parte de baixo da tela, esse &#xE9; um plugin chamado <em>WhichKey</em> (que tamb&#xE9;m foi criado pelo <a href="https://github.com/folke?ref=blog.lsantos.dev" rel="noreferrer">Folke</a>, o criador do Lazy):</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/image-4.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1438" height="189"></figure><p>Basta apertar a pr&#xF3;xima tecla da sequ&#xEA;ncia para executar a a&#xE7;&#xE3;o ou para ir para a pr&#xF3;xima p&#xE1;gina (no caso das bindings que tem um <code>+</code> na frente, como <code>+g</code> que abre o git), tente <code>&lt;leader&gt;l</code>, e veja a tela &quot;home&quot; do Lazy se abrir:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/image-5.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1142" height="582"></figure><p>Voc&#xEA; pode navegar por essa janela usando as letras no cabe&#xE7;alho, por exemplo <code>I</code> mostra todos os plugins instalados, <code>U</code> vai atualizar todos eles, <code>S</code> vai sincronizar com o reposit&#xF3;rio e assim vai.</p><blockquote>Lembre-se que <code>U</code> e <code>u</code> s&#xE3;o diferentes na perspectiva do Vim. Ent&#xE3;o se voc&#xEA; ver uma sequ&#xEA;ncia como <code>&lt;leader&gt;bD</code>, digite exatamente como &#xE9;: <code>&lt;espa&#xE7;o&gt;b&lt;shift&gt;d</code></blockquote><p>Aperte <code>q</code> para sair do painel. Agora chegou o momento de fazer um tour pelas funcionalidades b&#xE1;sicas</p><div class="kg-card kg-signup-card kg-width-full kg-content-wide kg-style-accent" data-lexical-signup-form style="; display: none;">
            
            <div class="kg-signup-card-content">
                
                <div class="kg-signup-card-text kg-align-center">
                    <h2 class="kg-signup-card-heading" style="color: #FFFFFF;"><span style="white-space: pre-wrap;">Obrigado! Voc&#xEA; chegou aqui! &#x1F389;</span></h2>
                    <p class="kg-signup-card-subheading" style="color: #FFFFFF;"><span style="white-space: pre-wrap;">Se voc&#xEA; gosta do meu conte&#xFA;do, considere assinar a minha newsletter!</span></p>
                    
        <form class="kg-signup-card-form" data-members-form="signup">
            
            <div class="kg-signup-card-fields">
                <input class="kg-signup-card-input" id="email" data-members-email type="email" required="true" placeholder="Your email">
                <button class="kg-signup-card-button " style="background-color: #f6b219;color: #000000;" type="submit">
                    <span class="kg-signup-card-button-default">Quero me inscrever!</span>
                    <span class="kg-signup-card-button-loading"><svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewbox="0 0 24 24">
        <g stroke-linecap="round" stroke-width="2" fill="currentColor" stroke="none" stroke-linejoin="round" class="nc-icon-wrapper">
            <g class="nc-loop-dots-4-24-icon-o">
                <circle cx="4" cy="12" r="3"/>
                <circle cx="12" cy="12" r="3"/>
                <circle cx="20" cy="12" r="3"/>
            </g>
            <style data-cap="butt">
                .nc-loop-dots-4-24-icon-o{--animation-duration:0.8s}
                .nc-loop-dots-4-24-icon-o *{opacity:.4;transform:scale(.75);animation:nc-loop-dots-4-anim var(--animation-duration) infinite}
                .nc-loop-dots-4-24-icon-o :nth-child(1){transform-origin:4px 12px;animation-delay:-.3s;animation-delay:calc(var(--animation-duration)/-2.666)}
                .nc-loop-dots-4-24-icon-o :nth-child(2){transform-origin:12px 12px;animation-delay:-.15s;animation-delay:calc(var(--animation-duration)/-5.333)}
                .nc-loop-dots-4-24-icon-o :nth-child(3){transform-origin:20px 12px}
                @keyframes nc-loop-dots-4-anim{0%,100%{opacity:.4;transform:scale(.75)}50%{opacity:1;transform:scale(1)}}
            </style>
        </g>
    </svg></span>
                </button>
            </div>
            <div class="kg-signup-card-success" style="color: #FFFFFF;">
                Email sent! Check your inbox to complete your signup.
            </div>
            <div class="kg-signup-card-error" style="color: #FFFFFF;" data-members-error></div>
        </form>
        
                    <p class="kg-signup-card-disclaimer" style="color: #FFFFFF;"><span style="white-space: pre-wrap;">Conte&#xFA;do de qualidade com a curadoria de mais de uma d&#xE9;cada como dev</span></p>
                </div>
            </div>
        </div><h2 id="tour-b%C3%A1sico">Tour b&#xE1;sico</h2><p>Vamos come&#xE7;ar com as funcionalidades mais simples e mais &#xFA;teis.</p><h3 id="explorer-neotree">Explorer (Neotree)</h3><p>O Lazy vem com um plugin chamado <code>neotree</code>, que &#xE9; um plugin para mostrar uma barra de navega&#xE7;&#xE3;o de arquivos como o explorer do VSCode. Voc&#xEA; pode acessar essa funcionalidade com <code>&lt;leader&gt;e</code>.</p><blockquote>Voc&#xEA; n&#xE3;o precisa esperar at&#xE9; o WhichKey aparecer, &#xE9; s&#xF3; apertar o mais r&#xE1;pido que conseguir, lembre-se que &#xE9; a velocidade aqui.</blockquote><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/image-6.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="373" height="289"></figure><p>Voc&#xEA; pode navegar por ela com HJKL, J e K v&#xE3;o descer e subir, H e L navegam para dentro e fora de pastas. Para abrir um arquivo aperte Enter, aqui est&#xE3;o alguns atalhos &#xFA;teis:</p><ul><li><code>a</code>: Cria um novo arquivo</li><li><code>r</code>: Renomear o arquivo</li><li><code>d</code>: Deleta o arquivo</li><li><code>C</code>: Fecha a pasta atual e sobe um n&#xED;vel</li><li><code>/</code>: Inicia a busca</li><li><code>?</code>: Mostra a lista de atalhos</li></ul><h3 id="movimenta%C3%A7%C3%A3o">Movimenta&#xE7;&#xE3;o</h3><p>Abra o vim na pasta <code>~/.config/nvim</code>, vamos come&#xE7;ar dali. Selecione o arquivo <code>lua/config/lazy.lua</code>. Esse &#xE9; o principal arquivo de configura&#xE7;&#xE3;o do lazy, mas a gente quase nunca vai mexer nele.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/image-7.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="2000" height="1090"></figure><p>Aperte <code>&lt;C-l&gt;</code> ou <code>&lt;Ctrl&gt;+l</code> para voltar ao Neotree, agora abra o arquivo <code>options.lua</code>, veja que temos duas abas no topo, esses s&#xE3;o os buffers, cada buffer &#xE9; um arquivo em mem&#xF3;ria, e &#xE9; importante dizer que n&#xE3;o s&#xE3;o abas!</p><blockquote>No Vim o conceito de abas e buffers &#xE9; diferente, abas s&#xE3;o como se fossem espa&#xE7;os completamente separados que podem ter uma configura&#xE7;&#xE3;o de janelas completamente a parte, buffers s&#xE3;o os arquivos abertos dentro de uma aba e eles podem ser reorganizados em janelas nessa aba. Na maioria das vezes voc&#xEA; s&#xF3; vai ter uma aba aberta.</blockquote><p>Para se mover entre um arquivo e outro use <code>L</code> e <code>H</code> , ou <code>gn</code> e <code>gp</code>. Voc&#xEA; tamb&#xE9;m pode tirar proveito de um outro plugin, o Telescope.</p><p>Feche esse buffer com <code>&lt;leader&gt;bd</code>.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">O Vim tem o conceito de buffers e janelas. Um buffer &#xE9; um arquivo ou fonte de texto que voc&#xEA; est&#xE1; editando, ele pode ou n&#xE3;o ser um arquivo f&#xED;sico no computador, mas ele sempre ser&#xE1; um arquivo em mem&#xF3;ria, quando voc&#xEA; escreve no buffer, voc&#xEA; est&#xE1; primeiro escrevendo na mem&#xF3;ria e, ao salvar, passando a escrita para o arquivo.<br><br>Uma janela &#xE9; como se fosse uma outra inst&#xE2;ncia da sua janela do Vim, &#xE9; como se fosse uma outra aba de um browser, um ambiente diferente e isolado de qualquer outro buffer</div></div><h3 id="telescope">Telescope</h3><p>O Telescope &#xE9; outro plugin feito para buscar arquivos. Vamos abrir outro arquivo com ele, aperte <code>&lt;leader&gt;ff</code> para abrir a janela do Telescope:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/image-8.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="2000" height="1169"></figure><p>Aqui voc&#xEA; pode digitar direto para buscar o arquivo, navegar com as setas ou com <code>&lt;C-n&gt;</code> e <code>&lt;C-p&gt;</code>, voc&#xEA; tamb&#xE9;m pode abrir a lista de atalhos com <code>&lt;C-?&gt;</code>. Abra outro arquivo com ele.</p><blockquote>Voc&#xEA; tamb&#xE9;m pode acessar o telescope para arquivos com <code>&lt;leader&gt;&lt;leader&gt;</code></blockquote><p>Existem infinitas op&#xE7;&#xF5;es do Telescope. Por exemplo, voc&#xEA; pode buscar dentre todos os arquivos abertos (buffers) com <code>&lt;leader&gt;fb</code>, na verdade, a maioria das coisas que voc&#xEA; pode fazer com o Telescope vai estar dentro de <code>&lt;leader&gt;f</code>, ou ent&#xE3;o de <code>&lt;leader&gt;s</code>, que s&#xE3;o os comandos de busca globais.</p><h2 id="configura%C3%A7%C3%A3o">Configura&#xE7;&#xE3;o</h2><p>Agora que a gente sabe o b&#xE1;sico, vamos come&#xE7;ar a configurar o nosso editor. O Lazy vai inicialmente ler todos os arquivos dentro da pasta <code>lua/config</code> como configura&#xE7;&#xF5;es iniciais, come&#xE7;ando com o <code>lazy.lua</code>, depois ele vai ler todos os plugins dentro da pasta plugins.</p><p>Ent&#xE3;o para poder adicionar novas funcionalidades a gente s&#xF3; precisa mudar esses arquivos:</p><ul><li><code>lua/config/options.lua</code>: Op&#xE7;&#xF5;es gerais e configura&#xE7;&#xF5;es do tipo on/off</li><li><code>lua/config/keymaps.lua</code>: Mapeamento de teclas, aqui que vamos modificar os atalhos</li><li><code>lua/config/autocmds.lua</code>: Se voc&#xEA; tiver algum auto command do vim, aqui &#xE9; o lugar de colocar</li><li><code>lua/plugins</code>: Qualquer arquivo lua aqui dentro ser&#xE1; lido e adicionado nos plugins, ent&#xE3;o voc&#xEA; pode separar por categoria (ui, search, code, etc) ou pelo nome do plugin, que &#xE9; o que eu fiz.</li></ul><h3 id="lazylua">Lazy.lua</h3><p>Vamos come&#xE7;ar pelo arquivo que a gente tem que modificar menos, o arquivo <code>lazy.lua</code>, aqui vamos habilitar somente o que s&#xE3;o chamados de <code>LazyExtras</code>, configura&#xE7;&#xF5;es de f&#xE1;brica que o Lazy j&#xE1; traz prontas e permite que voc&#xEA; estenda ou modifique depois na pasta <code>plugins</code>.</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/08/image-10.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1109" height="764"></figure><p>Vamos focar nessa se&#xE7;&#xE3;o apenas, descomente as tr&#xEA;s linhas que est&#xE3;o acima de <code>{ import = &quot;plugins&quot; }</code>, a primeira vai habilitar o suporte nativo a TypeScript (que vamos configurar depois nos LSPs), a formata&#xE7;&#xE3;o com Prettier e a extens&#xE3;o para JSON.</p><p>Al&#xE9;m disso, j&#xE1; vamos adicionar um tema, eu estou usando o tema <code>catpuccin</code> modificado, mas n&#xE3;o vamos instalar ele agora.</p><blockquote>Lembrando que voc&#xEA; pode instalar qualquer tema que voc&#xEA; quiser e o pr&#xF3;prio Lazy j&#xE1; tem alguns pr&#xE9; instalados que voc&#xEA; pode testar com <code>&lt;leader&gt;uC</code></blockquote><p>Outro detalhe &#xE9; que, depois de algumas atualiza&#xE7;&#xF5;es do Lazy, a integra&#xE7;&#xE3;o do TypeScript acabou come&#xE7;ando a usar um outro LSP (vamos falar dele j&#xE1; j&#xE1;) ent&#xE3;o eu acabei desabilitando essa configura&#xE7;&#xE3;o.</p><h2 id="optionslua">options.lua</h2><p>O arquivo options &#xE9; o arquivo que vai ter as op&#xE7;&#xF5;es principais, como tamanho dos espa&#xE7;os, colunas e etc, geralmente &#xE9; um arquivo bem pequeno e bem pessoal, no meu caso eu coloquei apenas as configura&#xE7;&#xF5;es mais simples:</p><pre><code class="language-lua">-- Options are automatically loaded before lazy.nvim startup
-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
-- Add any additional options here
--
-- -- Enable the option to require a Prettier config file
-- If no prettier config file is found, the formatter will not be used
vim.g.lazyvim_prettier_needs_config = true
-- Auto wrap
vim.opt.wrap = true
-- Attempt to fix indent
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.expandtab = true
vim.opt.autoindent = true
vim.opt.smarttab = true

-- Highlights for cursor column
vim.cmd.set(&quot;cursorcolumn&quot;)
vim.cmd(&quot;highlight CursorColumn ctermbg=Blue&quot;)
vim.cmd(&quot;highlight CursorColumn ctermfg=Black&quot;)

-- Vim does not recognize the alt key in Mac
-- https://stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
-- So we have to use the response from stty -icanon; cat (press alt + key)
-- to get the correct key code, then we can map it to something else
-- NOTE: ^[ is the escape character \e in vim
vim.cmd(&quot;set &lt;M-BS&gt;=\\e?&quot;) -- in this example alt+backspace is ESC+? which is mapped to &lt;M-BS&gt;</code></pre><p>De cima para baixo, as configura&#xE7;&#xF5;es s&#xE3;o as seguintes:</p><ul><li>Desabilita o prettier se n&#xE3;o houver um arquivo de configura&#xE7;&#xE3;o <code>.prettierrc</code> na pasta, porque eu n&#xE3;o gosto de habilitar o prettier globalmente (na verdade eu n&#xE3;o gosto de habilitar nada globalmente)</li><li>Ativo o Auto Wrap, para poder quebrar as linhas automaticamente quando chegam no fim da tela</li><li>As pr&#xF3;ximas op&#xE7;&#xF5;es desde <code>tabstop</code> at&#xE9; <code>smarttab</code> s&#xE3;o relacionadas &#xE0; configura&#xE7;&#xF2;es de tabs e espa&#xE7;os, aqui eu estou definindo que cada tab ser&#xE1; 4 espa&#xE7;os e, por padr&#xE3;o, os projetos v&#xE3;o usar 4 espa&#xE7;os de indenta&#xE7;&#xE3;o. Isso n&#xE3;o &#xE9; algo que eu gosto muito, mas infelizmente a maioria dos projetos que estou usando ultimamente est&#xE3;o usando essa configura&#xE7;&#xE3;o.</li><li>Seto uma linha mais clara onde meu cursor estiver, tanto na horizontal quanto na vertical, isso ajuda a achar mais facilmente ele na tela</li><li>A &#xFA;ltima op&#xE7;&#xE3;o &#xE9; uma altera&#xE7;&#xE3;o para que o Vim reconhe&#xE7;a a tecla Alt no Mac, que &#xE9; mapeada para o command, veja o link no coment&#xE1;rio para entender melhor como funciona</li></ul><h2 id="autocmdslua">autocmds.lua</h2><p>Outra coisa interessant&#xED;ssima do vim &#xE9; que &#xE9; poss&#xED;vel executar comandos automaticamente de acordo com hooks de execu&#xE7;&#xE3;o, por exemplo, sempre que entrar em um buffer que tenha um determinado nome, ou sempre que sair de algum buffer, e assim vai.</p><p>Eu tenho algumas fun&#xE7;&#xF5;es espec&#xED;ficas para arquivos markdown - que eu acabo usando bastante - como: setar o tipo do arquivo para markdown, definir uma linha a 80 chars para limitar o texto, etc</p><pre><code class="language-lua">-- Autocmds are automatically loaded on the VeryLazy event
-- Default autocmds that are always set: &lt;https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua&gt;
-- Add any additional autocmds here
local function augroup(name)
  return vim.api.nvim_create_augroup(&quot;custom_&quot; .. name, { clear = true })
end

-- auto set markdown filetype
vim.api.nvim_create_autocmd({ &quot;BufNewFile&quot;, &quot;BufFilePre&quot;, &quot;BufRead&quot; }, {
  pattern = { &quot;*.md&quot; },
  callback = function()
    vim.cmd(&quot;set filetype=markdown&quot;)
  end,
})

-- Auto set markdown to break at 80 chars and highlight the 80th column
vim.api.nvim_create_autocmd({ &quot;BufWinEnter&quot; }, {
  pattern = { &quot;*.md&quot; },
  callback = function()
    vim.opt.colorcolumn = &quot;80&quot;
    vim.opt.textwidth = 80
  end,
})

-- On leaving markdown files, reset the colorcolumn and textwidth
vim.api.nvim_create_autocmd({ &quot;BufWinLeave&quot; }, {
  pattern = { &quot;*.md&quot; },
  callback = function()
    vim.opt.colorcolumn = &quot;120&quot;
    -- disabled textwidth
    vim.opt.textwidth = 0
  end,
})

-- auto set i3config filetype
vim.api.nvim_create_autocmd({ &quot;BufNewFile&quot;, &quot;BufFilePre&quot;, &quot;BufRead&quot; }, {
  pattern = { &quot;*.i3config&quot; },
  callback = function()
    vim.cmd(&quot;set filetype=i3config&quot;)
  end,
})
</code></pre><p>Esse arquivo n&#xE3;o &#xE9; obrigat&#xF3;rio, e muitas vezes vai estar vazio, a n&#xE3;o ser que voc&#xEA; tenha algum tipo de comando que queira sempre rodar de acordo com algum tipo de buffer, por exemplo, sempre executar um ESLint quando tiver em um arquivo JS ou algo assim.</p><h2 id="keymapslua">keymaps.lua</h2><p>O &#xFA;ltimo dos arquivos na pasta <code>config</code> &#xE9; o arquivo <code>keymaps.lua</code>, como voc&#xEA; deve imaginar, ele tem os atalhos de teclado que voc&#xEA; quer customizar. Nesse ponto eu vou colocar o meu arquivo inteiro aqui, que &#xE9; bastante grande, mas voc&#xEA; n&#xE3;o precisa seguir exatamente o que existe aqui, fique a vontade para poder adicionar os que voc&#xEA; quiser.</p><p>Vou tentar deixar coment&#xE1;rios onde for pertinente</p><pre><code class="language-lua">-- Keym automatically loaded on the VeryLazy event
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
-- Add any additional keymaps here

-- Habilita voltar onde paramos em qualquer busca do telescope
vim.keymap.set(
  &quot;n&quot;,
  &quot;&lt;leader&gt;sx&quot;,
  require(&quot;telescope.builtin&quot;).resume,
  { noremap = true, silent = true, desc = &quot;Resume telescope search&quot; }
)

-- Move blocos de texto no Linux
vim.keymap.set(&quot;v&quot;, &quot;&lt;A-j&gt;&quot;, &quot;&lt;cmd&gt;m &apos;&gt;+1&lt;cr&gt;gv=gv&quot;, { noremap = true, silent = true, desc = &quot;Move line down&quot; })
vim.keymap.set(&quot;v&quot;, &quot;&lt;A-k&gt;&quot;, &quot;&lt;cmd&gt;m &apos;&lt;-2&lt;cr&gt;gv=gv&quot;, { noremap = true, silent = true, desc = &quot;Move line up&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&lt;A-j&gt;&quot;, &quot;:m &apos;.+1&lt;CR&gt;==&quot;, { noremap = true, silent = true, desc = &quot;Move line down&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&lt;A-k&gt;&quot;, &quot;:m &apos;.-2&lt;CR&gt;==&quot;, { noremap = true, silent = true, desc = &quot;Move line up&quot; })

-- Move blocos de texto (mac)
-- https://stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim)
vim.keymap.set(&quot;v&quot;, &quot;&#x2DA;&quot;, &quot;:m &apos;&lt;-2&lt;CR&gt;gv=gv&quot;, { noremap = true, silent = true, desc = &quot;Move line up&quot; })
vim.keymap.set(&quot;v&quot;, &quot;&#x2206;&quot;, &quot;:m &apos;&gt;+1&lt;CR&gt;gv=gv&quot;, { noremap = true, silent = true, desc = &quot;Move line down&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&#x2206;&quot;, &quot;:m &apos;.+1&lt;CR&gt;==&quot;, { noremap = true, silent = true, desc = &quot;Move line down&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&#x2DA;&quot;, &quot;:m &apos;.-2&lt;CR&gt;==&quot;, { noremap = true, silent = true, desc = &quot;Move line up&quot; })

-- Muda de janelas em modo de edi&#xE7;&#xE3;o usando tabs
vim.keymap.set(&quot;n&quot;, &quot;&lt;F8&gt;&quot;, &quot;gt&quot;, { noremap = true, silent = true, desc = &quot;Switch to next tab&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&lt;F7&gt;&quot;, &quot;gT&quot;, { noremap = true, silent = true, desc = &quot;Switch to previous tab&quot; })

-- duplica a linha atual para baixo
vim.keymap.set(&quot;n&quot;, &quot;&lt;C-S-d&gt;&quot;, &quot;yyp&quot;, { noremap = true, silent = true, desc = &quot;Duplicate line down&quot; })

-- Comandos relativos a navega&#xE7;&#xE3;o em buffers

-- Pr&#xF3;ximo buffer da lista
vim.keymap.set(&quot;n&quot;, &quot;gn&quot;, &quot;&lt;cmd&gt;bn&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Next buffer&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&lt;tab&gt;&lt;tab&gt;&quot;, &quot;&lt;cmd&gt;bn&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Next buffer&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&lt;tab&gt;n&quot;, &quot;&lt;cmd&gt;bn&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Next buffer&quot; })

-- Buffer anterior
vim.keymap.set(&quot;n&quot;, &quot;&lt;S-tab&gt;&quot;, &quot;&lt;cmd&gt;bp&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Previous buffer&quot; })
vim.keymap.set(&quot;n&quot;, &quot;gp&quot;, &quot;&lt;cmd&gt;bN&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Previous buffer&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&lt;tab&gt;p&quot;, &quot;&lt;cmd&gt;bp&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Previous buffer&quot; })

-- deletar/fechar buffer
vim.keymap.set(&quot;n&quot;, &quot;&lt;tab&gt;d&quot;, &quot;&lt;cmd&gt;bd&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Delete buffer&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&lt;tab&gt;q&quot;, &quot;&lt;cmd&gt;bd&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Delete buffer&quot; })
vim.keymap.set(&quot;n&quot;, &quot;&lt;tab&gt;w&quot;, &quot;&lt;cmd&gt;bd&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Delete buffer&quot; })

-- busca no telescope para buffers
vim.keymap.set(&quot;n&quot;, &quot;&lt;tab&gt;f&quot;, &quot;&lt;cmd&gt;Telescope buffers&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Find buffer&quot; })

-- Deleta a palavra atual com Alt+BS
-- mac (see options.lua)
vim.keymap.set(&quot;n&quot;, &quot;&lt;M-BS&gt;&quot;, &quot;hdiw&quot;, { noremap = true, silent = true, desc = &quot;Delete word&quot; })
-- linux
vim.keymap.set(&quot;n&quot;, &quot;&lt;A-BS&gt;&quot;, &quot;hdiw&quot;, { noremap = true, silent = true, desc = &quot;Delete word&quot; })

-- cmd P para encontrar arquivos
vim.keymap.set(&quot;n&quot;, &quot;&lt;C-p&gt;&quot;, &quot;&lt;cmd&gt;Telescope find_files&lt;cr&gt;&quot;, { noremap = true, silent = true, desc = &quot;Find files&quot; })

-- cria um terminal novo
local wk = require(&quot;which-key&quot;)
wk.add({
  { &quot;&lt;leader&gt;t&quot;, group = &quot;Terminals&quot; },
  {
    &quot;&lt;leader&gt;tt&quot;,
    function()
      TermNumber = (TermNumber or 0) + 1
      local term = require(&quot;toggleterm&quot;)
      term.toggle(TermNumber)
    end,
    desc = &quot;New toggle terminal&quot;,
  },
  { &quot;&lt;leader&gt;ts&quot;, &quot;&lt;cmd&gt;:TermSelect&lt;cr&gt;&quot;, desc = &quot;Find open terminals&quot; },
  { &quot;&lt;leader&gt;tf&quot;, &quot;&lt;cmd&gt;:TermSelect&lt;cr&gt;&quot;, desc = &quot;Find open terminals&quot; },
  { &quot;&lt;leader&gt;tr&quot;, &quot;&lt;cmd&gt;exe v:count1 . &apos;ToggleTermSetName&apos;&lt;cr&gt;&quot;, desc = &quot;Rename open terminals&quot; },
  {
    &quot;&lt;leader&gt;th&quot;,
    &quot;&lt;cmd&gt;exe v:count1 . &apos;ToggleTerm&apos;&lt;cr&gt;&quot;,
    desc = &quot;Toggle docked terminal (prefix number before command)&quot;,
  },
  { &quot;&lt;C-.&gt;&quot;, &quot;&lt;cmd&gt;:ToggleTerm&lt;cr&gt;&quot;, group = &quot;Terminals&quot;, desc = &quot;Toggle docked terminal&quot;, mode = { &quot;n&quot;, &quot;t&quot; } },
})

-- controle de banco de dados com o plugin DadBod
wk.add({
  { &quot;&lt;leader&gt;D&quot;, group = &quot;Database&quot; },
  { &quot;&lt;leader&gt;DD&quot;, &quot;&lt;cmd&gt;DBUI&lt;cr&gt;&quot;, desc = &quot;Toggle DBUI&quot; },
  { &quot;&lt;leader&gt;Dx&quot;, &quot;&lt;cmd&gt;call &lt;SNR&gt;79_method(&apos;execute_query&apos;)&lt;cr&gt;&quot;, desc = &quot;Run Query&quot; },
})

-- deleta uma marca do vim usando delmark
wk.add({
  { &quot;&lt;leader&gt;dm&quot;, &quot;&lt;cmd&gt;exe &apos;delmark &apos; . nr2char(getchar())&lt;cr&gt;&quot;, desc = &quot;Delete a mark &lt;markname&gt;&quot; },
})

-- Move uma linha para baixo sem entrar em modo de edi&#xE7;&#xE3;o 
wk.add({
  { &quot;&lt;leader&gt;o&quot;, &quot;o&lt;esc&gt;&quot;, desc = &quot;New line below in normal mode&quot; },
  { &quot;&lt;leader&gt;O&quot;, &quot;O&lt;esc&gt;&quot;, desc = &quot;New line above in normal mode&quot; },
})

-- Fecha todos os buffers
wk.add({
  { &quot;&lt;leader&gt;bD&quot;, &quot;&lt;cmd&gt;BufferLineCloseOthers&lt;cr&gt;&lt;cmd&gt;bd&lt;cr&gt;&quot;, desc = &quot;Close all buffers&quot; },
})</code></pre><p>A estrutura b&#xE1;sica &#xE9; <code>vim.keymap.set(&quot;modo&quot;, &quot;atalho&quot;, &quot;comando&quot;)</code>, seguido das op&#xE7;&#xF5;es para descri&#xE7;&#xE3;o do comando, se deve ou n&#xE3;o remapear e etc. Mais abaixo voc&#xEA; tem um <code>wk.add</code> que &#xE9; o WhichKey, isso permite a gente adicionar os atalhos que aparecem na barra de atalhos do WhichKey quando voc&#xEA; aperta <code>&lt;leader&gt;</code> (espa&#xE7;o no meu caso), por exemplo, eu tenho um atalho que &#xE9; <code>&lt;leader&gt;bD</code> para fechar todos os buffers, se eu apertar <code>&lt;leader&gt;b</code> voc&#xEA; vai ver que esse atalho aparece na lista tamb&#xE9;m:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/09/image.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="495" height="297"></figure><h1 id="plugins">Plugins</h1><p>Agora que acabamos todas as partes de configura&#xE7;&#xE3;o, podemos come&#xE7;ar a falar de plugins, o grande poder do Neovim com o Lazy.</p><p>Todos os plugins s&#xE3;o carregados usando o <code>lazy.nvim</code> que &#xE9;, como voc&#xEA; deve imaginar, do mesmo criador do LazyVim. A ideia do <code>lazy.nvim</code> &#xE9; que ele tem um diret&#xF3;rio chamado <code>plugins</code> na pasta <code>lua</code>, dentro dele voc&#xEA; pode criar qualquer arquivo <code>.lua</code> que retorne um dicion&#xE1;rio (ou table) nesse modelo:</p><pre><code class="language-lua">return {
  &quot;nome/do/plugin&quot;,
  event = &quot;evento para carregar se poss&#xED;vel&quot;,
  keys = {
    {
      &quot;atalho&quot;, 
      &quot;comando&quot;,
      desc = &quot;descri&#xE7;&#xE3;o do atalho&quot;
    }
  },
  config = function() 
    -- alguma coisa aqui
  end
}</code></pre><p>O nome do plugin pode ser um reposit&#xF3;rio do GitHub, por exemplo, <code>&quot;b0o/incline.nvim&quot;</code>, ou ent&#xE3;o uma URL completa de um reposit&#xF3;rio Git (&#xE9; importante que seja um Git porque o lazy vai baixar todos os seus plugins usando Git).</p><p>Voc&#xEA; pode ou n&#xE3;o definir um evento onde esse plugin &#xE9; carregado, por exemplo, um plugin para markdown n&#xE3;o faz sentido ser carregado em um arquivo JS e assim vai, mas n&#xE3;o &#xE9; obrigat&#xF3;rio. Se omitido vai ser carregado sempre na inicializa&#xE7;&#xE3;o.</p><p>Tamb&#xE9;m, opcionalmente, voc&#xEA; pode definir os atalhos relacionados &#xE0;quele plugin direto na configura&#xE7;&#xE3;o dele usando a chave <code>keys</code>, a estrutura &#xE9; a mesma do <code>keymaps.lua</code>.</p><p>No final temos a parte mais importante que s&#xE3;o as op&#xE7;&#xF5;es e configura&#xE7;&#xF5;es do plugin, essa parte pode ser uma fun&#xE7;&#xE3;o que deve retornar uma table. No geral, alguns plugins v&#xE3;o pedir que seja uma fun&#xE7;&#xE3;o que chame o m&#xE9;todo <code>setup</code> do plugin, mas se for omitida o lazy vai chamar o m&#xE9;todo <code>setup</code> sem nenhum par&#xE2;metro.</p><p>Outra op&#xE7;&#xE3;o que voc&#xEA; pode passar tamb&#xE9;m, ao inv&#xE9;s de config, uma propriedade <code>opts</code> que ser&#xE1; uma table, ou uma fun&#xE7;&#xE3;o que retorna uma table, e essa table de op&#xE7;&#xF5;es ser&#xE1; passada para o m&#xE9;todo <code>setup</code> do plugin. Vamos a dois exemplos, o primeiro &#xE9; com a propriedade <code>config</code>:</p><pre><code class="language-lua">return {
  &quot;iamcco/markdown-preview.nvim&quot;,
  cmd = { &quot;MarkdownPreviewToggle&quot;, &quot;MarkdownPreview&quot;, &quot;MarkdownPreviewStop&quot; },
  ft = { &quot;markdown&quot; },
  build = &quot;cd ~/.local/share/nvim/lazy/markdown-preview.nvim/app &amp;&amp; npm i&quot;,
  lazy = true,
  config = function()
    vim.g.mkdp_browser = &quot;vivaldi-stable&quot;
  end,
}
</code></pre><p>Veja que eu n&#xE3;o tenho uma propriedade <code>opts</code>, mas estou usando a config para poder setar automaticamente a op&#xE7;&#xE3;o global de qual browser o markdown preview vai usar. Eu poderia ter setado isso no <code>options.lua</code>, mas como isso &#xE9; relativo diretamente a esse plugin e sem ele essa configura&#xE7;&#xE3;o n&#xE3;o faz sentido, eu preferi setar por aqui mesmo.</p><p>Outro exemplo &#xE9; a configura&#xE7;&#xE3;o do meu Telescope:</p><pre><code class="language-lua">return {
  &quot;nvim-telescope/telescope.nvim&quot;,
  opts = {
    defaults = {
      path_display = { shorten = {
        len = 5,
        exclude = { 2, -1 },
      } },
    },
  },
}
</code></pre><p>Estou passando as op&#xE7;&#xF5;es como uma table que est&#xE1; dizendo para o telescope reduzir o tamanho do caminho para 5 letras e excluir tanto a segunda parte do caminho quanto a &#xFA;ltima parte dele, isso faz com que as buscas fiquem assim:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/09/image-1.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="964" height="232"></figure><p>O que &#xE9; &#xF3;timo para telas pequenas, j&#xE1; que eu n&#xE3;o preciso saber o nome completo do local, apenas as primeiras letras.</p><h2 id="meus-plugins">Meus plugins</h2><p>Eu n&#xE3;o vou listar todos os meus plugins aqui, porque seriam muitos, mas vou deixar os meus dotfiles diretamente na pasta do meu Lazy para que voc&#xEA; possa ver o que est&#xE1; acontecendo, eu optei por deixar os plugins divididos por tipo e por fun&#xE7;&#xE3;o, e n&#xE3;o por grupo como parece ser o jeito que a comunidade gosta de fazer. Eu acho muito mais f&#xE1;cil dar manuten&#xE7;&#xE3;o quando eu sei o que o plugin faz ao inv&#xE9;s de ter um arquivo com v&#xE1;rios plugins dentro agrupado por funcionalidade.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/khaosdoctor/dotfiles/tree/ba88235f73d88a5a3e0db981e2efbc433c5fee4c/general/nvim/.config/nvim?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">dotfiles/general/nvim/.config/nvim at ba88235f73d88a5a3e0db981e2efbc433c5fee4c &#xB7; khaosdoctor/dotfiles</div><div class="kg-bookmark-description">My dotFiles. Contribute to khaosdoctor/dotfiles development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="Primeiros passos com Neovim"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">khaosdoctor</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/f7d854fd58abf99296a8c013942eaa2b2af8543d3713aa28969383d76d5bcb15/khaosdoctor/dotfiles" alt="Primeiros passos com Neovim"></div></a></figure><p>Para que a gente possa ter a funcionalidade que eu prometi, deixando o seu nvim igual o meu (pelo menos na apar&#xEA;ncia), vamos precisar de alguns plugins, o primeiro deles &#xE9; o meu esquema de cores.</p><h3 id="catpuccin-e-colorschemes">Catpuccin e colorschemes</h3><p>No geral, instalar temas para o Nvim &#xE9; bem simples e voc&#xEA; pode trocar de temas no LazyVim usando <code>&lt;leader&gt;UC</code>. Para instalar um colorscheme, &#xE9; como se fossemos instalar um plugin comum, mas no final do arquivo temos que setar uma propriedade que diz ao LazyVim qual &#xE9; o plugin que vamos escolher como o colorscheme principal. Eu tenho alguns temas instalados:</p><pre><code class="language-lua">return {
  { &quot;Mofiqul/dracula.nvim&quot; },
  {
    &quot;catppuccin/nvim&quot;,
    opts = {
      flavour = &quot;macchiato&quot;,
      highlight_overrides = {
        all = function(colors)
          return {
            CurSearch = { bg = colors.sky },
            IncSearch = { bg = colors.sky },
            CursorLineNr = { fg = colors.blue, style = { &quot;bold&quot; } },
            DashboardFooter = { fg = colors.overlay0 },
            TreesitterContextBottom = { style = {} },
            WinSeparator = { fg = colors.overlay0, style = { &quot;bold&quot; } },
            [&quot;@markup.italic&quot;] = { fg = colors.blue, style = { &quot;italic&quot; } },
            [&quot;@markup.strong&quot;] = { fg = colors.blue, style = { &quot;bold&quot; } },
            Headline = { style = { &quot;bold&quot; } },
            Headline1 = { fg = colors.blue, style = { &quot;bold&quot; } },
            Headline2 = { fg = colors.pink, style = { &quot;bold&quot; } },
            Headline3 = { fg = colors.lavender, style = { &quot;bold&quot; } },
            Headline4 = { fg = colors.green, style = { &quot;bold&quot; } },
            Headline5 = { fg = colors.peach, style = { &quot;bold&quot; } },
            Headline6 = { fg = colors.flamingo, style = { &quot;bold&quot; } },
            rainbow1 = { fg = colors.blue, style = { &quot;bold&quot; } },
            rainbow2 = { fg = colors.pink, style = { &quot;bold&quot; } },
            rainbow3 = { fg = colors.lavender, style = { &quot;bold&quot; } },
            rainbow4 = { fg = colors.green, style = { &quot;bold&quot; } },
            rainbow5 = { fg = colors.peach, style = { &quot;bold&quot; } },
            rainbow6 = { fg = colors.flamingo, style = { &quot;bold&quot; } },
          }
        end,
      },
      color_overrides = {
        macchiato = {
          rosewater = &quot;#F5B8AB&quot;,
          flamingo = &quot;#F29D9D&quot;,
          pink = &quot;#AD6FF7&quot;,
          mauve = &quot;#FF8F40&quot;,
          red = &quot;#E66767&quot;,
          maroon = &quot;#EB788B&quot;,
          peach = &quot;#FAB770&quot;,
          yellow = &quot;#FACA64&quot;,
          green = &quot;#70CF67&quot;,
          teal = &quot;#4CD4BD&quot;,
          sky = &quot;#61BDFF&quot;,
          sapphire = &quot;#4BA8FA&quot;,
          blue = &quot;#00BFFF&quot;,
          lavender = &quot;#00BBCC&quot;,
          text = &quot;#ffffff&quot;,
          subtext1 = &quot;#A3AAC2&quot;,
          subtext0 = &quot;#8E94AB&quot;,
          overlay2 = &quot;#7D8296&quot;,
          overlay1 = &quot;#676B80&quot;,
          -- overlay0 = &quot;#464957&quot;, -- comments
          overlay0 = &quot;#757a92&quot;,
          surface2 = &quot;#3A3D4A&quot;,
          -- surface1 = &quot;#2F313D&quot;, -- line numbers, hovers, highlights
          surface1 = &quot;#46495b&quot;,
          surface0 = &quot;#1D1E29&quot;,
          base = &quot;#030303&quot;,
          mantle = &quot;#11111a&quot;,
          crust = &quot;#191926&quot;,
        },
      },
      integrations = {
        telescope = {
          enabled = true,
          style = &quot;nvchad&quot;,
        },
      },
    },
    name = &quot;catppuccin&quot;,
    priority = 1000,
  },
  { &quot;eldritch-theme/eldritch.nvim&quot;, lazy = false, priority = 1000, opts = {} },
  {
    &quot;maxmx03/fluoromachine.nvim&quot;,
    lazy = false,
    priority = 1000,
    opts = { glow = false, theme = &quot;fluoromachine&quot;, transparent = false },
  },
  {
    &quot;shatur/neovim-ayu&quot;,
    lazy = false,
    priority = 1000,
    config = function()
      require(&quot;ayu&quot;).setup({
        mirage = true,
        terminal = true,
      })
    end,
  },
  {
    &quot;LazyVim/LazyVim&quot;,
    opts = {
      colorscheme = &quot;catppuccin&quot;,
    },
  },
}
</code></pre><p>Como voc&#xEA; pode ver, eu sou um grande f&#xE3; de temas escuros, <strong>bem escuros</strong>. Para mim, o ideal s&#xE3;o temas que tem um alto contraste entre o fundo e a fonte. Um exemplo, muita gente usa o tema Dracula (do nosso conterr&#xE2;neo Zeno Rocha) porque &#xE9; um &#xF3;timo tema, mas para mim, o Dracula original n&#xE3;o me agradava por causa da escolha de fundo. Eu sempre usei o Dracula, por&#xE9;m eu sempre modificava a cor do fundo do editor para que ela fosse quase preta (<code>#131313</code> para ser mais exato).</p><p>No Lazy eu descobri um outro tema que chegava mais perto do que eu gostava, o <a href="https://github.com/catppuccin/nvim?ref=blog.lsantos.dev">Catppuccin</a>, uma das grandes vantagens desse tema para mim &#xE9; que ele tem as cores muito parecidas com as do Dracula, que eu acho muito legais, por&#xE9;m ele tamb&#xE9;m &#xE9; mais escuro, mas ainda sim eu deixei ele AINDA MAIS ESCURO</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/09/image-3.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1267" height="1383"></figure><p>No caso do Catppuccin, voc&#xEA; pode alterar as cores de cada parte do tema usando <code>color_overrides</code>, al&#xE9;m disso voc&#xEA; tamb&#xE9;m pode setar o &quot;flavour&quot; ou o &quot;sabor&quot; do tema, eu gosto mais do &quot;macchiato&quot; que &#xE9; o mais escuro, al&#xE9;m de que voc&#xEA; pode trocar qual cor vai em que e como ela &#xE9; definida. Eu fortemente recomendo esse tema.</p><p>Acima de tudo &#xE9; sua escolha, ent&#xE3;o n&#xE3;o &#xE9; algo que voc&#xEA; precise pensar demais, recomendo que voc&#xEA; instale a v&#xE1;rios temas e teste cada um deles para ver qual voc&#xEA; gosta mais! O importante &#xE9; que, no final de tudo voc&#xEA; tenha essa chamada:</p><pre><code class="language-vim">  {
    &quot;LazyVim/LazyVim&quot;,
    opts = {
      colorscheme = &quot;seu tema&quot;,
    },
  }</code></pre><h3 id="dashboard">Dashboard</h3><p>Para ter o dashboard customizado com um logo diferente, e at&#xE9; mesmo op&#xE7;&#xF5;es diferentes, o Lazy usa um projeto chamado Alpha.nvim, que &#xE9; um gerador de dashboards, essencialmente o que eu fiz foi copiar a configura&#xE7;&#xE3;o original do do LazyVim que est&#xE1; nesse reposit&#xF3;rio:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/plugins/extras/ui/alpha.lua?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">LazyVim/lua/lazyvim/plugins/extras/ui/alpha.lua at main &#xB7; LazyVim/LazyVim</div><div class="kg-bookmark-description">Neovim config for the lazy. Contribute to LazyVim/LazyVim development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="Primeiros passos com Neovim"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">LazyVim</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/583706111/7fc50ada-aecc-4ba7-99a9-18c3d31fcf6f" alt="Primeiros passos com Neovim"></div></a></figure><p>E modificar o logo. Todo o resto eu deixei igual porque eu acho que as op&#xE7;&#xF5;es s&#xE3;o bem pertinentes e me ajudam bastante, para gerar o logo eu procurei um gerador de ASCII art, este <a href="https://patorjk.com/software/taag/?ref=blog.lsantos.dev#p=display&amp;f=ANSI%20Regular&amp;t=lsantos.dev">aqui</a> foi exatamente o que eu usei. Ele tem v&#xE1;rias op&#xE7;&#xF5;es de fontes e letras e ai &#xE9; uma quest&#xE3;o de voc&#xEA; ser criativo. Para substituir o logo basta remover o logo do Lazy e colar o seu pr&#xF3;prio logo, lembrando que seu terminal deve suportar os caracteres ANSI se voc&#xEA; escolheu essa fonte:</p><figure class="kg-card kg-image-card"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/09/image-4.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="1414" height="857"></figure><h3 id="lualine">LuaLine</h3><p>O Lualine &#xE9; um plugin muito legal que adiciona v&#xE1;rias coisas interessantes na parte de baixo do seu editor, como o branch do git, a pasta que voc&#xEA; est&#xE1;, n&#xFA;mero de erros e avisos, caminho, &#xFA;ltimo comando, e outras coisas. Al&#xE9;m disso &#xE9; totalmente customiz&#xE1;vel e voc&#xEA; pode adicionar o que voc&#xEA; quiser nela. No meu caso essa &#xE9; a configura&#xE7;&#xE3;o:</p><figure class="kg-card kg-image-card kg-width-full"><img src="https://raw.githubusercontent.com/khaosdoctor/blog-assets/master/images/2024/09/image-5.png" class="kg-image" alt="Primeiros passos com Neovim" loading="lazy" width="2554" height="41"></figure><p>Para n&#xE3;o adicionar um arquivo super longo por aqui, vou deixar o link para o reposit&#xF3;rio na revis&#xE3;o atual:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/khaosdoctor/dotfiles/blob/4532db19eca517ccc6205fa22826aa8854d88d20/general/nvim/.config/nvim/lua/plugins/lualine.lua?ref=blog.lsantos.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">dotfiles/general/nvim/.config/nvim/lua/plugins/lualine.lua at 4532db19eca517ccc6205fa22826aa8854d88d20 &#xB7; khaosdoctor/dotfiles</div><div class="kg-bookmark-description">My dotFiles. Contribute to khaosdoctor/dotfiles development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="Primeiros passos com Neovim"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">khaosdoctor</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/6cce0506ba4023628e229214c6fe705c33a2f3341c11daf9112275d3fbe5d5ed/khaosdoctor/dotfiles" alt="Primeiros passos com Neovim"></div></a></figure><h1 id="conclus%C3%A3o">Conclus&#xE3;o</h1><p>Foi um artigo longo mas agora voc&#xEA; consegue instalar e configurar o seu Neovim para come&#xE7;ar a usar o poder que ele tem. Estamos longe de estar prontos e de acabar toda essa configura&#xE7;&#xE3;o, mas o importante &#xE9; que voc&#xEA; sinta que esse editor &#xE9; o seu editor e voc&#xEA; se sinta em casa com ele.</p><p>Eu ainda quero mostrar muito mais coisas por aqui relacionadas ao Neovim e como eu pessoalmente uso esse editor, al&#xE9;m de mostrar tudo que eu aprendi ao longo do tempo (e continuo aprendendo) usando Vim, mas isso vai ficar para uma outra hora!</p><p>Se voc&#xEA; curtiu esse artigo me d&#xE1; um oi l&#xE1; nas minhas <a href="https://lsantos.dev/?ref=blog.lsantos.dev" rel="noreferrer">redes sociais</a> e me fala o que voc&#xEA; quer ver mais aqui no blog!</p>]]></content:encoded></item></channel></rss>