<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Bruno Magalhães Prates Pereira</title>
    <description>The latest articles on Forem by Bruno Magalhães Prates Pereira (@brunompp).</description>
    <link>https://forem.com/brunompp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3512239%2F54d016a4-2285-4b01-89cd-03d9d091e75a.jpeg</url>
      <title>Forem: Bruno Magalhães Prates Pereira</title>
      <link>https://forem.com/brunompp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/brunompp"/>
    <language>en</language>
    <item>
      <title>From Working Code to Efficient Code: Big O in Practice with C#</title>
      <dc:creator>Bruno Magalhães Prates Pereira</dc:creator>
      <pubDate>Fri, 03 Oct 2025 16:41:55 +0000</pubDate>
      <link>https://forem.com/brunompp/from-working-code-to-efficient-code-big-o-in-practice-with-c-hcj</link>
      <guid>https://forem.com/brunompp/from-working-code-to-efficient-code-big-o-in-practice-with-c-hcj</guid>
      <description>&lt;p&gt;From Working Code to Efficient Code: Big O in Practice with C#&lt;br&gt;
Many times, we write code that "works" and solves the immediate problem. But is it efficient?&lt;/p&gt;

&lt;p&gt;Efficiency is not just about running fast: it involves scalability, memory usage, and how the system behaves as the amount of data grows. That's where Big O comes in. A way to understand how an algorithm's performance changes as input size increases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Basics of Big O
&lt;/h3&gt;

&lt;p&gt;Big O describes the complexity of an algorithm in relation to the input size n. &lt;br&gt;
Some classic examples:&lt;br&gt;
&lt;strong&gt;O(1) - Constant:&lt;/strong&gt; execution time doesn't change with input size. Example: accessing an array element by index.&lt;br&gt;
&lt;strong&gt;O(n) - Linear:&lt;/strong&gt; time grows proportionally with input size. Example: iterating through a list.&lt;br&gt;
&lt;strong&gt;O(n²) - Quadratic:&lt;/strong&gt; grows with the square of the input size. Example: nested loops.&lt;br&gt;
&lt;strong&gt;O(log n) - Logarithmic:&lt;/strong&gt; grows much slower than O(n). Example: binary search on a sorted array.&lt;br&gt;
&lt;strong&gt;O(n log n) - Linearithmic:&lt;/strong&gt; common in efficient sorting algorithms, like MergeSort or QuickSort.&lt;/p&gt;

&lt;p&gt;The goal isn't to measure milliseconds but to understand growth trends: will your algorithm keep performing well, or will it break down as your data grows?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Price of Poorly Optimized Software
&lt;/h2&gt;

&lt;p&gt;When we talk about optimization, many people think it's just about "making the system faster." But the impact is much bigger: poorly optimized software brings financial, technical, and even reputational costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Direct Financial Costs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;More infrastructure:&lt;/strong&gt; inefficient code demands extra CPU, memory, and servers.&lt;br&gt;
&lt;strong&gt;Higher cloud bills:&lt;/strong&gt; in Azure or AWS, every extra second of execution has a price.&lt;br&gt;
&lt;strong&gt;Expensive scalability:&lt;/strong&gt; an O(n²) algorithm may force a company to scale sooner than expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Indirect Costs That Slow Teams Down
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Blocked development:&lt;/strong&gt; the team wastes time fighting performance bottlenecks instead of delivering new features.&lt;br&gt;
&lt;strong&gt;Growing complexity:&lt;/strong&gt; optimizing too late often means risky, large refactors.&lt;br&gt;
&lt;strong&gt;Rework:&lt;/strong&gt; sometimes the only option is rewriting entire modules. Always more expensive than planning right from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  User and Business Impact
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bad experience:&lt;/strong&gt; slow screens kill user satisfaction.&lt;br&gt;
&lt;strong&gt;Customer loss:&lt;/strong&gt; in e-commerce, even a few extra seconds of load time can reduce conversions.&lt;br&gt;
&lt;strong&gt;Reputation:&lt;/strong&gt; sluggish software signals lack of quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Imagine a daily report that takes 30 minutes to run because it uses List.Contains (O(n)) across millions of records.&lt;br&gt;
 By switching to HashSet.Contains (O(1)), execution time drops to 30 seconds.&lt;br&gt;
 Less waiting, lower CPU usage, and reduced infrastructure costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Apply Big O in Legacy Systems
&lt;/h2&gt;

&lt;p&gt;With legacy systems, you can't just rewrite everything from scratch. The key is to be surgical: find where performance really matters and focus there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I Need to Analyze the Entire Codebase?
&lt;/h2&gt;

&lt;p&gt;Definitely not.&lt;br&gt;
 Reviewing every single line is impractical. The better approach is &lt;strong&gt;evidence-driven:&lt;/strong&gt; measure, identify real bottlenecks, then analyze complexity.&lt;br&gt;
And here's where the Pareto Principle (80/20) comes in:&lt;br&gt;
 👉 Usually, 80% of execution time is spent in just 20% of the code.&lt;br&gt;
 In other words, start with the critical parts, the ones that really move the needle.&lt;/p&gt;

&lt;h3&gt;
  
  
  New Projects: Avoiding Performance Traps
&lt;/h3&gt;

&lt;p&gt;Starting a project from scratch gives you the advantage of planning properly from day one. That doesn't mean over-engineering early, but being aware of potential risks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preventive Mindset from the Architecture Onward
&lt;/h2&gt;

&lt;p&gt;Think about scalability early: today it's 100 records, tomorrow it could be millions.&lt;br&gt;
Question your data structures: need key-value lookups? Use Dictionary. Need fast lookups? Use HashSet.&lt;br&gt;
Don't overcomplicate too soon: keep it simple, but avoid obvious pitfalls like quadratic loops in contexts that can grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices to Start Right
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use LINQ carefully:&lt;/strong&gt; long chains can cause multiple hidden iterations.&lt;br&gt;
&lt;strong&gt;Pick the right structures:&lt;/strong&gt; HashSet for fast lookups, SortedDictionary when you need automatic ordering, and so on.&lt;br&gt;
&lt;strong&gt;Database matters:&lt;/strong&gt; often the bottleneck isn't in C#, but in unindexed or unpaginated SQL queries.&lt;br&gt;
&lt;strong&gt;Measure early:&lt;/strong&gt; logging execution times, memory usage, and simple metrics helps avoid surprises in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Refactoring Smartly: Organizing the Team and Using the Right Tools
&lt;/h3&gt;

&lt;p&gt;Refactoring and optimization aren't just technical work. they require team organization and the right tooling.&lt;br&gt;
Identify and Prioritize the Real Bottlenecks&lt;br&gt;
Slow reports, screens that lag, nightly jobs that never finish.&lt;br&gt;
&lt;strong&gt;Collect data:&lt;/strong&gt; profiling, logs, and user feedback.&lt;br&gt;
&lt;strong&gt;Prioritize by impact:&lt;/strong&gt; sometimes an O(n²) method isn't the problem, an O(n) method running over millions of records can be far worse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free and Accessible Tools That Make a Difference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Visual Studio Diagnostic Tools (Free)&lt;/strong&gt; - included in Community Edition.&lt;br&gt;
&lt;strong&gt;PerfView (Free)&lt;/strong&gt; - open source from Microsoft itself.&lt;br&gt;
&lt;strong&gt;dotTrace (JetBrains)&lt;/strong&gt; - paid, but free for open source.&lt;br&gt;
&lt;strong&gt;Roslyn Analyzers (Free)&lt;/strong&gt; - flags inefficient patterns in code.&lt;br&gt;
&lt;strong&gt;SonarQube Community (Free)&lt;/strong&gt; - highlights code smells and complexity.&lt;br&gt;
&lt;strong&gt;BenchmarkDotNet (Free)&lt;/strong&gt; - perfect for comparing implementations.&lt;/p&gt;

&lt;p&gt;These tools help replace guesswork with hard data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turn Bottlenecks Into a Performance Backlog
&lt;/h3&gt;

&lt;p&gt;Each identified issue should become a backlog item with description, evidence, and a proposed fix. That way, the team works transparently and systematically.&lt;br&gt;
Refactor in Small, Measurable Steps&lt;br&gt;
No "big bang" rewrites. Optimize, measure, validate. Small gains accumulate safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Involve the Entire Team (It's Not Just the Dev's Job)
&lt;/h2&gt;

&lt;p&gt;Developers refactor.&lt;br&gt;
QA ensures nothing breaks.&lt;br&gt;
DevOps monitors production.&lt;br&gt;
Product Owners help prioritize.&lt;/p&gt;

&lt;h3&gt;
  
  
  Establish a Continuous Performance Cycle
&lt;/h3&gt;

&lt;p&gt;Make performance part of the Definition of Done.&lt;br&gt;
Monitor actively.&lt;br&gt;
Create internal guidelines so bad practices don't creep back in.&lt;/p&gt;

&lt;p&gt;A piece of code that "just works" may be costing you more than you think - in infrastructure, team time, and user experience.&lt;br&gt;
 Big O isn't an academic detail; it's a mindset that helps you make smarter decisions in both legacy and new projects.&lt;br&gt;
In the end, the key is simple: measure, prioritize, and optimize what truly matters.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>csharp</category>
      <category>performance</category>
    </item>
    <item>
      <title>Do Código que Funciona ao Código Eficiente: Big O na Prática com C#</title>
      <dc:creator>Bruno Magalhães Prates Pereira</dc:creator>
      <pubDate>Fri, 03 Oct 2025 16:39:52 +0000</pubDate>
      <link>https://forem.com/brunompp/do-codigo-que-funciona-ao-codigo-eficiente-big-o-na-pratica-com-c-37a2</link>
      <guid>https://forem.com/brunompp/do-codigo-que-funciona-ao-codigo-eficiente-big-o-na-pratica-com-c-37a2</guid>
      <description>&lt;p&gt;Muitas vezes, escrevemos um código que “funciona” e resolve o problema imediato. Mas será que ele é eficiente?&lt;/p&gt;

&lt;p&gt;Eficiência não é apenas rodar rápido: envolve escalabilidade, uso de memória e como o sistema se comporta conforme a quantidade de dados cresce. É aí que entra o Big O: uma forma de entender como a performance de um algoritmo muda à medida que o tamanho da entrada aumenta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendendo os Fundamentos do Big O
&lt;/h2&gt;

&lt;p&gt;O Big O descreve a complexidade de um algoritmo em relação ao tamanho da entrada &lt;em&gt;n&lt;/em&gt;. Alguns exemplos clássicos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O(1) – Constante:&lt;/strong&gt; o tempo de execução não muda com o tamanho da entrada. Ex.: acessar um elemento de array pelo índice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O(n) – Linear:&lt;/strong&gt; o tempo cresce proporcionalmente ao tamanho da entrada. Ex.: iterar uma lista.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O(n²) – Quadrática:&lt;/strong&gt; cresce com o quadrado da entrada. Ex.: loops aninhados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O(log n) – Logarítmica:&lt;/strong&gt; cresce bem mais devagar que O(n). Ex.: busca binária em array ordenado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O(n log n) – Linearítmica:&lt;/strong&gt; comum em algoritmos de ordenação eficientes, como MergeSort ou QuickSort.&lt;/p&gt;

&lt;p&gt;O objetivo não é medir milissegundos, mas entender tendências de crescimento: seu algoritmo continuará performando bem ou vai colapsar conforme os dados aumentam?&lt;/p&gt;

&lt;h2&gt;
  
  
  O Preço de um Software Mal Otimizado
&lt;/h2&gt;

&lt;p&gt;Quando falamos em otimização, muitos pensam apenas em “deixar o sistema mais rápido”. Mas o impacto é muito maior: software ineficiente traz custos financeiros, técnicos e até reputacionais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custos Financeiros Diretos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mais infraestrutura:&lt;/strong&gt; código ineficiente exige mais CPU, memória e servidores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Faturas maiores na nuvem:&lt;/strong&gt; em Azure ou AWS, cada segundo extra de execução tem preço.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalabilidade cara:&lt;/strong&gt; um algoritmo O(n²) pode forçar a empresa a escalar antes do esperado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custos Indiretos que Travem as Equipes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Desenvolvimento bloqueado:&lt;/strong&gt; o time perde tempo apagando incêndios em performance em vez de entregar novas features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complexidade crescente:&lt;/strong&gt; otimizar tarde demais significa grandes refatorações arriscadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrabalho:&lt;/strong&gt; às vezes a única saída é reescrever módulos inteiros — sempre mais caro que planejar certo desde o início.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto no Usuário e no Negócio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Má experiência:&lt;/strong&gt; telas lentas destroem a satisfação do usuário.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perda de clientes:&lt;/strong&gt; em e-commerce, poucos segundos a mais no carregamento reduzem conversões.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reputação:&lt;/strong&gt; software lento transmite falta de qualidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo Prático
&lt;/h2&gt;

&lt;p&gt;Imagine um relatório diário que leva 30 minutos para rodar porque usa &lt;code&gt;List.Contains&lt;/code&gt; (O(n)) em milhões de registros.&lt;br&gt;
Ao trocar para &lt;code&gt;HashSet.Contains&lt;/code&gt; (O(1)), o tempo cai para 30 segundos.&lt;br&gt;
Menos espera, menos uso de CPU e custos menores de infraestrutura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como Aplicar Big O em Sistemas Legados
&lt;/h2&gt;

&lt;p&gt;Em sistemas legados, não dá para reescrever tudo do zero. O segredo é ser cirúrgico: identificar onde a performance realmente importa e focar ali.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preciso Analisar Todo o Código?
&lt;/h2&gt;

&lt;p&gt;Definitivamente não.&lt;br&gt;
Revisar cada linha é impraticável. A melhor abordagem é &lt;strong&gt;guiada por evidências:&lt;/strong&gt; medir, identificar gargalos reais e só então analisar a complexidade.&lt;/p&gt;

&lt;p&gt;Aqui entra o Princípio de Pareto (80/20):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Geralmente, 80% do tempo de execução está em apenas 20% do código.&lt;br&gt;
Ou seja: comece pelas partes críticas, as que realmente movem a agulha.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Projetos Novos: Evitando Armadilhas de Performance
&lt;/h2&gt;

&lt;p&gt;Começar do zero dá a vantagem de planejar desde o início. Isso não significa superengenharia precoce, mas estar consciente dos riscos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mentalidade Preventiva desde a Arquitetura
&lt;/h2&gt;

&lt;p&gt;Pense em escalabilidade desde cedo: hoje são 100 registros, amanhã podem ser milhões.&lt;/p&gt;

&lt;p&gt;Questione suas estruturas de dados: precisa de buscas chave-valor? Use &lt;code&gt;Dictionary&amp;lt;TKey, TValue&amp;gt;&lt;/code&gt;. Precisa de consultas rápidas? Use &lt;code&gt;HashSet&amp;lt;T&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Não complique demais cedo demais: mantenha simples, mas evite armadilhas óbvias como loops quadráticos em contextos que podem crescer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boas Práticas para Começar Bem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use LINQ com cuidado:&lt;/strong&gt; cadeias longas podem gerar iterações ocultas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escolha as estruturas certas:&lt;/strong&gt; HashSet para buscas rápidas, SortedDictionary quando precisar de ordenação automática, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Banco de dados importa:&lt;/strong&gt; muitas vezes o gargalo não está no C#, mas em queries SQL sem índice ou sem paginação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meça cedo:&lt;/strong&gt; logar tempo de execução, uso de memória e métricas simples ajuda a evitar surpresas em produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refatorando de Forma Inteligente: Organização e Ferramentas
&lt;/h2&gt;

&lt;p&gt;Refatorar e otimizar não é só trabalho técnico; exige organização do time e boas ferramentas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identifique e Priorize os Verdadeiros Gargalos
&lt;/h2&gt;

&lt;p&gt;Relatórios lentos, telas que travam, jobs noturnos que nunca acabam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Colete dados:&lt;/strong&gt; profiling, logs, feedback de usuários.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priorize pelo impacto:&lt;/strong&gt; às vezes um método O(n²) não é o vilão, enquanto um O(n) rodando sobre milhões de registros é muito pior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ferramentas Gratuitas e Acessíveis que Fazem Diferença
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Visual Studio Diagnostic Tools (Grátis)&lt;/strong&gt; – incluso na Community Edition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PerfView (Grátis)&lt;/strong&gt; – open source da própria Microsoft.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;dotTrace (JetBrains)&lt;/strong&gt; – pago, mas gratuito para projetos open source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roslyn Analyzers (Grátis)&lt;/strong&gt; – detecta padrões ineficientes no código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SonarQube Community (Grátis)&lt;/strong&gt; – destaca code smells e complexidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BenchmarkDotNet (Grátis)&lt;/strong&gt; – perfeito para comparar implementações.&lt;/p&gt;

&lt;p&gt;Essas ferramentas ajudam a substituir achismos por dados concretos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transformando Gargalos em um Backlog de Performance
&lt;/h2&gt;

&lt;p&gt;Cada problema identificado deve virar um item de backlog com descrição, evidência e proposta de correção. Assim, o time atua de forma transparente e sistemática.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refatore em Passos Pequenos e Mensuráveis
&lt;/h2&gt;

&lt;p&gt;Nada de “big bang” rewrites. Otimize, meça, valide. Pequenos ganhos contínuos acumulam com segurança.&lt;/p&gt;

&lt;h2&gt;
  
  
  Envolva Todo o Time (Não é só Trabalho do Dev)
&lt;/h2&gt;

&lt;p&gt;Devs refatoram.&lt;/p&gt;

&lt;p&gt;QA garante que nada quebre.&lt;/p&gt;

&lt;p&gt;DevOps monitora produção.&lt;/p&gt;

&lt;p&gt;Product Owners ajudam a priorizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estabeleça um Ciclo Contínuo de Performance
&lt;/h2&gt;

&lt;p&gt;Inclua performance na Definition of Done.&lt;/p&gt;

&lt;p&gt;Monitore de forma ativa.&lt;/p&gt;

&lt;p&gt;Crie diretrizes internas para evitar que más práticas voltem.&lt;/p&gt;

&lt;p&gt;Um código que “apenas funciona” pode estar custando muito mais do que você imagina — em infraestrutura, tempo do time e experiência do usuário.&lt;/p&gt;

&lt;p&gt;O Big O não é detalhe acadêmico: é uma mentalidade que ajuda a tomar decisões mais inteligentes, tanto em sistemas legados quanto em projetos novos.&lt;/p&gt;

&lt;p&gt;No fim, a chave é simples: medir, priorizar e otimizar o que realmente importa.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>csharp</category>
      <category>performance</category>
    </item>
    <item>
      <title>Big O Made Simple: My First Encounter with Performance in C#</title>
      <dc:creator>Bruno Magalhães Prates Pereira</dc:creator>
      <pubDate>Tue, 23 Sep 2025 21:08:33 +0000</pubDate>
      <link>https://forem.com/brunompp/big-o-made-simple-my-first-encounter-with-performance-in-c-l6n</link>
      <guid>https://forem.com/brunompp/big-o-made-simple-my-first-encounter-with-performance-in-c-l6n</guid>
      <description>&lt;p&gt;If there's one thing every developer has heard, it's: "first make it work, then optimize". And it's true, you can't write the most performant code in the world if it doesn't actually solve the problem.&lt;br&gt;
But there comes a point in your journey when just "working" isn't enough. That's when I stumbled upon the famous Big O Notation. At first, it seemed like a monster with seven heads - full of letters and graphs that didn't make much sense. But when I started applying it to my code, I realized it wasn't just some college theory: it actually makes a real difference in day-to-day programming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Big O Is (in Simple Terms)&lt;/strong&gt;&lt;br&gt;
Big O Notation is a way to describe an algorithm's efficiency in relation to the growth of its input.&lt;br&gt;
The name comes from "Order of," meaning the "growth order" of an algorithm. The O() in the notation is a mathematical way of saying:&lt;br&gt;
"As the number of inputs grows, the time or space required by the algorithm grows in this order."&lt;br&gt;
So, when we say an algorithm is O(n), we mean its execution time grows proportionally to the number of input elements (n). Meanwhile, O(1) means the time doesn't change, regardless of input size.&lt;br&gt;
👉 In other words, the O symbol is like a label indicating how the cost of the algorithm grows.&lt;br&gt;
 We're not worried about the exact time in seconds, but about its behavior as the data size increases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main Types of Big O with C# Examples&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O(1) - Constant&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt; Time doesn't depend on input size.&lt;br&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Best type of complexity, extremely fast and scalable.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Not always possible; depends on the problem.&lt;br&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Accessing an array element by index: arr[5]&lt;br&gt;
 &lt;strong&gt;C# Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int x = numbers[5];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O(n) - Linear&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt; Grows proportionally to the number of items. &lt;br&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Usually acceptable for large inputs. &lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Can be slow if the input is huge. &lt;br&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Iterating through all items in a list &lt;br&gt;
&lt;strong&gt;C# Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foreach (var n in numbers) { 
    Console.WriteLine(n); 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O(n²) - Quadratic&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt; Grows quickly due to nested loops. &lt;br&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Easy to implement, but generally only suitable for small inputs. &lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Worst complexity here; not scalable for large inputs. &lt;br&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Nested loops &lt;br&gt;
&lt;strong&gt;C# Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foreach (var a in numbers) { 
    foreach (var b in numbers) { 
        if(a != b){ /* ... */ }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O(log n) - Logarithmic&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt; Grows slowly, even with large inputs. &lt;br&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Very efficient; grows slowly even with large data sets. &lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Usually requires data to be specially structured (like a tree or sorted array). &lt;br&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Binary search in a sorted array &lt;br&gt;
&lt;strong&gt; C# Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int BinarySearch(List&amp;lt;int&amp;gt; list, int target) { 
    int left = 0, right = list.Count - 1; 
    while(left &amp;lt;= right){ 
        int mid = (left + right) / 2; 
        if(list[mid] == target) return mid; 
        if(list[mid] &amp;lt; target) left = mid + 1; 
        else right = mid - 1; 
    } 
    return -1; 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O(n log n) - Linearithmic&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;: More efficient than O(n²), often used in sorting. &lt;br&gt;
&lt;strong&gt;Pros&lt;/strong&gt;: Acceptable for most inputs; great for tasks like sorting. &lt;br&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: Slower than linear or logarithmic, but still scalable. &lt;br&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Efficient sorting algorithms, like MergeSort or QuickSort (average case) &lt;br&gt;
&lt;strong&gt;C# Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var sorted = numbers.OrderBy(x =&amp;gt; x).ToList();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
In practice, Big O helped me understand that not all code scales well.&lt;br&gt;
 Two algorithms can solve the exact same problem, but one stays fast even with millions of records, while the other becomes practically unusable.&lt;br&gt;
Knowing this made me start looking at my code differently.&lt;br&gt;
 It's no longer just: "does it work?", but also: "will it still work well if the data grows 10x or 100x?".&lt;/p&gt;

</description>
      <category>performance</category>
      <category>programming</category>
      <category>csharp</category>
      <category>learning</category>
    </item>
    <item>
      <title>Big O sem mistério: meu primeiro contato com performance no C#</title>
      <dc:creator>Bruno Magalhães Prates Pereira</dc:creator>
      <pubDate>Tue, 23 Sep 2025 20:53:22 +0000</pubDate>
      <link>https://forem.com/brunompp/big-o-sem-misterio-meu-primeiro-contato-com-performance-no-c-3n0i</link>
      <guid>https://forem.com/brunompp/big-o-sem-misterio-meu-primeiro-contato-com-performance-no-c-3n0i</guid>
      <description>&lt;p&gt;Se tem uma coisa que todo desenvolvedor já ouviu é: &lt;em&gt;“primeiro faz funcionar, depois otimiza”&lt;/em&gt;. E é verdade, não adianta escrever o código mais performático do mundo se ele não resolve o problema.  &lt;/p&gt;

&lt;p&gt;Mas chega um momento da jornada em que apenas “funcionar” não é suficiente. Foi aí que eu esbarrei na famosa &lt;strong&gt;Big O Notation&lt;/strong&gt;. No começo, parecia um bicho de sete cabeças, cheio de letras e gráficos que não faziam muito sentido. Mas quando comecei a aplicar no meu código, percebi que não era só teoria de faculdade: fazia diferença de verdade no dia a dia.  &lt;/p&gt;




&lt;h2&gt;
  
  
  O que é Big O (de forma simples)
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Big O Notation&lt;/strong&gt; é uma forma de descrever a &lt;strong&gt;eficiência de um algoritmo&lt;/strong&gt; em relação ao crescimento da entrada de dados.  &lt;/p&gt;

&lt;p&gt;O nome vem de “&lt;strong&gt;Order of&lt;/strong&gt;”, ou seja, a “ordem de crescimento” do algoritmo. O &lt;strong&gt;O()&lt;/strong&gt; que aparece na notação é uma forma matemática de dizer:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“À medida que o número de entradas cresce, o tempo ou espaço necessário pelo algoritmo cresce nessa ordem aqui.”  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Então, quando dizemos que um algoritmo é &lt;strong&gt;O(n)&lt;/strong&gt;, estamos dizendo que o tempo de execução cresce de forma proporcional ao número de elementos de entrada (&lt;em&gt;n&lt;/em&gt;). Já &lt;strong&gt;O(1)&lt;/strong&gt; significa que o tempo não muda, independentemente do tamanho da entrada.  &lt;/p&gt;

&lt;p&gt;👉 Ou seja, o símbolo &lt;strong&gt;O&lt;/strong&gt; é como um rótulo para indicar &lt;strong&gt;qual é a taxa de crescimento do custo do algoritmo&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Não estamos preocupados com o tempo exato em segundos, mas sim com o &lt;strong&gt;comportamento&lt;/strong&gt; quando a quantidade de dados cresce.  &lt;/p&gt;


&lt;h2&gt;
  
  
  Principais tipos de Big O com exemplos em C
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O(1) — Constante&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsiy8cdtld855a47lhvn1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsiy8cdtld855a47lhvn1.png" alt="O tempo não depende do tamanho da entrada." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicação&lt;/strong&gt;: O tempo não depende do tamanho da entrada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prós&lt;/strong&gt;: É o melhor tipo de complexidade, extremamente rápido e escalável.&lt;br&gt;
&lt;strong&gt;Contras&lt;/strong&gt;: Nem sempre é possível; depende do problema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;: Acessar um elemento de um array por índice: arr[5].&lt;br&gt;
&lt;strong&gt;Exemplo em C#&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int x = numbers[5];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;O(n) — Linear&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi34ej5vesue0q8ok4bg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi34ej5vesue0q8ok4bg7.png" alt="Cresce proporcionalmente ao número de itens" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicação&lt;/strong&gt;: Cresce proporcionalmente ao número de itens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prós&lt;/strong&gt;: Geralmente aceitável para inputs grandes.&lt;br&gt;
&lt;strong&gt;Contras&lt;/strong&gt;: Pode ser lento se a entrada for gigante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;: Percorrer todos os elementos de uma lista:&lt;br&gt;
&lt;strong&gt;Exemplo em C#:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foreach (var n in numbers) { 
    Console.WriteLine(n); 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;O(n²) — Quadrática&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczv1pf271lklketrja2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczv1pf271lklketrja2p.png" alt="Cresce rapidamente por loops aninhados" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicação&lt;/strong&gt;: Cresce rapidamente por loops aninhados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prós&lt;/strong&gt;: Fácil de implementar, mas geralmente só serve para entradas pequenas.&lt;br&gt;
&lt;strong&gt;Contras&lt;/strong&gt;: Pior tipo de complexidade aqui; não escalável para entradas grandes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;: Duplo loop aninhado:&lt;br&gt;
&lt;strong&gt;Exemplo em C#:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foreach (var a in numbers) { 
    foreach (var b in numbers) { 
        if(a != b){ /* ... */ }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;O(log n) — Logarítmica&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wj56dcsjomw8g17ooco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wj56dcsjomw8g17ooco.png" alt="Cresce devagar, mesmo com entradas grandes" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicação&lt;/strong&gt;: Cresce devagar, mesmo com entradas grandes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prós&lt;/strong&gt;: Muito eficiente; cresce devagar, mesmo com grandes entradas.&lt;br&gt;
&lt;strong&gt;Contras&lt;/strong&gt;: Normalmente exige que os dados estejam estruturados de forma especial (como árvore ou array ordenado).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;: Busca binária em um array ordenado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo em C#:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int BinarySearch(List&amp;lt;int&amp;gt; list, int target) { 
    int left = 0, right = list.Count - 1; 
    while(left &amp;lt;= right){ 
        int mid = (left + right) / 2; 
        if(list[mid] == target) return mid; 
        if(list[mid] &amp;lt; target) left = mid + 1; 
        else right = mid - 1; 
    } 
    return -1; 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;O(n log n) — Linearítmica&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqv7t9c06xre3hkcpv8u3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqv7t9c06xre3hkcpv8u3.png" alt="Mais eficiente que O(n²), usada em ordenação" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicação&lt;/strong&gt;: Mais eficiente que O(n²), usada em ordenação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prós&lt;/strong&gt;: Aceitável para a maioria dos inputs; boa para tarefas como ordenação.&lt;br&gt;
&lt;strong&gt;Contras&lt;/strong&gt;: Mais lento que linear ou logarítmico, mas ainda escalável.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;: Algoritmos de ordenação eficientes, como MergeSort ou QuickSort (médio caso).&lt;br&gt;
&lt;strong&gt;Exemplo em C#:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var sorted = numbers.OrderBy(x =&amp;gt; x).ToList();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Gráficos gerados pelo ChatGPT para ajudar a visualizar cada caso.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Por que isso importa?
&lt;/h2&gt;

&lt;p&gt;Na prática, Big O me ajudou a entender que &lt;strong&gt;nem todo código escala bem&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Dois algoritmos podem resolver exatamente o mesmo problema, mas um deles continua rápido mesmo com milhões de registros, enquanto o outro fica praticamente inutilizável.  &lt;/p&gt;

&lt;p&gt;Saber disso me fez começar a olhar para meu código de outra forma.&lt;br&gt;&lt;br&gt;
Não era só: &lt;em&gt;“isso funciona?”&lt;/em&gt;, mas também: &lt;em&gt;“isso continua funcionando bem quando os dados crescerem 10x ou 100x?”&lt;/em&gt;.  &lt;/p&gt;

</description>
      <category>performance</category>
      <category>programming</category>
      <category>csharp</category>
      <category>learning</category>
    </item>
    <item>
      <title>How Writing Articles and Joining Communities Can Transform Your Journey as a Developer</title>
      <dc:creator>Bruno Magalhães Prates Pereira</dc:creator>
      <pubDate>Thu, 18 Sep 2025 21:33:02 +0000</pubDate>
      <link>https://forem.com/brunompp/how-writing-articles-and-joining-communities-can-transform-your-journey-as-a-developer-2ekm</link>
      <guid>https://forem.com/brunompp/how-writing-articles-and-joining-communities-can-transform-your-journey-as-a-developer-2ekm</guid>
      <description>&lt;p&gt;If there’s one thing everyone working in tech has noticed, it’s that learning never stops. There’s always a new framework, a trending language, or even a different approach to solving old problems. That’s great, but it can also be exhausting. And many people end up asking themselves: how do I keep growing without getting lost in this sea of information?&lt;/p&gt;

&lt;p&gt;One answer I’ve found — and that I see other devs discovering too — is simple: &lt;strong&gt;share knowledge&lt;/strong&gt;. Writing articles and participating in developer communities not only helps others but also keeps you motivated and engaged in your own learning journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning by Teaching
&lt;/h2&gt;

&lt;p&gt;Have you ever thought you understood a concept, but when you tried to explain it to someone, realized you didn’t fully master it? That’s where writing articles makes a difference. When you put what you’ve learned on paper (or screen), you need to organize your ideas, review the theory, and sometimes even research points you hadn’t fully grasped before.&lt;/p&gt;

&lt;p&gt;Publishing your work on platforms like Medium, Dev.to, or LinkedIn acts like a showcase: it shows not just what you know, but &lt;strong&gt;how you think&lt;/strong&gt;. And the best part? Someone usually comments, bringing a new perspective or suggesting a different approach. That kind of exchange is gold for anyone looking to grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of Communities
&lt;/h2&gt;

&lt;p&gt;On the other side, we have communities. Anyone who’s participated in forums, Discord groups, or in-person events knows how much it matters to have people to exchange experiences with.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You discover different ways to solve the same problem.
&lt;/li&gt;
&lt;li&gt;You learn by helping those who are just starting out.
&lt;/li&gt;
&lt;li&gt;And, bonus, you end up making connections that can turn into friendships, collaborative projects, and even job opportunities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s the classic &lt;strong&gt;“no one grows alone.”&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting Small is Part of the Journey
&lt;/h2&gt;

&lt;p&gt;Something many forget is that no one starts by writing deep-dive articles or getting dozens of interactions right away. At first, it’s normal to publish and get few views or comments. That shouldn’t discourage you.&lt;/p&gt;

&lt;p&gt;Another important point: &lt;strong&gt;it’s okay to write about things “everyone already knows” or topics someone else has already shared&lt;/strong&gt;. Explaining a &lt;code&gt;for&lt;/code&gt; loop, covering basic C# best practices, or showing how to set up an Angular project might seem trivial, but there will always be someone learning right now who benefits from your perspective.&lt;/p&gt;

&lt;p&gt;Also, everyone explains things differently, and sometimes it’s your way of explaining that unlocks understanding for someone else. That’s how a sense of belonging is built: starting with simple topics and, over time, gaining confidence to tackle more advanced subjects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pressure of Competition
&lt;/h2&gt;

&lt;p&gt;Let’s be honest: the tech market is highly competitive. There will always be someone who knows more than you in a certain area, and companies are looking for increasingly well-rounded professionals. That can be intimidating.&lt;/p&gt;

&lt;p&gt;But here’s the thing: it’s not just about stacking tools on your resume. What really makes a difference is showing that you can &lt;strong&gt;learn continuously, communicate effectively, and collaborate well&lt;/strong&gt;. Writing articles and participating in communities is a practical way to demonstrate exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impostor Syndrome: A Ghost Many Devs Face
&lt;/h2&gt;

&lt;p&gt;With so much competition, it’s common to fall into impostor syndrome — that annoying voice saying: &lt;em&gt;“You’re not good enough”&lt;/em&gt;, &lt;em&gt;“Look at how many devs are better than you”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I’ve been there myself (and so have most devs I know). The good news is that sharing knowledge helps you deal with it. When you write something that helps someone else, you realize that yes, you &lt;strong&gt;have a lot to contribute&lt;/strong&gt;. When you get positive feedback from a community, that insecurity eases a bit. Over time, it turns into confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  At the End of the Day...
&lt;/h2&gt;

&lt;p&gt;Learning programming can be a lonely journey, but it doesn’t have to be. Writing articles and connecting with communities makes the process much lighter and more motivating. You learn more, help others, make connections, and even find ways to stand out in a competitive market.&lt;/p&gt;

&lt;p&gt;And don’t forget: &lt;strong&gt;starting small is part of the process&lt;/strong&gt;. Sharing the basics today can pave the way for writing about complex topics tomorrow. More than growing alone, you realize you’re part of something bigger — and that’s what keeps the spark of learning alive.&lt;/p&gt;

&lt;p&gt;This article is also available in Portuguese - Brazil [&lt;a href="https://dev.to/brunompp/como-escrever-artigos-e-participar-de-comunidades-pode-transformar-sua-jornada-como-desenvolvedor-dje"&gt;https://dev.to/brunompp/como-escrever-artigos-e-participar-de-comunidades-pode-transformar-sua-jornada-como-desenvolvedor-dje&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>dev</category>
      <category>programming</category>
      <category>learning</category>
      <category>career</category>
    </item>
    <item>
      <title>Como escrever artigos e participar de comunidades pode transformar sua jornada como desenvolvedor</title>
      <dc:creator>Bruno Magalhães Prates Pereira</dc:creator>
      <pubDate>Thu, 18 Sep 2025 21:28:07 +0000</pubDate>
      <link>https://forem.com/brunompp/como-escrever-artigos-e-participar-de-comunidades-pode-transformar-sua-jornada-como-desenvolvedor-dje</link>
      <guid>https://forem.com/brunompp/como-escrever-artigos-e-participar-de-comunidades-pode-transformar-sua-jornada-como-desenvolvedor-dje</guid>
      <description>&lt;p&gt;Se tem uma coisa que todo mundo que trabalha com tecnologia já percebeu é que o aprendizado nunca para. Sempre surge um framework novo, uma linguagem em alta ou até uma abordagem diferente para resolver problemas antigos. Isso é ótimo, mas também pode ser cansativo. E muita gente acaba se perguntando: como continuar evoluindo sem se perder nesse mar de informações?&lt;/p&gt;

&lt;p&gt;Uma resposta que eu encontrei e que vejo outros devs também descobrindo, é bem simples: &lt;strong&gt;compartilhar conhecimento&lt;/strong&gt;. Escrever artigos e participar de comunidades de desenvolvimento não só ajuda os outros, mas também mantém a gente motivado e engajado a seguir aprendendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aprendendo enquanto ensina
&lt;/h2&gt;

&lt;p&gt;Já aconteceu de você achar que entendeu um conceito, mas quando foi explicar para alguém, percebeu que não dominava tanto assim? É aí que escrever artigos faz diferença. Quando você coloca no papel (ou na tela) aquilo que aprendeu, precisa organizar as ideias, revisar a teoria e até pesquisar pontos que antes tinham passado batido.&lt;/p&gt;

&lt;p&gt;Além disso, publicar textos em lugares como Medium, Dev.to ou LinkedIn funciona como uma espécie de vitrine: mostra o que você sabe e, principalmente, como você pensa. E o melhor: sempre aparece alguém comentando, trazendo um ponto novo ou até sugerindo outra abordagem. Esse tipo de troca é ouro para quem quer crescer.&lt;/p&gt;

&lt;h2&gt;
  
  
  O valor das comunidades
&lt;/h2&gt;

&lt;p&gt;Do outro lado, temos as comunidades. Quem já participou de fóruns, grupos no Discord ou eventos presenciais sabe bem a diferença que faz ter gente para trocar experiências.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você descobre formas diferentes de resolver o mesmo problema.
&lt;/li&gt;
&lt;li&gt;Aprende ajudando quem está começando.
&lt;/li&gt;
&lt;li&gt;E, de quebra, acaba fazendo contatos que podem virar amizades, projetos em conjunto e até oportunidades de trabalho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É aquele famoso &lt;strong&gt;“ninguém cresce sozinho”&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Começar devagar também é parte da jornada
&lt;/h2&gt;

&lt;p&gt;Algo que muitos esquecem é que ninguém começa escrevendo artigos superprofundos ou ganhando dezenas de interações logo de cara. Na verdade, no início é normal publicar e ter poucas visualizações ou comentários. Isso não deve ser motivo para desanimar.&lt;/p&gt;

&lt;p&gt;Outro ponto importante: não há problema em escrever sobre coisas que “todo mundo já sabe” ou que você já viu outras pessoas compartilharem. Explicar um &lt;code&gt;for&lt;/code&gt;, falar sobre boas práticas básicas em C# ou mostrar como configurar um projeto em Angular pode parecer trivial, mas sempre vai ter alguém que está aprendendo agora e que vai se beneficiar do seu conteúdo.&lt;/p&gt;

&lt;p&gt;Além disso, cada pessoa explica de um jeito, e às vezes é justamente a sua forma de explicar que vai destravar o entendimento de alguém. É assim que se constrói a sensação de pertencimento: começando com temas simples e, com o tempo, ganhando confiança para abordar tópicos mais avançados.&lt;/p&gt;

&lt;h2&gt;
  
  
  O peso da competição
&lt;/h2&gt;

&lt;p&gt;Agora, vamos ser sinceros: o mercado de tecnologia é supercompetitivo. Sempre vai existir alguém que sabe mais do que você em determinada área, e as empresas estão em busca de profissionais cada vez mais completos. Isso pode ser assustador.&lt;/p&gt;

&lt;p&gt;Mas aqui está o ponto: não é só sobre acumular ferramentas no currículo. O que realmente faz diferença é mostrar que você tem capacidade de aprender continuamente, se comunicar bem e colaborar. E escrever artigos ou participar de comunidades é uma forma prática de destacar exatamente isso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Síndrome do impostor: o fantasma de muitos devs
&lt;/h2&gt;

&lt;p&gt;Com tanta competição, não é raro cair na armadilha da síndrome do impostor. É aquela voz chata dizendo: &lt;em&gt;“Você não sabe o suficiente”&lt;/em&gt;, &lt;em&gt;“Olha só quantos devs são melhores que você”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Eu mesmo já passei por isso (e a maioria dos devs que conheço também). A boa notícia é que compartilhar conhecimento ajuda a lidar com isso. Quando você escreve algo que ajuda outra pessoa, percebe que, sim, você tem muito a contribuir. Quando recebe um feedback positivo em uma comunidade, aquela insegurança diminui um pouco. Com o tempo, isso se transforma em confiança.&lt;/p&gt;

&lt;h2&gt;
  
  
  No fim das contas...
&lt;/h2&gt;

&lt;p&gt;Aprender programação pode ser uma jornada solitária, mas não precisa ser. Escrever artigos e se conectar com comunidades transforma esse processo em algo muito mais leve e motivador. Você aprende mais, ajuda outras pessoas, cria conexões e ainda encontra maneiras de se destacar em um mercado competitivo.&lt;/p&gt;

&lt;p&gt;E não esqueça: &lt;strong&gt;começar pequeno faz parte do processo&lt;/strong&gt;. Compartilhar o básico hoje pode abrir caminho para escrever sobre assuntos complexos amanhã. Mais do que crescer sozinho, você percebe que faz parte de algo maior. E isso, no fundo, é o que mantém a chama do aprendizado sempre acesa.&lt;/p&gt;

&lt;p&gt;Este artigo também está disponível em inglês [&lt;a href="https://dev.to/brunompp/how-writing-articles-and-joining-communities-can-transform-your-journey-as-a-developer-2ekm"&gt;https://dev.to/brunompp/how-writing-articles-and-joining-communities-can-transform-your-journey-as-a-developer-2ekm&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>dev</category>
      <category>programming</category>
      <category>learning</category>
      <category>career</category>
    </item>
  </channel>
</rss>
