<?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>DEV Community: Sylwia Laskowska</title>
    <description>The latest articles on DEV Community by Sylwia Laskowska (@sylwia-lask).</description>
    <link>https://dev.to/sylwia-lask</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3535771%2Fe22860d5-274b-43c9-819b-56b162e5bd5a.jpeg</url>
      <title>DEV Community: Sylwia Laskowska</title>
      <link>https://dev.to/sylwia-lask</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sylwia-lask"/>
    <language>en</language>
    <item>
      <title>AI Is Already Better at Coding Than Most Software Developers</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 10 Sep 2026 07:17:46 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/ai-is-already-better-at-coding-than-most-software-developers-4hno</link>
      <guid>https://dev.to/sylwia-lask/ai-is-already-better-at-coding-than-most-software-developers-4hno</guid>
      <description>&lt;p&gt;...but let me say this right away: &lt;strong&gt;coding was never the most valuable part of software engineering.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I remember when I was a junior software dev. Nothing came easily to me. Every feature felt like an uphill battle. I can't even count how many hours I spent digging through Stack Overflow. And then there was the stress of PR reviews, where I sometimes got absolutely roasted in the comments (rightfully so!) 😅&lt;/p&gt;

&lt;p&gt;Eventually, things started getting better and better. Shipping features took me less time, and there were fewer comments on my pull requests. Over time, I started handling more complex things, including architecture. I could choose the right solution, explain why a particular tool or design pattern made sense, and defend my decisions.&lt;/p&gt;

&lt;p&gt;And I loved being good at coding.&amp;nbsp;Domain knowledge or architectural concerns? Those were somewhere in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then Coding Stopped Being the Hard Part
&lt;/h2&gt;

&lt;p&gt;The longer I worked as a developer, the more complicated the problems became, and the less they had to do with coding itself.&lt;/p&gt;

&lt;p&gt;I stopped getting excited about every new framework feature. In fact, whenever I heard about another "revolutionary" solution, my first thought became something along the lines of:&amp;nbsp;&lt;em&gt;"Yet another state management solution..."&amp;nbsp;&lt;/em&gt;(I'll probably write a whole article about that someday.)&lt;/p&gt;

&lt;p&gt;Eventually, I ended up where every tech lead eventually ends up: spending most of my time thinking things through, sitting in calls, and getting people to agree on things, while handing coding tasks to juniors and mids.&amp;nbsp;Much to their delight, actually, because they're happy to get a chance to learn something new.&lt;/p&gt;

&lt;p&gt;Fortunately, I still code quite a lot, but these days it's usually the more horizontal stuff or the technically difficult features.&lt;/p&gt;

&lt;p&gt;And that's exactly the point in my career when the AI revolution arrived.&lt;/p&gt;

&lt;h2&gt;
  
  
  And I Welcomed AI With Open Arms
&lt;/h2&gt;

&lt;p&gt;I was genuinely happy about it!&amp;nbsp;I'm not crying over the fact that I no longer have to handcraft every precious little piece of artisanal code myself.&amp;nbsp;I didn't particularly want to anyway.&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/nazar-boyko"&gt;@nazar-boyko&lt;/a&gt; recently asked in his article, "&lt;a href="https://dev.to/nazar-boyko/has-ai-made-you-a-lazier-developer-be-honest-5ack"&gt;Has AI Made You A Lazier Developer? Be Honest.&lt;/a&gt;"&amp;nbsp;I answered honestly: no. Quite the opposite.&amp;nbsp;&lt;strong&gt;AI has made me less lazy.&amp;nbsp;&lt;/strong&gt;I do more because I don't have to spend as much time on the most boring part: writing redundant code.&lt;/p&gt;

&lt;p&gt;And in my opinion, &lt;strong&gt;AI is already better at shipping code than most software developers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is actual research behind this, some of which I've linked at the bottom of this article, so you can check that I'm not just making things up. 😉&amp;nbsp;The research shows that AI can dramatically accelerate coding and that frontier AI agents can already complete some coding tasks that would take humans days or even weeks.&lt;/p&gt;

&lt;p&gt;And we often see this in our own work.&amp;nbsp;AI doesn't get tired. It doesn't get stressed. It doesn't get distracted. It doesn't have a "bad day."&amp;nbsp;(Okay, sometimes I swear it does )&lt;/p&gt;

&lt;h2&gt;
  
  
  Not All Developers Are Equally Good at Coding
&lt;/h2&gt;

&lt;p&gt;And let's face another uncomfortable truth: there are better and worse developers.&lt;/p&gt;

&lt;p&gt;I know that's not particularly pleasant to say, but it's simply true.&amp;nbsp;Some people are better at cooking. Some are better at singing. Some are exceptional at coding.&amp;nbsp;And some are... a little less exceptional.&lt;/p&gt;

&lt;p&gt;Sometimes I get the impression that here on DEV, we treat programmers as some kind of meritocratic class of geniuses. As if every developer, by definition, possesses an extraordinary set of irreplaceable skills.&amp;nbsp;But everyone who has spent enough time in this industry knows that's simply not true.&lt;/p&gt;

&lt;p&gt;And AI might actually &lt;strong&gt;level the playing field&lt;/strong&gt; here.&amp;nbsp;A developer who isn't an exceptional coder but is responsible, understands the product really well, makes good decisions, and knows what needs to be built can now go incredibly far.&lt;/p&gt;

&lt;h2&gt;
  
  
  But There's One Tiny Little Detail
&lt;/h2&gt;

&lt;p&gt;There's just one small, tiny detail.&amp;nbsp;Something we intuitively understand, and something the research I've linked below also hints at:&amp;nbsp;&lt;strong&gt;The further the job moves away from simply generating code, the less spectacular the machine's advantage over humans becomes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In an older study, experienced developers actually worked &lt;strong&gt;SLOWER&lt;/strong&gt; when using AI.&lt;/p&gt;

&lt;p&gt;More recent results suggest that newer AI tools probably do speed them up, but the effect is nowhere near as straightforward or spectacular as the raw coding benchmarks might make you think.&lt;/p&gt;

&lt;p&gt;In general, the more the work depends on experience, judgment, coordination, and higher-level decisions, the less useful "how fast can this thing generate code?" becomes as a measure of productivity.&lt;/p&gt;

&lt;p&gt;And I know exactly why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five Minutes of Coding. Four Days of Engineering.
&lt;/h2&gt;

&lt;p&gt;Recently, I had to introduce a change to an application that would probably take a coding agent — even a not particularly brilliant one — about five minutes to implement.&lt;/p&gt;

&lt;p&gt;So what was the problem?&amp;nbsp;Discussing &lt;strong&gt;WHAT that change should actually look like&lt;/strong&gt;, coordinating it with all the teams involved, and agreeing on the final solution with the client took &lt;strong&gt;FOUR DAYS&lt;/strong&gt;.&amp;nbsp;During those four days, the decisions changed several times.&lt;/p&gt;

&lt;p&gt;And let me add something important here: having a developer in those meetings, and preferably an experienced one, was absolutely necessary.&lt;/p&gt;

&lt;p&gt;The implementation took five minutes.&amp;nbsp;Figuring out &lt;strong&gt;what should be implemented&lt;/strong&gt; took four days.&amp;nbsp;&lt;strong&gt;And that is exactly the difference between coding and software engineering.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding Is Becoming Cheaper. Engineering Isn't.
&lt;/h2&gt;

&lt;p&gt;See what I'm getting at?&amp;nbsp;AI is taking repetitive, derivative work off our shoulders.&amp;nbsp;It does that work faster than we do. Often better than we do. It doesn't get tired while doing it, and it doesn't get stressed.&lt;/p&gt;

&lt;p&gt;And because of that, the skills the market needs from developers are shifting.&amp;nbsp;If all you can do is code, and an agent can now do that faster and better, you might soon have a problem on the job market.&lt;/p&gt;

&lt;p&gt;But if you feel like an agent can do the work you used to give to your junior developers, while you still have to guide it by the hand when it comes to details, architecture, trade-offs, and all the weird little realities of an actual production system,&amp;nbsp;you're in a very different position.&lt;/p&gt;

&lt;p&gt;Mine, for example, generated a dropdown today that was permanently open and literally couldn't be collapsed. 🤣&lt;/p&gt;

&lt;p&gt;If you understand the bigger picture, know how to make technical decisions, understand the product, and aren't afraid of innovation, your job is probably safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At least for now. 😅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So yes, AI getting better at coding doesn't make software engineers less valuable. It makes coding itself less valuable as a software engineering skill.&lt;/p&gt;

&lt;p&gt;BTW if you liked this post, you can also &lt;a href="https://www.linkedin.com/in/sylwia-laskowska-5a8467131/" rel="noopener noreferrer"&gt;follow me on LinkedIn&lt;/a&gt;. &lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading &amp;amp; Research
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;METR&lt;/strong&gt; &lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;METR&lt;/strong&gt; &lt;a href="https://metr.org/blog/2026-02-24-uplift-update/" rel="noopener noreferrer"&gt;https://metr.org/blog/2026-02-24-uplift-update/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;METR&lt;/strong&gt; &lt;a href="https://metr.org/blog/2026-04-10-mirrorcode-preliminary-results/" rel="noopener noreferrer"&gt;https://metr.org/blog/2026-04-10-mirrorcode-preliminary-results/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NBER&lt;/strong&gt; &lt;a href="https://www.nber.org/papers/w35275" rel="noopener noreferrer"&gt;https://www.nber.org/papers/w35275&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>What’s the Fastest React Data Grid? Let’s Find Out (Benchmarks)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Mon, 07 Sep 2026 07:30:31 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/whats-the-fastest-react-data-grid-lets-find-out-benchmarks-58c4</link>
      <guid>https://dev.to/sylwia-lask/whats-the-fastest-react-data-grid-lets-find-out-benchmarks-58c4</guid>
      <description>&lt;p&gt;Web development has changed a lot. We have LLMs, AI-assisted coding, etc.&amp;nbsp;But some things remain the same: &lt;strong&gt;architecture and performance&lt;/strong&gt;.&amp;nbsp;And one of the classic problems in many applications is presenting large amounts of data, which eventually leads to choosing the right data grid.&lt;/p&gt;

&lt;p&gt;I've always been surprised by how quickly this happens. You start working on a seemingly simple application, and a few months later you realize that, sorry, a regular HTML table just doesn't cut it anymore. You need something more serious.&lt;/p&gt;

&lt;p&gt;Of course, no reasonable developer is going to build an enterprise-grade data grid from scratch. Your job is to focus on your business domain and use tools that have already been built, optimized, and battle-tested for problems like this.&lt;/p&gt;

&lt;p&gt;Luckily, we have plenty of grids to choose from.&lt;/p&gt;

&lt;p&gt;So imagine you're building a React application and need to choose a data grid.&amp;nbsp;&lt;strong&gt;Which of the popular options available today is actually the fastest?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Six Contenders
&lt;/h2&gt;

&lt;p&gt;This article was created in collaboration with &lt;a href="https://www.1771technologies.com/" rel="noopener noreferrer"&gt;1771 Technologies&lt;/a&gt;, the creators of &lt;a href="https://www.1771technologies.com/demo" rel="noopener noreferrer"&gt;LyteNyte Grid&lt;/a&gt;.&amp;nbsp;We'll put LyteNyte up against the five most downloaded React data grids on npm that meet the benchmark requirements.&lt;/p&gt;

&lt;p&gt;So our six contenders are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LyteNyte Grid&lt;/strong&gt; — a performance-focused React data grid developed by 1771 Technologies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AG Grid&lt;/strong&gt; — probably one of the best-known enterprise data grids, with support for multiple frameworks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MUI X Data Grid&lt;/strong&gt; — the data grid from the Material UI ecosystem, with both free and commercial editions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevExtreme&lt;/strong&gt; — DevExpress's component suite, which includes a feature-rich React data grid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handsontable&lt;/strong&gt; — a spreadsheet-like data grid with a strong focus on editing and Excel-like interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material React Table&lt;/strong&gt; — a popular React data grid built on top of TanStack Table and Material UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1771 Technologies set out to demonstrate that their grid is the fastest. To do that, they created a whole suite of benchmarks comparing rendering performance across different operations and dataset sizes. Sometimes with frankly absurd amounts of data.&lt;/p&gt;

&lt;p&gt;And yes: &lt;strong&gt;these benchmarks were created by the company whose grid wins them.&lt;/strong&gt; There is, however, a rather important detail.&amp;nbsp;The entire benchmark suite is open source.&amp;nbsp;You can inspect the methodology, download the code, modify the tests, and run everything yourself. In fact, the authors explicitly encourage you to reproduce the benchmarks and draw your own conclusions.&lt;/p&gt;

&lt;p&gt;Which is exactly what I did.&amp;nbsp;But we'll get to that in a moment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/1771-Technologies/react-data-grid-benchmarking" rel="noopener noreferrer"&gt;Check out the original benchmark repository on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Official Results: Who Won?
&lt;/h2&gt;

&lt;p&gt;The original benchmark contains 13 scenarios covering vertical scrolling, sorting, filtering, pinned rows and columns, horizontal scrolling, and full dataset updates. Tests start at 10,000 rows and, in the most extreme case, go all the way to &lt;strong&gt;one million rows&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scrolling
&lt;/h3&gt;

&lt;p&gt;This is where LyteNyte Grid achieved some of its most spectacular results.&lt;/p&gt;

&lt;p&gt;In the official benchmark environment, LyteNyte maintained approximately &lt;strong&gt;60 FPS across every tested dataset size, including one million rows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;MUI and AG Grid were much closer at smaller scales, but their performance decreased as the datasets grew. At one million rows, MUI dropped to around &lt;strong&gt;33 FPS&lt;/strong&gt;, while AG Grid reached around &lt;strong&gt;27 FPS&lt;/strong&gt;. DevExtreme stayed relatively consistent but much slower, while Material React Table recorded the lowest scrolling FPS. Handsontable couldn't complete the largest tests on the benchmark machine because of memory limitations.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa5yxp3opbz8mqztsazg3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa5yxp3opbz8mqztsazg3.png" alt="Scrolling performance" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sorting &amp;amp; Filtering
&lt;/h3&gt;

&lt;p&gt;Sorting was more demanding for everyone.&lt;/p&gt;

&lt;p&gt;No grid maintained 60 FPS across all sorting scenarios, but LyteNyte still delivered the highest performance at every tested dataset size. AG Grid scaled particularly well between 50K and 100K rows, while Handsontable's performance dropped significantly as the dataset grew.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ve95bcu75cmd2ofun1s.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ve95bcu75cmd2ofun1s.png" alt="Sorting performance" width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Filtering showed a similar pattern. At 100K rows, LyteNyte achieved around &lt;strong&gt;45 FPS&lt;/strong&gt;, with AG Grid second at around &lt;strong&gt;36 FPS&lt;/strong&gt;. MUI remained competitive but trailed both, while the differences between the remaining grids became much more pronounced as the dataset increased.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdhi0r6pbtcyr27caoi4o.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdhi0r6pbtcyr27caoi4o.png" alt="Filtering performance" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pinned Rows, Horizontal Scrolling &amp;amp; Updates
&lt;/h3&gt;

&lt;p&gt;Some of the more interesting results came from scenarios that resemble real enterprise-grid usage: pinned rows and columns, horizontal scrolling, and replacing entire datasets.&lt;/p&gt;

&lt;p&gt;With pinned content, LyteNyte achieved around &lt;strong&gt;58 FPS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Horizontal scrolling was actually a much closer race: LyteNyte reached 60 FPS, AG Grid 57 FPS, and MUI 55 FPS. All three handled horizontal virtualization well.&lt;/p&gt;

&lt;p&gt;Full dataset replacement separated them again. LyteNyte achieved around &lt;strong&gt;51 FPS&lt;/strong&gt;, followed by AG Grid at 39 FPS and MUI at 22 FPS.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo24hsy2l5qv1wbpe8t8u.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo24hsy2l5qv1wbpe8t8u.png" alt="Pinned rows, horizontal strolling and updates" width="799" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check out the complete results here:&amp;nbsp;&lt;a href="https://www.1771technologies.com/blog/performance-benchmarks" rel="noopener noreferrer"&gt;Full React data grid performance benchmark results&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I recommend it if you enjoy detailed data about grid performance.&amp;nbsp;Or if you simply love &lt;strong&gt;walls of charts&lt;/strong&gt;&amp;nbsp;😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Okay, But Can We Trust a Vendor Benchmark?
&lt;/h2&gt;

&lt;p&gt;I don't trust anyone. 😏&lt;/p&gt;

&lt;p&gt;So the first thing I did was fork the repository and run the benchmarks myself, with a slightly modified methodology.&amp;nbsp;My benchmarks were very... unscientific. I didn't turn my computer into a sterile benchmarking environment. I didn't run the tests on some dedicated pipeline with perfectly controlled CPU resources.&lt;/p&gt;

&lt;p&gt;Why?&amp;nbsp;Because I wanted to see whether LyteNyte's advantage would survive under much less friendly conditions.&amp;nbsp;A real user doesn't have a perfectly clean CPU waiting exclusively for your grid. They have 80 browser tabs open, Spotify running in the background, an Excel spreadsheet somewhere, and probably three other applications doing mysterious things with their RAM.&lt;/p&gt;

&lt;p&gt;So I simply ran the benchmarks on my normal machine, while continuing to do other things in the background.&lt;/p&gt;

&lt;p&gt;The goal wasn't to reproduce 1771 Technologies' exact FPS numbers. That wouldn't make much sense anyway: benchmark results naturally vary between machines, browsers, and system load.&amp;nbsp;I wanted to see whether the &lt;strong&gt;performance advantage would survive in a noisy, everyday environment&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Formula 1 Cars, a Passat, a Fiat Panda...
&lt;/h2&gt;

&lt;p&gt;After running the benchmarks locally, I quickly decided I wasn't going to test all six grids.&amp;nbsp;Instead, I focused on the three strongest overall performers.&lt;/p&gt;

&lt;p&gt;Don't get me wrong: I completely understand why 1771 Technologies selected the grids they did. Apart from LyteNyte, they chose the five most downloaded eligible React grids on npm. It's hardly their fault that those are the grids people download. &lt;/p&gt;

&lt;p&gt;But looking at some of the official results, I couldn't shake the feeling that I was watching a race between &lt;strong&gt;three Formula 1 cars, an old Volkswagen Passat, a Fiat Panda, and someone who had decided to compete on foot.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;So I ultimately tested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LyteNyte Grid&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AG Grid&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MUI X Data Grid&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also reduced the benchmark from &lt;strong&gt;50 recorded iterations to 10&lt;/strong&gt; and skipped the most extreme scenarios, such as scrolling through one million rows.&amp;nbsp;If you want to see exactly what I changed — or run my version yourself — here's my fork:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sylwia-lask/react-data-grid-benchmarking/tree/benchmark-experiments" rel="noopener noreferrer"&gt;My benchmark experiments on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Results
&lt;/h2&gt;

&lt;p&gt;And this is where things get interesting.&amp;nbsp;My absolute numbers were very different from the official benchmark results.&amp;nbsp;Which is completely expected.&lt;/p&gt;

&lt;p&gt;Take the simplest example: &lt;strong&gt;Scroll 10K&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the official environment, LyteNyte was close to &lt;strong&gt;60 FPS&lt;/strong&gt;.&amp;nbsp;On my machine? The median of my ten runs was only around &lt;strong&gt;37 FPS&lt;/strong&gt;. AG Grid achieved around &lt;strong&gt;23 FPS&lt;/strong&gt;, and MUI around &lt;strong&gt;21 FPS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's a huge difference in absolute numbers.&amp;nbsp;But the relative result?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LyteNyte → AG Grid → MUI.&lt;/strong&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ezkswecget9khbgntgw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ezkswecget9khbgntgw.png" alt="My scroll 10k result" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same pattern appeared when I increased the dataset to 200K rows. LyteNyte's median was around &lt;strong&gt;33 FPS&lt;/strong&gt;, compared with roughly &lt;strong&gt;20 FPS for AG Grid&lt;/strong&gt; and &lt;strong&gt;17 FPS for MUI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pinned rows produced a similar result: approximately &lt;strong&gt;31 FPS for LyteNyte&lt;/strong&gt;, &lt;strong&gt;20 FPS for AG Grid&lt;/strong&gt;, and &lt;strong&gt;17 FPS for MUI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Horizontal scrolling was faster for everyone, but LyteNyte still led with a median of roughly &lt;strong&gt;48 FPS&lt;/strong&gt;, followed by AG Grid at &lt;strong&gt;39 FPS&lt;/strong&gt; and MUI at &lt;strong&gt;27 FPS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's how the median FPS from my 10 runs per benchmark compared:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;LyteNyte Grid&lt;/th&gt;
&lt;th&gt;AG Grid&lt;/th&gt;
&lt;th&gt;MUI X Data Grid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scroll 10K&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;37.2 FPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;23.1 FPS&lt;/td&gt;
&lt;td&gt;20.9 FPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scroll 200K&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;33.0 FPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;19.9 FPS&lt;/td&gt;
&lt;td&gt;17.1 FPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinned 200K&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31.0 FPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20.1 FPS&lt;/td&gt;
&lt;td&gt;17.0 FPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Horizontal 50K&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.0 FPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;39.1 FPS&lt;/td&gt;
&lt;td&gt;27.0 FPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sorting 10K&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30.5 FPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20.1 FPS&lt;/td&gt;
&lt;td&gt;29.5 FPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not every result reproduced the exact ranking between the other two grids — and that's important.&lt;/p&gt;

&lt;p&gt;For example, in my &lt;strong&gt;Sorting 10K&lt;/strong&gt; test, LyteNyte and MUI were almost tied at roughly &lt;strong&gt;30.5 and 29.5 FPS&lt;/strong&gt;, while AG Grid was around &lt;strong&gt;20 FPS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I'm not claiming that every benchmark produced exactly the same ordering.&lt;/p&gt;

&lt;p&gt;What &lt;em&gt;did&lt;/em&gt; survive remarkably well was the broader pattern: &lt;strong&gt;LyteNyte remained the strongest performer across the tests I reran&lt;/strong&gt;, even though I used a different machine, fewer iterations, and deliberately less controlled conditions.&lt;/p&gt;

&lt;p&gt;And that's much more interesting to me than reproducing exactly the same FPS number.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjrn6q69bhl9q7jb4j0sc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjrn6q69bhl9q7jb4j0sc.png" alt="Chart my full benchmark results" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed Isn't Everything
&lt;/h2&gt;

&lt;p&gt;Of course, you shouldn't choose a data grid based only on how fast it can scroll through 200,000 rows.&lt;/p&gt;

&lt;p&gt;There are plenty of other things to consider: accessibility, developer experience, APIs, licensing, pricing, and simply whether the grid supports the things your particular application needs.&lt;/p&gt;

&lt;p&gt;The original benchmark authors make the same point: these results measure runtime performance, not overall product quality.&amp;nbsp;And LyteNyte has plenty to offer outside raw performance as well. You can check out its features and available editions on the &lt;a href="https://www.1771technologies.com/" rel="noopener noreferrer"&gt;LyteNyte Grid website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What don't I like about it?&lt;/p&gt;

&lt;p&gt;The biggest limitation for me is that &lt;strong&gt;LyteNyte is React-only&lt;/strong&gt;.&amp;nbsp;That's perfectly fine if you're building a React application, but it immediately rules the grid out for developers working with another framework. AG Grid, for example, supports React, Angular, Vue, and plain JavaScript.&lt;/p&gt;

&lt;p&gt;So, what's the fastest React data grid?&amp;nbsp;In these benchmarks, the answer is pretty clear: &lt;strong&gt;LyteNyte&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Does that mean you should immediately replace every grid in your applications with it? Of course not. Performance is only one part of the decision.&lt;/p&gt;

&lt;p&gt;But if performance &lt;em&gt;is&lt;/em&gt; your bottleneck, LyteNyte is definitely worth testing against your own workload.&amp;nbsp;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>performance</category>
      <category>webperf</category>
    </item>
    <item>
      <title>20 Agentic AI Terms Every Developer Should Know (Explained Simply)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 03 Sep 2026 06:44:57 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/20-agentic-ai-terms-every-developer-should-know-explained-simply-jii</link>
      <guid>https://dev.to/sylwia-lask/20-agentic-ai-terms-every-developer-should-know-explained-simply-jii</guid>
      <description>&lt;p&gt;Do you ever feel like the AI world has moved forward a little &lt;em&gt;too&lt;/em&gt; quickly?&amp;nbsp;You hear about self-healing systems and autonomous agents and start wondering whether we've already built Skynet or everyone around you is just messing with you. When someone mentions HITL or MCP, you no longer know whether it's some secret code used by an AI cult or maybe the stage names of famous DJs.&lt;/p&gt;

&lt;p&gt;You're not alone! 😉&lt;/p&gt;

&lt;p&gt;In this article, I'm deliberately using a lot of simplifications.&amp;nbsp;My assumption is simple: either you already know these terms and don't need another five-paragraph academic explanation, or you don't really know what they mean. And in that case, the last thing you need is an academic definition.&lt;/p&gt;

&lt;p&gt;And yes, this is already my third listicle in a row.&amp;nbsp;Believe me, this is NOT some growth hacking strategy xDDD. Pure coincidence.&amp;nbsp;It just so happens that in two weeks (HOLY SH*T!!!), I'll be speaking at &lt;strong&gt;AGNTCon + MCPCon Europe&lt;/strong&gt;, where I was invited because of &lt;a href="https://dev.to/sylwia-lask/is-this-how-well-build-websites-soon-webmcp-live-demo--2e33"&gt;this wonderful article&lt;/a&gt; that I wrote here on DEV.&amp;nbsp;I swear I had at least as much fun writing it as people apparently had reading it.&amp;nbsp;So yes, I know WebMCP reasonably well, but I'm planning to attend a lot of other talks there too, so apparently a refresher won't hurt me either.&amp;nbsp; 😅&lt;/p&gt;

&lt;p&gt;Anyway, back to the point.&amp;nbsp;I strongly believe that people remember things best through examples. And for many people, the ultimate examples are rich people,&amp;nbsp; otherwise known as &lt;em&gt;successful people&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So let's imagine that our hypothetical protagonist is very, very, disgustingly rich.&amp;nbsp;He's actually a billionaire.&amp;nbsp;He earned his fortune through hard work and by running several companies. He makes cars and rockets, bought his own social media platform, and recently even acquired an AI coding company.&amp;nbsp;A person like this would obviously need his own AI agent.&lt;/p&gt;

&lt;p&gt;And because our protagonist needs a name, let's call him &lt;strong&gt;Elon Mózg&lt;/strong&gt;.&amp;nbsp;&lt;em&gt;Mózg&lt;/em&gt; means &lt;em&gt;brain&lt;/em&gt; in Polish, which works beautifully here.&lt;/p&gt;

&lt;p&gt;One more thing: my examples could probably also serve as prompts for a coding agent that could build this whole uber-agent.&amp;nbsp;If some billionaire wants to buy the idea, I'll happily sell the rights for, let's say, a modest $10 million.&amp;nbsp;Special offer.&lt;/p&gt;

&lt;p&gt;Let's go!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. AI Agent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI system that gets a goal and can decide how to achieve it.&amp;nbsp;Unlike a simple chatbot, it doesn't have to stop after generating one response. It can plan the next steps, use tools, inspect their results, and continue working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our protagonist Elon could, for example, ask his AI agent:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Build a base on Mars."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A regular chatbot would probably start telling him stories, give him a theoretical lecture, and maybe even say something ridiculous like &lt;em&gt;that's currently impossible&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;An agent, on the other hand, would start figuring things out: check the nearest available rocket launch slots, inspect the rocket's technical condition, recruit engineers, order the necessary equipment online...&lt;/p&gt;

&lt;p&gt;Okay, maybe it wouldn't go &lt;em&gt;quite&lt;/em&gt; that smoothly.&amp;nbsp;But what if we put a really powerful model in there? xDDD&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Agentic Workflow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An agentic workflow is a multi-step process in which we use AI to perform parts of the work.&amp;nbsp;The sequence of those steps can be largely designed in advance by a developer. The model doesn't necessarily have to decide what to do next every single time.&lt;/p&gt;

&lt;p&gt;Instead of something simple like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user → prompt → LLM → response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we can have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trigger → get data → LLM analyzes data → make a decision → call a tool → LLM generates summary → send result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Elon Mózg is a very busy man. Every morning, he wants a summary of what's happening across his empire.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So we design a workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get car sales → get rocket launch status → get latest AI company updates → LLM analyzes everything → choose 5 most important updates → generate morning briefing → send to Elon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI performs several tasks here. It analyzes the data, selects the most important information, and prepares the report, but it &lt;strong&gt;doesn't invent the entire process from scratch every morning&lt;/strong&gt;.&amp;nbsp;We already decided which steps should happen and in what order.&lt;/p&gt;

&lt;p&gt;Of course, we can add some flexibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rocket launch delayed? → ask LLM to summarize why
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But we're still moving through a workflow that we designed beforehand.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Agent Loop
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I once wrote an article demonstrating that you can build a basic AI agent as a loop in roughly&lt;a href="https://dev.to/sylwia-lask/the-dirty-secret-behind-ai-agents-demo--273d"&gt; 80 lines of code&lt;/a&gt;. An agent loop is the mechanism that allows an agent to &lt;strong&gt;perform an action, observe the result, and decide what to do next based on what happened&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In simplified form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;decide → act → observe → decide → act → observe → ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loop continues until the agent decides that it has achieved its goal, or until we tell it to stop.&amp;nbsp;In a real system, setting a maximum number of iterations is definitely a good idea. 😅&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our Elon often says he works too much. So he asks his agent:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find me a free evening this week."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This time, we haven't programmed the exact path leading to the solution.&amp;nbsp;The agent has to find it itself.&lt;/p&gt;

&lt;p&gt;Checks the calendar → no free evening.&lt;/p&gt;

&lt;p&gt;Looks at which meetings could be moved → the car company meeting looks promising.&lt;/p&gt;

&lt;p&gt;Tries to move it → conflict with the Mars colonization plans.&lt;/p&gt;

&lt;p&gt;Checks Thursday → rocket launch.&lt;/p&gt;

&lt;p&gt;Checks Friday → finalizing another startup acquisition.&lt;/p&gt;

&lt;p&gt;Checks Saturday → free!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt; "Saturday evening is free."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt; "Great. Schedule a meeting."&lt;/p&gt;

&lt;p&gt;And the agent loop begins again. 💀&lt;/p&gt;

&lt;h3&gt;
  
  
  Agentic Workflow vs. Agent Loop
&lt;/h3&gt;

&lt;p&gt;The simplest way to think about it:&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic workflow = a designed process that uses AI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent loop = AI performs an action, checks the result, and decides what to do in the next iteration.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Importantly, &lt;strong&gt;an agent loop can be one component of a larger agentic workflow&lt;/strong&gt;.&amp;nbsp;So a workflow describes &lt;strong&gt;the overall process&lt;/strong&gt;, while a loop describes &lt;strong&gt;the mechanism that lets an agent operate step by step and react to what happened previously&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Tool Calling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LLMs are wonderful, but let's face it: they're still fancy next-word predictors, not omnipotent creatures capable of searching the entire internet and breaking into banks all by themselves.&amp;nbsp;Although after that Hugging Face incident, I'm not entirely sure anymore. xD&lt;/p&gt;

&lt;p&gt;If only they could cook dinner and hang the laundry too... now &lt;em&gt;that&lt;/em&gt; would be something.&lt;/p&gt;

&lt;p&gt;Anyway, if we want a model to actually do something, we need to give it access to appropriate functions or tools.&amp;nbsp;The model can decide which tool it needs and generate a tool call. The application or agent harness then executes it and passes the result back to the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How many red cars did we sell yesterday?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent doesn't hallucinate a number.&amp;nbsp;It sees an available tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;getRedCarsSales&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It requests the tool call and only after getting the result responds:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"One million, Elon. Perfectly average day."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5. Agent Harness
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An LLM by itself isn't an entire agent — after all, it's still just a clever next-word predictor. xDDD&amp;nbsp;A harness is &lt;strong&gt;the software surrounding the model&lt;/strong&gt; that manages things like tools, the agent loop, context, state, permissions, and errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Check if the latest car build passed all tests and tell the team if it didn't."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model can figure out:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I should check the CI results.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But the harness is what allows it to &lt;strong&gt;actually check CI, pass the result back to the model, and let the model decide what happens next&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The LLM is the brain.&amp;nbsp;The harness builds the rest of the organism around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Context Engineering
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're building an agent, a system prompt isn't always enough.&amp;nbsp;Context engineering is about designing &lt;strong&gt;which information the model should receive at a particular moment&lt;/strong&gt;.&amp;nbsp;That might include specific documents, conversation history, memory, tool results, user data, and so on.&lt;/p&gt;

&lt;p&gt;For example, our Elon might give the agent this prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Post that on X."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a terrible instruction without context.&amp;nbsp;But with the right context, the agent could know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what "that" refers to: for example, acquiring another startup,&lt;/li&gt;
&lt;li&gt;what happened earlier in the conversation: and therefore whether this should be a positive or negative post,&lt;/li&gt;
&lt;li&gt;whether, according to the available context, Elon has approved the text,&lt;/li&gt;
&lt;li&gt;whether it has permission to publish anything at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Giving an AI more context isn't always better. Giving it the right context is.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Memory
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A mechanism that allows an agent to &lt;strong&gt;store important information and retrieve it later&lt;/strong&gt;, instead of relying exclusively on its current context window.&amp;nbsp;Very useful if we don't want to explain the same thing for the tenth time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monday:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Elon:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm thinking about buying an AI coding company."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Three weeks later:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Elon:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What was it that I wanted to buy?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"An AI coding company."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Elon:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Right. How much?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Please don't."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Memory works. 😂&lt;/p&gt;

&lt;h2&gt;
  
  
  8. MCP: Model Context Protocol
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We just talked about tool calling and how an agent can use different tools.&amp;nbsp;Now imagine you're a manufacturer of tires or rocket parts or... whatever.&amp;nbsp;Obviously, you'd like Elon's agent — or anyone else's agent — to be able to order your products.&amp;nbsp;But how do you make that possible without every agent having to guess how your system works?&lt;/p&gt;

&lt;p&gt;That's where MCP comes in.&amp;nbsp;&lt;strong&gt;Model Context Protocol is an open protocol that allows AI applications to connect to external tools and context in a standardized way.&lt;/strong&gt; MCP servers can expose things such as &lt;strong&gt;tools, resources, and prompts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, Elon could ask his agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I have a meeting with the head of my social media platform in ten minutes. Should I fire him?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using connected MCP servers, the agent checks Slack, company documents, sales results, Jira, and today's astrological chart.&lt;/p&gt;

&lt;p&gt;Agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"No. Joe should stay at the company. At least for now. ;)"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  9. Planning
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When given a more complex goal, an agent can first break it down into &lt;strong&gt;smaller tasks and decide what order they should be completed in&lt;/strong&gt;, instead of immediately jumping into the first action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Build a colony on Mars."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent creates a plan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find a suitable location.&lt;/li&gt;
&lt;li&gt;Figure out transportation.&lt;/li&gt;
&lt;li&gt;Provide power.&lt;/li&gt;
&lt;li&gt;Provide oxygen.&lt;/li&gt;
&lt;li&gt;Provide water.&lt;/li&gt;
&lt;li&gt;Build habitats.&lt;/li&gt;
&lt;li&gt;Convince humans to actually go there.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 7 may require a separate agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Reasoning
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model's ability to solve a problem that requires &lt;strong&gt;more than simply retrieving or reproducing information&lt;/strong&gt;: for example, comparing different possibilities, taking constraints into account, and choosing a sensible course of action.&lt;/p&gt;

&lt;p&gt;Reasoning isn't specific to agents, but it's particularly important in agentic systems because it often helps the agent decide &lt;em&gt;what to do next&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The rocket launch is at 6 PM in Texas, and the board meeting is at 4 PM in California. Can I attend both?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent needs to consider the meeting duration, travel time, time zones, and so on before answering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Not unless the rocket picks you up."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  11. Multi-Agent System
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A system where, instead of having one all-knowing agent, we have &lt;strong&gt;several relatively autonomous agents with different roles&lt;/strong&gt; that can divide the work and collaborate.&lt;/p&gt;

&lt;p&gt;Elon Mózg's empire therefore has:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Car Company Agent&lt;/strong&gt; — cars&lt;br&gt;
&lt;strong&gt;Space Agent&lt;/strong&gt; — rockets&lt;br&gt;
&lt;strong&gt;Social Media Agent&lt;/strong&gt; — social media&lt;br&gt;
&lt;strong&gt;AI Systems Agent&lt;/strong&gt; — AI&lt;br&gt;
&lt;strong&gt;Finance Agent&lt;/strong&gt; — money&lt;br&gt;
&lt;strong&gt;Personal Assistant Agent&lt;/strong&gt; — desperately trying to keep all of the above under control&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt; "How's everything going?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personal Assistant Agent:&lt;/strong&gt; "Define &lt;em&gt;everything&lt;/em&gt;."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  12. Orchestration
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once we have multiple agents and tools, someone —or something 😏 — has to manage &lt;strong&gt;who performs which task, when they perform it, and what happens next&lt;/strong&gt;.&amp;nbsp;An orchestrator can delegate work and collect the results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Let's launch our new car on Mars."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Orchestrator:&lt;/p&gt;

&lt;p&gt;→ Space Agent: &lt;em&gt;Can we get there?&lt;/em&gt;&lt;br&gt;
→ Car Company Agent: &lt;em&gt;Can the car survive the trip?&lt;/em&gt;&lt;br&gt;
→ Finance Agent: &lt;em&gt;How much will this nonsense cost?&lt;/em&gt;&lt;br&gt;
→ Legal Agent: &lt;em&gt;Please tell me we're not actually doing this.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The results return to the main agent, which prepares the final answer.&lt;/p&gt;
&lt;h2&gt;
  
  
  13. Handoff
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One agent may decide that a particular task &lt;strong&gt;should be taken over by another, more specialized agent&lt;/strong&gt;.&amp;nbsp;Unlike simply using another agent as a tool, the second agent can take over the next part of the conversation or task.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt; "One of the engines is behaving strangely."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Personal Assistant Agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I can reschedule your dentist appointment. I cannot diagnose a rocket engine."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;→ handoff to Space Engineering Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A reasonable decision.&lt;/p&gt;
&lt;h2&gt;
  
  
  14. A2A: Agent2Agent Protocol
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another interesting protocol that allows &lt;strong&gt;different agents to communicate and collaborate&lt;/strong&gt;, even if they were built by different teams or run on different systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why did the rocket explode?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;His agent is definitely not a rocket scientist.&amp;nbsp;So it contacts the &lt;strong&gt;Rocket Scientist Agent&lt;/strong&gt;, which analyzes the data and sends the result back.&amp;nbsp;In a &lt;em&gt;very&lt;/em&gt; simplified form:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP: agent ↔ tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A2A: agent ↔ agent&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  15. Guardrails
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are they?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mechanisms that control or restrict an agent's behavior.&amp;nbsp;They can check inputs and outputs, restrict access to tools, require specific permissions, or block certain actions.&lt;/p&gt;

&lt;p&gt;Elon's personal agent can:&lt;/p&gt;

&lt;p&gt;✅ analyze companies&lt;br&gt;
✅ read his calendar&lt;br&gt;
✅ draft emails&lt;br&gt;
✅ check the launch schedule&lt;br&gt;
✅ prepare social media posts&lt;/p&gt;

&lt;p&gt;It cannot:&lt;/p&gt;

&lt;p&gt;❌ launch a rocket by itself&lt;br&gt;
❌ fire employees by itself&lt;br&gt;
❌ publish a post by itself&lt;br&gt;
❌ &lt;strong&gt;buy a startup by itself (although apparently this wasn't always obvious)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We added the last guardrail after an incident.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  16. Human-in-the-Loop (HITL)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent can operate autonomously, but a human is deliberately included in part of the process. For example, to approve an important action, correct an output, or make a decision we don't want to leave entirely to the agent.&lt;/p&gt;

&lt;p&gt;And here, obviously:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt; "You are about to acquire a social media platform for approximately $44 billion."&lt;/p&gt;

&lt;p&gt;"This action cannot easily be undone."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Are you sure?"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Yes] [God, please, don't!!!]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Elon Mózg:&lt;/strong&gt; &lt;em&gt;click&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Well. Human was in the loop."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  17. Evals
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are they?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tests that help us determine &lt;strong&gt;how well an agent performs its tasks&lt;/strong&gt;.&amp;nbsp;It's not only about whether the final answer sounds good. We can also evaluate whether the agent selected the right tools, performed the correct steps, and achieved the expected result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon Mózg Personal Assistant Eval Suite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Test:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Elon asks the agent to schedule a meeting with the company board."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;check calendar → find slot → ask attendees → schedule
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Actual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buy another startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;FAIL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We still have some work to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  18. Computer Use
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of relying exclusively on APIs, an agent can &lt;strong&gt;see and interact with a regular user interface&lt;/strong&gt;: open a website, find a button, click it, enter text, and so on.&amp;nbsp;We all know agents are often far from perfect at this, but hey, better than nothing!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon needs some government document.&amp;nbsp;&lt;/strong&gt;Unfortunately, the government portal was built in 2007.&amp;nbsp;I don't know what it's like where you live, but in Poland we have quite a few of those. 😅&lt;/p&gt;

&lt;p&gt;No API.&amp;nbsp;No MCP.&amp;nbsp;There is, however, a form with 47 fields.&lt;/p&gt;

&lt;p&gt;The agent opens Chrome.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt; "I found the form."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt; "Great."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt; "It requires Internet Explorer."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt; "Let's go to Mars."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  19. Agentic RAG
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In classic RAG, the system retrieves information and passes it to the model.&amp;nbsp;In agentic RAG, &lt;strong&gt;the agent itself can control the retrieval process&lt;/strong&gt;: decide what information is missing, search for additional data, reformulate the query, and only then produce an answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elon:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Should we build another Gigafactory in Europe?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent first checks sales → notices that it needs production data → retrieves it → checks energy prices → regulations → potential locations → compares the results.&lt;/p&gt;

&lt;p&gt;So instead of a single &lt;code&gt;search()&lt;/code&gt;, we have &lt;strong&gt;research controlled by the agent&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  20. BONUS: Agent Washing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The marketing practice of calling a product an &lt;strong&gt;"AI agent"&lt;/strong&gt; even though the system has little or nothing to do with autonomously performing tasks.&lt;/p&gt;

&lt;p&gt;Elon Mózg walks onto the stage:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Today we're introducing &lt;strong&gt;Glokzilla Agent Ultra&lt;/strong&gt;, the world's first fully autonomous general-purpose reasoning agent."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A developer looks at the repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user → prompt → LLM → response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Developer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Elon, that's a chatbot."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Elon:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It's an &lt;strong&gt;agentic&lt;/strong&gt; chatbot."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Funding secured. 🚀&lt;/p&gt;

&lt;p&gt;And that's it!&amp;nbsp;I hope you enjoyed it! &lt;/p&gt;

&lt;p&gt;I seriously promise this is my last list for a while because, once again, this turned out to be way more work than expected. &lt;/p&gt;

&lt;p&gt;And if you'd like to see more of my stuff, feel free to follow me on &lt;a href="https://www.linkedin.com/in/sylwia-laskowska-5a8467131/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>beginners</category>
    </item>
    <item>
      <title>10 Git Commands You’ll Wish You Knew Earlier</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Wed, 26 Aug 2026 07:59:06 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/10-git-commands-youll-wish-you-knew-earlier-4fcp</link>
      <guid>https://dev.to/sylwia-lask/10-git-commands-youll-wish-you-knew-earlier-4fcp</guid>
      <description>&lt;p&gt;Do you know Git?&amp;nbsp;Of course you do! Today, I’ve got a few of my favorite Git commands for you.&amp;nbsp;When I was a junior developer, my tech lead taught me most of them (hi Wojtek, if you’re reading this 👋) and later, I started teaching the same commands to my own junior and mid-level developers.&lt;/p&gt;

&lt;p&gt;I’ve actually been meaning to write this article for months. But you know how it is. It’s evergreen content, it requires a bit of work, and meanwhile I kept coming up with other ideas, so I kept postponing it.&amp;nbsp;What finally motivated me was &lt;a class="mentioned-user" href="https://dev.to/francistrdev"&gt;@francistrdev&lt;/a&gt;, who recently published his own article about Git commands.&lt;/p&gt;

&lt;p&gt;My article will be a little different, though.&amp;nbsp;If you’re completely new to Git and still learning the basics, check out Francis’s &lt;strong&gt;&lt;a href="https://dev.to/francistrdev/git-gud-4e6g"&gt;Git Gud!&lt;/a&gt;&lt;/strong&gt; article first.&amp;nbsp;But if &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;pull&lt;/code&gt;, and &lt;code&gt;push&lt;/code&gt; are already second nature to you, this article is for you.&lt;/p&gt;

&lt;p&gt;These are, let’s say, intermediate-level commands. Useful ones. The kind you actually need at work, but not yet senior-level Git magic like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Type three lines into your terminal and a spaceship will appear in your repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have other useful commands at this level, please share them in the comments!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;BTW, if you feel like it, you can also follow me on Instagram! I’m planning to post what could grandly be called “dev lifestyle” content there. 😅 I have four conferences coming up this fall, for example, so expect some behind-the-scenes photos from my little tour around Europe. I only have a handful of followers there so far and absolutely no idea what this experiment will turn into, but here you go: &lt;a href="https://www.instagram.com/sylwia.lask/" rel="noopener noreferrer"&gt;@sylwia.lask&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All right, let’s start.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &amp;amp; 2. &lt;code&gt;git merge&lt;/code&gt; vs &lt;code&gt;git rebase&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Haha, first point and we already have two commands.&amp;nbsp;&amp;nbsp;The reason I’m putting them together is that a lot of developers, even experienced ones, treat &lt;code&gt;merge&lt;/code&gt; and &lt;code&gt;rebase&lt;/code&gt; almost interchangeably.&lt;/p&gt;

&lt;p&gt;And sure, their high-level purpose is similar: you want to integrate the history of one branch into another. Very often that means updating your feature branch with changes from &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;develop&lt;/code&gt;, or another feature branch.&lt;/p&gt;

&lt;p&gt;But the way they do it is quite different.&amp;nbsp;Imagine you have this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C main
     \
      D---E feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ve been happily working on your &lt;code&gt;feature&lt;/code&gt; branch, while someone else added commit &lt;code&gt;C&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt;.&amp;nbsp;Now you want to bring those changes into your branch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Merge
&lt;/h3&gt;

&lt;p&gt;If you run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while you’re on &lt;code&gt;feature&lt;/code&gt;, Git combines both histories.&amp;nbsp;You usually end up with something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C------M
     \        /
      D---E---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;M&lt;/code&gt; is a merge commit.&lt;/p&gt;

&lt;p&gt;The original history stays intact. Git remembers that your feature branch diverged from &lt;code&gt;main&lt;/code&gt;, both branches evolved independently for a while, and then they were joined together.&lt;/p&gt;

&lt;p&gt;This can be a good thing because it preserves the real history of what happened.&amp;nbsp;The downside is that if you merge &lt;code&gt;main&lt;/code&gt; into your feature branch over and over again, your history can eventually start looking like spaghetti.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rebase
&lt;/h3&gt;

&lt;p&gt;Now let’s say instead you run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git takes commits &lt;code&gt;D&lt;/code&gt; and &lt;code&gt;E&lt;/code&gt;, temporarily removes them, moves your branch onto the latest &lt;code&gt;main&lt;/code&gt;, and then reapplies your commits on top.&lt;/p&gt;

&lt;p&gt;You get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C---D'---E'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much cleaner.&lt;/p&gt;

&lt;p&gt;But notice the apostrophes.&amp;nbsp;&lt;code&gt;D'&lt;/code&gt; and &lt;code&gt;E'&lt;/code&gt; are not technically the same commits as &lt;code&gt;D&lt;/code&gt; and &lt;code&gt;E&lt;/code&gt;. Git created new commits with new hashes.&amp;nbsp;That means &lt;strong&gt;rebase rewrites history&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is why a very useful rule of thumb is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Rebase your own work. Be careful rebasing shared history.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you’re working alone on a feature branch, rebasing it is usually perfectly fine.&amp;nbsp;If three other developers have already based their work on your commits, rebasing those commits can make everyone’s life considerably more exciting. And not in a good way. &lt;/p&gt;

&lt;h3&gt;
  
  
  And what about conflicts?
&lt;/h3&gt;

&lt;p&gt;Both merge and rebase can result in conflicts.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;With a merge, Git tries to combine the two histories in one operation. You resolve the conflicting files, stage them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then continue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge &lt;span class="nt"&gt;--continue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With rebase, things can be slightly more annoying because Git reapplies your commits one by one.&lt;/p&gt;

&lt;p&gt;This means you may resolve a conflict, continue the rebase...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git rebase &lt;span class="nt"&gt;--continue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...and then get another conflict in the next commit.&amp;nbsp;And another one.&amp;nbsp;And another one.&amp;nbsp;At which point you start questioning every career decision that led you here. 😅&lt;/p&gt;

&lt;p&gt;But there’s also a small bonus.&amp;nbsp;If you completely mess things up and just want to stop the entire circus, you can do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge &lt;span class="nt"&gt;--abort&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase &lt;span class="nt"&gt;--abort&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git will try to return you to the state from before the merge or rebase started.&amp;nbsp;Extremely useful feature. 😁&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;code&gt;git commit --amend&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This is one of those commands I learned to love very quickly as a junior.&amp;nbsp;Imagine you’ve just created a beautiful, perfectly round little commit.&amp;nbsp;Then you look at the code and notice you forgot something.In my case, it was usually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WTF&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have two options.&amp;nbsp;Option one: make another glorious commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Remove console log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which, let’s be honest, is not exactly the pinnacle of Git history aesthetics. &lt;/p&gt;

&lt;p&gt;Or you can simply add the forgotten change to the previous commit.&amp;nbsp;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add forgotten-file.ts
git commit &lt;span class="nt"&gt;--amend&lt;/span&gt; &lt;span class="nt"&gt;--no-edit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--no-edit&lt;/code&gt; means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add these changes to the previous commit, but keep the existing commit message.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you want to change the commit message as well, just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;--amend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git will open your configured editor and let you modify it.&lt;/p&gt;

&lt;p&gt;There is one important detail here.&amp;nbsp;&lt;code&gt;amend&lt;/code&gt; doesn’t literally edit the existing commit.&amp;nbsp;It creates a &lt;strong&gt;new commit&lt;/strong&gt; containing the updated contents.&amp;nbsp;And because commit hashes depend on the contents and metadata of the commit, the hash changes.&lt;/p&gt;

&lt;p&gt;If you’re working locally and haven’t pushed the branch anywhere yet, no problem. But if the branch already exists on remote, your local history no longer matches the remote history.&amp;nbsp;So when you try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you’ll probably get something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rejected (non-fast-forward)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if you are absolutely sure nobody else is working on that branch, you could technically do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But what if you’re not sure?&lt;/p&gt;

&lt;p&gt;And this brings us very smoothly to the next point.&lt;/p&gt;




&lt;h2&gt;
  
  
  4.  &lt;code&gt;git push --force-with-lease&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;After a rebase, amend, interactive rebase, squash, or anything else that rewrites your commits, your local branch history may no longer match the version stored on remote.&lt;/p&gt;

&lt;p&gt;You can solve that with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But &lt;code&gt;--force&lt;/code&gt; is basically saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My local version is the truth. Replace whatever is on remote with this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If someone pushed something to that branch in the meantime, you can overwrite their work.&amp;nbsp;They may get angry.&amp;nbsp;&amp;nbsp;And rightly so. 😏&lt;/p&gt;

&lt;p&gt;A much safer option is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--force-with-lease&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In simplified terms, this tells Git:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Force-push my version, but only if the remote branch still looks the way I expect it to.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the remote branch changed since the state your local Git knows about, for example because someone else pushed new commits, Git refuses the push instead of blindly overwriting them.&lt;/p&gt;

&lt;p&gt;So instead of destroying someone’s afternoon, you get an error.&amp;nbsp;I generally recommend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--force-with-lease
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;over:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--force
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;whenever possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  5.  &lt;code&gt;git rebase -i&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;For me, this is a very important command.&amp;nbsp;Almost the king of Git. xDDDD&amp;nbsp;Interactive rebase lets you do almost anything you want with your recent commits.&lt;/p&gt;

&lt;p&gt;In other words, you can commit every single line individually, change everything ten times, create commits like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add validation
Fix validation
Actually fix validation
Fix validation again
Remove console.log
Please work now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then later turn the whole mess into an elegant Git history.&lt;/p&gt;

&lt;p&gt;Let’s say you want to edit your last five commits.&amp;nbsp;You run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; HEAD~5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git opens your configured editor — Vim, Nano, VS Code, or whatever you use — and shows something similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pick a111111 Add login form
pick b222222 Add validation
pick c333333 Fix typo
pick d444444 Fix validation
pick e555555 Remove debug log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now comes the fun part.&amp;nbsp;You can replace &lt;code&gt;pick&lt;/code&gt; with different commands.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;pick&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Keep the commit exactly as it is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pick a111111 Add login form
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;reword&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Keep the commit contents, but change its message.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reword a111111 Add beautiful login form
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;edit&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Pause the rebase at that commit and let you modify it.&amp;nbsp;Useful if you want to change the actual contents of an older commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;squash&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Combine the commit with the one before it.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pick   a111111 Add login form
squash b222222 Add validation
squash c333333 Fix validation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git turns those commits into one and lets you edit the final commit message.&lt;/p&gt;

&lt;p&gt;So instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add login form
Add validation
Fix validation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can end up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add login form with validation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beautiful. Round. Perfect. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;fixup&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;fixup&lt;/code&gt; is similar to &lt;code&gt;squash&lt;/code&gt;, but it throws away the commit message of the fixup commit.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pick  a111111 Add login form
fixup b222222 Fix typo
fixup c333333 Remove console.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You probably don’t care about preserving the historical significance of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Remove console.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So &lt;code&gt;fixup&lt;/code&gt; is perfect here.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;drop&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Remove the commit completely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;drop c333333 Terrible idea
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Goodbye.&lt;/p&gt;

&lt;p&gt;Of course, there are different schools of thought about how much you should clean up your commits.&amp;nbsp;Some senior developers say that submitting a nicely cleaned-up commit history for review is simply good manners.&amp;nbsp;Others do not care in the slightest and think it’s unnecessary because GitHub, GitLab, or whatever platform you use can simply squash everything when merging the PR anyway.&lt;/p&gt;

&lt;p&gt;But!!!&amp;nbsp;What if you don’t want to click &lt;strong&gt;Squash and merge&lt;/strong&gt;?&amp;nbsp;What if your feature logically contains two commits and you actually want to preserve both?&amp;nbsp;That happens.&lt;/p&gt;

&lt;p&gt;So whether you use interactive rebase once a week or once every six months, I still think it’s worth knowing the king:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6.  &lt;code&gt;git stash&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This one comes in handy very often.&amp;nbsp;You start working on a nice little feature.&amp;nbsp;Or, these days, Kiro or Claude Code is working very hard while you watch.&amp;nbsp;&amp;nbsp;Suddenly someone reports a production bug.&lt;/p&gt;

&lt;p&gt;Unfortunately, you now have to temporarily abandon your beautiful feature and switch to something else.&amp;nbsp;The problem is that your current work is completely unfinished.&amp;nbsp;You have debug logs everywhere, half the files are modified, the project doesn’t even build, and you definitely don’t want to commit this mess.&lt;/p&gt;

&lt;p&gt;Although, of course, now you know about &lt;code&gt;amend&lt;/code&gt;, so you could eventually clean it up. &lt;/p&gt;

&lt;p&gt;But there’s a better solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git temporarily stores your uncommitted changes and returns your working directory to a clean state.&lt;/p&gt;

&lt;p&gt;Now you can switch branches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;fix your production disaster, and later come back.&lt;/p&gt;

&lt;p&gt;One important detail: by default, &lt;code&gt;git stash&lt;/code&gt; stashes tracked files, but not new untracked files.&amp;nbsp;If you also want to include newly created files, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or, even better, give your stash a useful name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash push &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP login feature"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because once you have several stashes named basically “WIP”, future you will hate present you.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;git stash list&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;To see all your stashes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stash@{0}: On feature/login: WIP login feature
stash@{1}: On feature/cart: experiment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;git stash show&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;To see what a particular stash contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash show stash@&lt;span class="o"&gt;{&lt;/span&gt;0&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you want the full diff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash show &lt;span class="nt"&gt;-p&lt;/span&gt; stash@&lt;span class="o"&gt;{&lt;/span&gt;0&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;git stash apply&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;To restore a stash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash apply stash@&lt;span class="o"&gt;{&lt;/span&gt;0&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The changes are restored, but the stash remains in the list.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;git stash pop&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;You can also use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This applies the stash and, if successful, removes it from the stash list.&lt;/p&gt;

&lt;p&gt;So, roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply = restore
pop   = restore + remove from stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very simple, very useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  7.  &lt;code&gt;git cherry-pick&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I have to admit this is one of the intermediate Git commands I use most often.&amp;nbsp;Imagine there’s one specific commit on another branch that you want in your current branch.&lt;/p&gt;

&lt;p&gt;You don’t want to merge the whole branch.&amp;nbsp;You don’t want to rebase onto it.&amp;nbsp;You literally need one thing.&amp;nbsp;For example, in my project recently, I needed a commit containing configuration for newly created environments.&amp;nbsp;Perfect use case.&lt;/p&gt;

&lt;p&gt;You simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git cherry-pick &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git cherry-pick a1b2c3d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git takes the changes introduced by that commit and applies them to your current branch.&lt;/p&gt;

&lt;p&gt;Important detail: it creates a &lt;strong&gt;new commit&lt;/strong&gt;.&amp;nbsp;So the resulting commit contains essentially the same changes, but it gets a new hash.&amp;nbsp;Imagine this history:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main
A---B---C

feature
     \
      D---E---F
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’re on &lt;code&gt;main&lt;/code&gt;, but you only want &lt;code&gt;E&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git cherry-pick E
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you get something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C---E'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple.&lt;/p&gt;

&lt;p&gt;But I’ll admit that, being a lazy creature, I use cherry-pick in slightly less noble ways too.&amp;nbsp;Sometimes something gets completely messed up on my branch.&amp;nbsp;The rebase goes badly, the history looks suspicious, conflicts start multiplying, and after a while I decide: I'll create a completely new branch from the correct place at the top of the tree. 😅&lt;/p&gt;

&lt;p&gt;And because — thanks to the previous commands ☺️ — my commits are already nice and round, I simply cherry-pick them one by one onto the new branch.&lt;/p&gt;

&lt;p&gt;I’m sure some Git pro is currently shaking their head at me, but let me put it this way:&amp;nbsp;It works for me. 😀&lt;/p&gt;




&lt;h2&gt;
  
  
  8.  &lt;code&gt;git reset --soft&lt;/code&gt;, &lt;code&gt;--mixed&lt;/code&gt;, &lt;code&gt;--hard&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Three ways of moving back in history, each with a different answer to the question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should happen to my changes?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because how many times do we start working on something, write some code, and then realize:&amp;nbsp;Nope.&amp;nbsp;This whole idea was bad.&amp;nbsp;Let’s go back.&lt;/p&gt;

&lt;p&gt;The easiest way to understand &lt;code&gt;reset&lt;/code&gt; is to think about three layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Commit history
Staging area
Working directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have three increasingly dramatic levels of reset.&amp;nbsp;And every next one has greater potential to cause a small heart attack if you use the wrong one. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;git reset --soft&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s say you want to undo the last commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--soft&lt;/span&gt; HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git moves &lt;code&gt;HEAD&lt;/code&gt; back by one commit, but all the changes from the removed commit remain &lt;strong&gt;staged&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So if your history was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after the reset, your branch points to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but the changes introduced by &lt;code&gt;B&lt;/code&gt; are still ready to commit.&lt;/p&gt;

&lt;p&gt;This is useful when you committed too early and want to recreate the commit differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;git reset --mixed&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--mixed&lt;/span&gt; HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because &lt;code&gt;--mixed&lt;/code&gt; is the default.&lt;/p&gt;

&lt;p&gt;Again, Git moves back one commit.&lt;/p&gt;

&lt;p&gt;But this time the changes are left in your working directory &lt;strong&gt;unstaged&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So nothing disappears from your files, but you need to &lt;code&gt;git add&lt;/code&gt; things again before committing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;git reset --hard&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;And now we enter the danger zone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This moves &lt;code&gt;HEAD&lt;/code&gt; back and updates both the staging area and working directory to match that commit.&amp;nbsp;In other words, the changes disappear from your files too.&lt;/p&gt;

&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--soft  → keep changes staged
--mixed → keep changes unstaged
--hard  → discard changes from the working tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the last one with some awareness of what you’re doing.&amp;nbsp;But what if you go one step too far and accidentally delete something you absolutely did not mean to delete?&lt;/p&gt;

&lt;p&gt;And that brings us to...&lt;/p&gt;




&lt;h2&gt;
  
  
  9.  &lt;code&gt;git reflog&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A command I use very rarely.&amp;nbsp;But oh, how many times it has saved my ass.&lt;/p&gt;

&lt;p&gt;For example, when I once ran &lt;code&gt;git reset --hard&lt;/code&gt; and instead of removing my last changes, I basically removed the branch I had been working on for two days. 😀Amazing experience. Highly recommended.&lt;/p&gt;

&lt;p&gt;The important thing to understand is that &lt;code&gt;git log&lt;/code&gt; shows you commits reachable from the history you’re currently looking at.&amp;nbsp;If you reset your branch backwards, some commits may disappear from&amp;nbsp;git log.&lt;/p&gt;

&lt;p&gt;That does not necessarily mean Git has immediately deleted them.&amp;nbsp;Git also keeps a local log of movements of references such as &lt;code&gt;HEAD&lt;/code&gt;.&amp;nbsp;You can inspect that with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reflog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;e35fa12 HEAD@{0}: reset: moving to HEAD~2
821cd77 HEAD@{1}: commit: Add authentication
f992ab1 HEAD@{2}: commit: Add login page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aha!&amp;nbsp;There’s your missing commit.&lt;/p&gt;

&lt;p&gt;Now you have several options.&amp;nbsp;You could move the branch back to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; 821cd77
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But personally, if I’m already in panic-recovery mode, I prefer doing something safer first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch rescue 821cd77
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the commit is reachable from a branch again and I can calmly inspect what happened without immediately rewriting anything else.&lt;/p&gt;

&lt;p&gt;The key difference is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;shows your visible commit history.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git reflog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;shows where your local references, especially &lt;code&gt;HEAD&lt;/code&gt; , have pointed recently.&lt;/p&gt;

&lt;p&gt;There is one important limitation, though.&amp;nbsp;Reflog is not a magical backup of every character you’ve ever typed.&amp;nbsp;If your changes were never committed, stashed, or otherwise stored as Git objects, &lt;code&gt;reflog&lt;/code&gt; cannot magically resurrect them.&lt;/p&gt;

&lt;p&gt;So yes, if you worked for six hours without committing anything and then destroyed those changes...&amp;nbsp;Well.&amp;nbsp;Maybe this will teach you to commit more often next time. &lt;/p&gt;




&lt;h2&gt;
  
  
  10.  &lt;code&gt;git revert&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;And finally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imagine you release a commit to production.&amp;nbsp;&amp;nbsp;Or, in the slightly less hardcore version of this scenario, to some shared &lt;code&gt;develop&lt;/code&gt; branch.&lt;/p&gt;

&lt;p&gt;Something goes very wrong.&amp;nbsp;Everything breaks.&amp;nbsp;So what now?&amp;nbsp;Do you run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--hard&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;on the production branch?&lt;/p&gt;

&lt;p&gt;Do you start performing an exorcism?&lt;/p&gt;

&lt;p&gt;Fortunately, no.&amp;nbsp;The elegant way to undo a commit while preserving a clear record of what happened in your repository history is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imagine your history looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and &lt;code&gt;C&lt;/code&gt; introduced the disaster.&lt;/p&gt;

&lt;p&gt;You run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git does &lt;strong&gt;not&lt;/strong&gt; remove &lt;code&gt;C&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead, it creates a new commit that applies the opposite changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C---D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may end up with something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C: Add new payment logic
D: Revert "Add new payment logic"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is extremely useful on shared branches because you are not rewriting public history.&amp;nbsp;Everyone can clearly see:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the original change happened,&lt;/li&gt;
&lt;li&gt;it caused trouble,&lt;/li&gt;
&lt;li&gt;it was reverted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Compare that with resetting the branch and force-pushing it backwards, which rewrites history and can cause problems for everyone else working on it.&lt;/p&gt;

&lt;p&gt;So, as a general rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shared branch + bad commit → revert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is usually much safer than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reset + force push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s it!&lt;/p&gt;

&lt;p&gt;As I said at the beginning, if you use other intermediate Git commands that regularly save you time or save your ass, please share them in the comments.&amp;nbsp;Usually the comments under my articles end up being much better than the article itself, which continues to make me very happy. &lt;/p&gt;

&lt;p&gt;Also, please note that last week’s article was a list.&amp;nbsp;This week’s article is a list.&amp;nbsp;And — spoiler alert — next week’s article will also be a list!&lt;/p&gt;

&lt;p&gt;This is not because I smelled clicks and decided to turn into BuzzFeed.&amp;nbsp;It just somehow happened that way. 😅&lt;/p&gt;

&lt;p&gt;I hope you learned something new.&amp;nbsp;And if you didn’t, I hope it was at least fun to read. 😁&lt;/p&gt;

</description>
      <category>git</category>
      <category>programming</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>7 Productivity Tips That Sound Wrong (But Actually Work)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Tue, 18 Aug 2026 08:32:32 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/7-productivity-tips-that-sound-wrong-but-actually-work-5602</link>
      <guid>https://dev.to/sylwia-lask/7-productivity-tips-that-sound-wrong-but-actually-work-5602</guid>
      <description>&lt;p&gt;Struggling with burnout? Procrastination? Reaching your goals? Let me share a few methods that help me actually get things done in the long run. And yes, at first glance, some of them might make you think I've completely lost it 😄 But I swear they work, and these really are “productivity tips,” not “Sylwia's zen tips.”&lt;/p&gt;

&lt;p&gt;I've been writing quite a lot of “philosophical” posts lately. Well, it's summer, I'm enjoying the last warm weeks, and somehow I'm just in the mood for this kind of content. Don't worry, though, September will be packed with hardcore tech!&lt;/p&gt;

&lt;p&gt;And trust me, a lot is going to happen, because in September I'll be speaking at &lt;strong&gt;AGNTCon + MCPCon Europe&lt;/strong&gt;!!! Well, I always knew my place was among the greatest engineers from OpenAI, Anthropic, Google, and the maintainers of MCP… Hahaha, obviously I'm joking. I have no idea what I'm doing there, but if you happen to come to my talk, I promise you won't regret it 😄&lt;/p&gt;

&lt;p&gt;This post is partly a continuation of &lt;a href="https://dev.to/sylwia-lask/stop-calling-everything-impostor-syndrome-the-myth-of-just-push-harder-1dmm"&gt;Stop Calling Everything “Impostor Syndrome”: The Myth of “Just Push Harder”&lt;/a&gt; and contains some thoughts that simply didn't fit there. And yes, we only have one life — at least as far as we know 😄 — and I don't think it's worth wasting it constantly working your ass off just to become an amazing programmer or someone else in IT.&lt;/p&gt;

&lt;p&gt;But that's not even the main point here. These tips, despite going against the “work more” advice we hear all the time, can actually help you achieve much more, because the key to success is something we all know very well: &lt;strong&gt;CONSISTENCY&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Of course, I'm not going to claim this will always work for everyone. So you're very welcome to disagree with me in the comments 😄 It works for me, though, so I'll describe these methods along with plenty of personal digressions. Maybe it's worth a try?&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Do &lt;strong&gt;Less&lt;/strong&gt; Than You Could
&lt;/h2&gt;

&lt;p&gt;This is actually an old Scrum principle — or at least that's how a Scrum Master friend of mine once explained it to me 😉 The point isn't to cram as many tasks as possible into a sprint. The point is to find a pace of work that would feel comfortable even if there were no vacations at all. Obviously, this doesn't mean you should actually give up your vacations xDDD But you get the idea.&lt;/p&gt;

&lt;p&gt;I understand this strategy perfectly well at work, but sometimes I forget about it in my personal life. If you read me regularly, you know I blog a lot here (and sometimes those are heavily technical posts, unlike this one 😅), and I also speak at conferences. So I often have tons of things to do, but the moment my calendar gets even slightly less crowded, I immediately start wondering what else I could squeeze in. Maybe I should finally write a book?&lt;/p&gt;

&lt;p&gt;It's a trap. Instead of using that quieter period to rest and finally watch a TV show other than &lt;em&gt;Silicon Valley&lt;/em&gt;, I fill that time with more stuff. Then the commitments I already knew were coming eventually arrive, and suddenly I'm frustrated and exhausted. As a result, I do less, I do it worse, and… I give up on writing the book anyway 🥺 Maybe I'll get back to it when I retire or something. 🤯&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Don't Work on Weekends
&lt;/h2&gt;

&lt;p&gt;My buddy &lt;a class="mentioned-user" href="https://dev.to/the_nortern_dev"&gt;@the_nortern_dev&lt;/a&gt; once wrote about this in &lt;a href="https://dev.to/the_nortern_dev/unpopular-opinion-i-stopped-coding-on-weekends-and-my-career-got-better-3el"&gt;Unpopular Opinion: I Stopped Coding on Weekends and My Career Got Better&lt;/a&gt;. I even commented that I not only don't code on weekends, but I don't do anything after hours at all unless I genuinely feel like it.&lt;/p&gt;

&lt;p&gt;Well, those days are long gone. When it comes to blogging and conferences, I've achieved a certain level of success. What I didn't expect was that… success comes with admin work 😅. Suddenly there are ten emails to answer, an abstract to prepare, benchmarks to run, something else to check… Sometimes these are tiny things, but we all know how quickly tiny things can grow 😄&lt;/p&gt;

&lt;p&gt;As a result, I developed a tendency to do &lt;em&gt;something&lt;/em&gt; every single afternoon and, of course, on weekends, because that's when I had more time. My productivity dropped dramatically. I genuinely didn't feel like doing anything anymore, and everything I did was basically just “good enough to get it over with.”&lt;/p&gt;

&lt;p&gt;Free weekends don't just help me rest. I even let myself get a little bored. Usually, at some point, I get that feeling of, “Ahhh, I'm rested now, I'd actually love to work on this!”, and I deliberately don't do it. At most, I write the idea down. It's only when your brain finally relaxes that it has room for creativity.&lt;/p&gt;

&lt;p&gt;It's not like I close my laptop on Friday evening and don't open it again until Monday morning. Sometimes I reply to your comments, which I really enjoy. But no answering emails, creating content, and so on. Which brings us smoothly to the next point:&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Plan Your Week in Advance
&lt;/h2&gt;

&lt;p&gt;Okay, this particular tip isn't exactly controversial 😄 But it really works. If I want my weekend to stay free, I need to plan everything else throughout the week. But I also have to do it in a way that doesn't completely bury me in work, because the whole point is to do less than you could.&lt;/p&gt;

&lt;p&gt;You don't need sophisticated tools to do that. Usually, I dump everything I want to do into ChatGPT as a stream of consciousness, and it turns it into a daily plan, taking into account what's urgent, what's important, and so on. For example, today I had some admin stuff plus this article, and tomorrow evening I'll focus 100% on editing my sci-fi story for an anthology (fortunately, I'm finally on the home stretch…).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Set Embarrassingly Achievable Goals
&lt;/h2&gt;

&lt;p&gt;This is the key to avoiding procrastination. If you set yourself a goal like “I want to become a Staff Engineer at Google”, your brain will decide that you might as well sit down and do nothing. Unless you're already a Senior Engineer at Google, in which case it's a perfectly reasonable goal 😁&lt;/p&gt;

&lt;p&gt;You get the idea, right? It's one of those things coaches are always telling us 🤣 And on this one, they're actually pretty right. A goal should be realistic and measurable, and ideally, it should depend on you — although, of course, that's not always possible.&lt;/p&gt;

&lt;p&gt;If you're learning programming and want to do it professionally, a good goal is “become a junior developer,” or even “get an internship.” That's something you have a chance of achieving by learning this and that and sending your CV to companies. If you're interested in speaking at conferences, you don't tell yourself, “Now I'm going to become a tech influencer” xD. Instead, you try to come up with a cool topic and get accepted to a meetup. And so on, and so on.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Deliver Only What You're Asked For
&lt;/h2&gt;

&lt;p&gt;Haha, how many times have I fallen into this trap! In software development, we have this thing called an MVP, and I think we should make MVPs in life too.&lt;/p&gt;

&lt;p&gt;More than once, I've found myself spending time polishing details that simply weren't necessary. Am I saying that going the extra mile has &lt;em&gt;never&lt;/em&gt; helped me? I'd be lying if I did. Sometimes the extra effort genuinely paid off, although I'll never know whether “good enough” would have worked just as well.&lt;/p&gt;

&lt;p&gt;More often, though, it went the other way. In the best-case scenario, I simply did a bunch of unnecessary work. In the worst case, I built something the client didn't even want because &lt;em&gt;I&lt;/em&gt; thought it was better and so cool! Of course, it was easy enough to undo and nobody got hurt (except me), but the fact remains: my “extra” work wasn't just useless. Sometimes it actively made things worse.&lt;/p&gt;

&lt;p&gt;Obviously, in your own projects, do whatever you want. But when you're working with clients, I'd recommend sticking to this rule. Want to add something extra? Agree on it with the client first (and preferably charge extra for it).&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Know What “Done” Means Before You Start
&lt;/h2&gt;

&lt;p&gt;This is an extension of the previous point. If, for example, you set yourself a goal like “I'll learn JavaScript”, you'll never finish. I always laugh that when I was a junior, I used to put my JavaScript level on my CV as “very good,” and now I only put “good” 😄&lt;/p&gt;

&lt;p&gt;Instead, aim for something like “I'll complete this tutorial and take the test at the end” or “I'll build an app with these specific features”.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Reply to Small Things Immediately
&lt;/h2&gt;

&lt;p&gt;This is a tip I learned from my former Development Manager. If you get an email or a message that will take you no more than five minutes to answer, do it immediately or within an hour. Unless, of course, you're in the middle of something super urgent or in a deep work. Don't let it sit there for days.&lt;/p&gt;

&lt;p&gt;It's a fantastic way to keep clearing things from your life's “backlog.” As a bonus, it'll make you the perfect “low-maintenance” coworker, contractor, and so on. Where's the downside?&lt;/p&gt;




&lt;p&gt;And that's it. Obviously, these tips won't work in every situation or for everyone. I can imagine moments in life when we genuinely need to push hard because we're doing a bootcamp, facing an important deadline, or whatever else. The problem is that those “moments” sometimes get out of control, and a few weeks turn into a dozen months. Which is, of course, a pretty straightforward path to burnout and wanting to throw the whole damn thing away.&lt;/p&gt;

&lt;p&gt;So I wish you more free evenings, more free weekends, and, in general, a life where you don't work yourself to death ☺️&lt;/p&gt;

&lt;p&gt;For more super-useful life hacks 🤣 you can also follow mi on &lt;a href="https://www.linkedin.com/in/sylwia-laskowska-5a8467131/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>mentalhealth</category>
      <category>career</category>
    </item>
    <item>
      <title>The End of Undetectable AI Text? Claude’s New Watermark Explained</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Tue, 11 Aug 2026 22:33:57 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/the-end-of-undetectable-ai-text-claudes-new-watermark-explained-45g2</link>
      <guid>https://dev.to/sylwia-lask/the-end-of-undetectable-ai-text-claudes-new-watermark-explained-45g2</guid>
      <description>&lt;p&gt;For the past few hours, the whole world,&amp;nbsp; or at least my LinkedIn feed,&amp;nbsp;has been talking about one thing: Anthropic signed the &lt;strong&gt;EU AI Act’s Code of Practice on Transparency of AI-Generated Content&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Is this the end of generating funny cat stories, LinkedIn posts, and boring docs? Are we doomed? Will we have to write all those boring things manually, like animals, because otherwise some mysterious detector will expose us? 😅&lt;/p&gt;

&lt;p&gt;I just couldn't resist writing about this! The internet has already managed to produce a surprising number of myths around the topic, so let's quickly go through what we actually know for sure, which, by the way, is pretty easy to find on Claude's official pages, where the documentation is more pleasant to read than many industry articles.&lt;/p&gt;

&lt;p&gt;And as you'll see, there's really not that much to be afraid of. Also... Anthropic isn't even the first company to do this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, Why Do We Even Need This Law? Did AI-Generated Text Become Illegal in Europe?
&lt;/h2&gt;

&lt;p&gt;Of course not!&lt;/p&gt;

&lt;p&gt;If you're an EU citizen like me, you can still ask an AI to write a reply to a boring email or generate a ridiculous poem, and you won't go to jail for it. 😉&lt;/p&gt;

&lt;p&gt;The goal isn't to ban AI. It's about making AI-generated and manipulated content machine-detectable and, in specific contexts, transparent to users — especially when we're talking about things like deepfakes or content concerning matters of public interest.&lt;/p&gt;

&lt;p&gt;And there is an important nuance here: the AI Act also provides an exception for certain AI-generated or manipulated text where the content has undergone human review or editorial control and a natural or legal person holds editorial responsibility for its publication.&lt;/p&gt;

&lt;p&gt;So no, the EU has not declared war on your ChatGPT-generated emails. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Do We Actually Know So Far?
&lt;/h2&gt;

&lt;p&gt;Here's what we know for sure today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic really did sign the &lt;strong&gt;EU AI Act Article 50(2) Code of Practice on Transparency of AI-Generated Content&lt;/strong&gt;, and as part of its implementation, it is providing machine-readable marking. The relevant transparency obligations started applying on August 2, 2026. So yes, we're already there.&lt;/li&gt;
&lt;li&gt;Claude models released on or after August 2 have marking capabilities from launch. Older models don't necessarily have them yet; Anthropic is rolling this out gradually.&lt;/li&gt;
&lt;li&gt;The system works globally. Yes, even outside the EU.&lt;/li&gt;
&lt;li&gt;It applies to supported Claude models used through &lt;strong&gt;Claude, the Claude Platform/API, Claude Code, Claude Cowork, and Claude Tag&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Using Claude through AWS, Google Cloud, Microsoft Foundry, or another supported platform? The marking is applied at the model level, so using another interface doesn't magically make it disappear.&lt;/li&gt;
&lt;li&gt;There are two different mechanisms involved: an imperceptible watermark for generated text and provenance metadata for supported files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So... How Does This Watermark Actually Work?
&lt;/h2&gt;

&lt;p&gt;Anthropic calls it an &lt;strong&gt;"imperceptible watermark" embedded directly into the text&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;According to Anthropic, it survives copy-paste and can even survive some amount of editing. It's implemented at the model level rather than being something the Claude frontend simply adds afterward.&lt;/p&gt;

&lt;p&gt;But here's the important part: &lt;strong&gt;Anthropic still hasn't told us exactly how it works!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The company says more technical documentation is coming, so... expect a follow-up from me when it arrives. 😀&lt;/p&gt;

&lt;p&gt;We can make an educated guess that it might be some form of &lt;strong&gt;statistical token watermarking&lt;/strong&gt;. In such systems, we're not talking about weird spaces or invisible Unicode characters that could be removed in a second. Instead, the model can slightly and statistically prefer certain tokens during generation.&lt;/p&gt;

&lt;p&gt;In a single sentence, that kind of signal might be impossible or unreliable to detect. Across a longer piece of text, however, statistics can start revealing the pattern.&lt;/p&gt;

&lt;p&gt;So, very roughly, you could imagine something like this (&lt;strong&gt;if Anthropic has implemented its watermark this way)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normal generation&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;P(next_token | context)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watermarked generation&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;P(next_token | context) + secret statistical bias
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But again: &lt;strong&gt;Anthropic has NOT confirmed yet that this is how Claude's watermark works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is simply an educated guess based on existing text-watermarking techniques. 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  Is Claude the Only Model Watermarking Text?
&lt;/h2&gt;

&lt;p&gt;Nope!&lt;/p&gt;

&lt;p&gt;Google has actually been doing this for years. &lt;/p&gt;

&lt;p&gt;Google DeepMind introduced &lt;strong&gt;SynthID Text&lt;/strong&gt; back in 2024, and it works along the general lines I described above: the watermark is introduced during token generation, creating a statistical signal that can later be detected.&lt;/p&gt;

&lt;p&gt;OpenAI, meanwhile, has said that it has developed text-watermarking technology, although while it already uses provenance or watermarking technologies for things like images, video, and audio, it has not publicly rolled out comparable watermarking for ordinary GPT text responses.&lt;/p&gt;

&lt;p&gt;So Anthropic definitely didn't invent the idea of watermarking LLM output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Will Everyone Have Access to a Watermark Detector?
&lt;/h2&gt;

&lt;p&gt;We don't really know yet.&lt;/p&gt;

&lt;p&gt;For supported files, the situation is somewhat simpler because Anthropic uses provenance metadata, such as C2PA credentials, that can be inspected with appropriate verification tools.&lt;/p&gt;

&lt;p&gt;Text is more interesting.&lt;/p&gt;

&lt;p&gt;Anthropic says it plans to make watermark detection available to &lt;strong&gt;third parties and researchers&lt;/strong&gt;, but we don't yet know exactly who those third parties will be, what access will look like, or whether regular users will eventually get a simple public detector.&lt;/p&gt;

&lt;p&gt;So GPTZero and similar garbage may still have a job for a while.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does This Actually Mean for Us?
&lt;/h2&gt;

&lt;p&gt;Will everything finally become crystal clear? Will every LLM-generated article suddenly get a giant red &lt;strong&gt;CHEATER!&lt;/strong&gt; warning next to it? xD&amp;nbsp;Of course not!&lt;/p&gt;

&lt;p&gt;Anthropic itself openly talks about the limitations of this technology. And we've discussed variations of this problem thousands of times here on DEV already.&lt;/p&gt;

&lt;p&gt;First of all, the presence of a watermark does &lt;strong&gt;not&lt;/strong&gt; necessarily mean that the author didn't write the text themselves.&lt;/p&gt;

&lt;p&gt;Maybe they wrote the entire thing and then asked Claude to edit it, fix grammar mistakes, polish the wording, or translate it into another language. The resulting output could contain a watermark even though the actual ideas, and potentially most of the original text, came from the human author.&lt;/p&gt;

&lt;p&gt;So yes, the final article could still be chaotic, unnecessarily long, and full of a million digressions, exactly like my posts here. &lt;/p&gt;

&lt;p&gt;Anthropic explicitly points out that the opposite can happen too.&lt;/p&gt;

&lt;p&gt;Someone can take fully AI-generated slop and heavily edit it, paraphrase it, translate it, mix it with other content, or otherwise transform it enough that the watermark may no longer be detectable.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;watermark detected ≠ AI wrote everything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;no watermark detected ≠ human wrote everything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's a pretty important distinction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Images, Audio, and Video?
&lt;/h2&gt;

&lt;p&gt;With supported files, provenance can be easier to verify because we can use embedded metadata and content credentials.&amp;nbsp;But even that isn't bulletproof.&lt;/p&gt;

&lt;p&gt;What happens if someone takes a screenshot of an AI-generated image, for example&amp;nbsp;Metadata doesn't magically survive every possible transformation.&lt;/p&gt;

&lt;p&gt;And that's exactly why provenance is useful evidence, but not some perfect universal AI detector.&lt;/p&gt;

&lt;h2&gt;
  
  
  And What the Hell Happens With Code?
&lt;/h2&gt;

&lt;p&gt;This is probably the part I'm most curious about.&amp;nbsp;How exactly are they planning to handle watermarking in generated code, where the model has significantly less freedom in choosing equivalent tokens?&lt;/p&gt;

&lt;p&gt;In natural language, there can be dozens of perfectly valid ways to express essentially the same thought.&amp;nbsp;But if we have something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then how the hell do we add a statistical watermark to that?&lt;/p&gt;

&lt;p&gt;Sure, there are still choices: variable names, formatting, and so on. But the space of valid substitutions is obviously much more constrained than it is in natural language, and formatters, refactoring, minification, or even small manual edits could make the problem even more interesting.&lt;/p&gt;

&lt;p&gt;Claude Code is included in Anthropic's marking rollout, but Anthropic hasn't yet published enough technical detail for us to know exactly how the text watermark behaves with generated source code.&lt;/p&gt;

&lt;p&gt;And I really want to know how they solved this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, Should You Care?
&lt;/h2&gt;

&lt;p&gt;As you can see, Claude watermarking generated text is actually a logical and important, although obviously still imperfec, move.&lt;/p&gt;

&lt;p&gt;It probably won't change our everyday lives very much.&lt;/p&gt;

&lt;p&gt;Sure, the flood of AI slop across social media is annoying. Unfortunately, I have a feeling this watermark isn't going to magically solve that problem either. 😐&lt;/p&gt;

&lt;p&gt;What interests me much more is &lt;strong&gt;how this watermark is actually implemented&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Anthropic, I'm waiting for the docs!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>news</category>
    </item>
    <item>
      <title>Stop Calling Everything Impostor Syndrome: The Myth of "Just Push Harder"</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Tue, 04 Aug 2026 07:30:25 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/stop-calling-everything-impostor-syndrome-the-myth-of-just-push-harder-1dmm</link>
      <guid>https://dev.to/sylwia-lask/stop-calling-everything-impostor-syndrome-the-myth-of-just-push-harder-1dmm</guid>
      <description>&lt;p&gt;Not everyone who doubts themselves is suffering from impostor syndrome. Sometimes the real problem lies in the strategy they've chosen, and that's exactly why it's so important to learn to tell the difference.&lt;/p&gt;

&lt;p&gt;I read a lot of articles here on DEV about burnout, impostor syndrome, and similar topics. I thought I'd add my own perspective because I have the feeling that some advice, often given with great confidence, can actually do more harm than good. The symptoms may be real, but the diagnosis can still be wrong.&lt;/p&gt;

&lt;p&gt;Today I'd like to share my somewhat "engineering" approach to personal growth. Maybe it will help some of you. Because "just keep going" or "work harder" isn't always the right answer. &lt;/p&gt;

&lt;h2&gt;
  
  
  Impostor Syndrome
&lt;/h2&gt;

&lt;p&gt;I do experience impostor syndrome.&lt;/p&gt;

&lt;p&gt;And don't get me wrong. I generally have pretty high self-esteem, and I believe I've achieved quite a lot in different areas of my life. That doesn't stop me from doubting myself from time to time.&lt;/p&gt;

&lt;p&gt;Here's an example from just the past few days.&lt;/p&gt;

&lt;p&gt;I published an article about &lt;a href="https://dev.to/sylwia-lask/the-dirty-secret-behind-ai-agents-demo--273d"&gt;building an AI agent in around 80 lines of code&lt;/a&gt;, and it sparked an amazing discussion. I was genuinely proud of it. Even better, I got invited to speak about it at the AI Coding Summit! (By the way, if you'd like to support me, you can like my &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7489968386240806913/" rel="noopener noreferrer"&gt;LinkedIn post&lt;/a&gt; and claim a badge that gives you access to half of the conference for free!)&lt;/p&gt;

&lt;p&gt;Overall, I genuinely believe the topic is a great fit for a conference like this. What I really wanted was to see my face appear on the conference website, because I always have this feeling that once the organizers publish the speaker page, everything is basically official and they're unlikely to remove me afterward. 😅&lt;/p&gt;

&lt;p&gt;Well... it took them exactly one day.&lt;/p&gt;

&lt;p&gt;And I swear that by the end of that day, my brain had already come up with an entirely different explanation:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"What if they read my blog and realized how stupid my articles are? What if they email me saying: 'Sylwia, we've gone through your posts, and unfortunately we've decided to remove you from the conference. It's obvious you have no idea what you're talking about. We've figured you out, you fraud!'"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Reading this now, it sounds completely ridiculous.&amp;nbsp;But I believed it.&amp;nbsp;Never mind that my articles regularly appear in developer newsletters or receive lots of positive feedback. My brain had already written its own story.&lt;/p&gt;

&lt;p&gt;Here's another example.&lt;/p&gt;

&lt;p&gt;Once, an organizer described the speakers at a conference as "amazing international speakers."&amp;nbsp;Instead of feeling proud, my first thought was:&amp;nbsp;&lt;em&gt;"Amazing international speakers... and Sylwia."&lt;/em&gt;&amp;nbsp;After all, I'm just a software developer from Gdańsk. 😅&lt;/p&gt;

&lt;p&gt;This is exactly what psychologists describe as impostor syndrome: despite objective achievements and external validation, you still feel like you don't really deserve your place, and sooner or later everyone else will discover that you're a fraud.&lt;/p&gt;

&lt;p&gt;I'm not even going to dive into the psychology behind it today. Maybe that's a topic for another article.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Not Every Doubt Is Impostor Syndrome
&lt;/h2&gt;

&lt;p&gt;Here's the important part.&amp;nbsp;Not every doubt you have automatically means you're experiencing impostor syndrome.&lt;/p&gt;

&lt;p&gt;There are also areas where I'm genuinely... bad.&amp;nbsp;Take running.&lt;/p&gt;

&lt;p&gt;I'm an absolutely terrible runner. My times are objectively awful. So awful that I'd rather not even share them. 😄 I'm fully aware of it. I'd probably lose a race against a five-year-old, not to mention the fact that I don't have an ACL in either knee thanks to my old judo days.&lt;/p&gt;

&lt;p&gt;Now imagine someone giving me this advice:&amp;nbsp;&lt;em&gt;"Come on, you just have impostor syndrome! Keep running more, train harder, and one day you'll become Poland's marathon champion."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can immediately tell how absurd that sounds.&amp;nbsp;That advice wouldn't help me in the slightest.&lt;/p&gt;

&lt;p&gt;And yet, very similar advice is often given to people who are learning programming or have been unsuccessfully looking for a job for months.&lt;/p&gt;

&lt;p&gt;You've been working incredibly hard without seeing results and you're starting to feel burned out?&amp;nbsp;&lt;em&gt;"It's just impostor syndrome. Don't worry. Work harder. Keep going. Just a little longer."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You've been writing blog posts and nobody reads them?&amp;nbsp;&lt;em&gt;"It's just impostor syndrome. Don't worry. Keep publishing consistently. The results will eventually come."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Personally, I think this kind of advice can actually be harmful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think Like an Engineer
&lt;/h2&gt;

&lt;p&gt;Let's go back to my running example.&amp;nbsp;Why am I such a bad runner?&amp;nbsp;Maybe I only started recently and my expectations are unrealistic.&amp;nbsp;Maybe I'm making fundamental mistakes in training.&amp;nbsp;Maybe I'm wearing the wrong shoes.&amp;nbsp;Maybe I simply don't have much natural talent for running, and I'd enjoy a different sport much more.&lt;/p&gt;

&lt;p&gt;Or maybe I should just run for fun instead of chasing unrealistic goals.&lt;/p&gt;

&lt;p&gt;The same way of thinking applies almost everywhere else.&amp;nbsp;Have you sent hundreds of CVs without getting interviews?&amp;nbsp;Maybe it's worth asking an HR specialist to review your resume.&amp;nbsp;Maybe the market is simply terrible right now.&amp;nbsp;Maybe you're missing one specific skill that's relatively easy to learn.&lt;/p&gt;

&lt;p&gt;Maybe you're applying only for fully remote positions.&amp;nbsp;Or maybe you're aiming exclusively at FAANG companies, while you'd have much better chances at smaller organizations.&lt;/p&gt;

&lt;p&gt;Are you writing blog posts that nobody reads?&amp;nbsp;Maybe your titles could be stronger.&amp;nbsp;Maybe you should spend more time interacting with the community, learning from other people while also increasing your own visibility.&amp;nbsp;Maybe another platform would suit you better.&amp;nbsp;For example, I get fantastic engagement and wonderful discussions here on DEV, while my LinkedIn posts usually perform much worse. 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Debug Your Strategy, Not Just Your Confidence
&lt;/h2&gt;

&lt;p&gt;That's what I mean by an "engineering" approach to personal growth.&amp;nbsp;Every few months, try looking at your efforts critically, without ego, as if your own development were someone else's project.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Ask yourself:&amp;nbsp;&lt;strong&gt;Is the time I'm investing actually producing results?&amp;nbsp;&lt;/strong&gt;If not, maybe it's worth changing the strategy instead of simply trying harder.&lt;/p&gt;

&lt;p&gt;Because maybe your doubts aren't impostor syndrome at all.&amp;nbsp;Maybe they're your brain telling you that your current approach simply isn't working.&lt;/p&gt;

&lt;p&gt;Sometimes the answer really is greater confidence and perseverance.&amp;nbsp;But sometimes the answer is changing your strategy.&amp;nbsp;The hard part is learning to tell the difference.&lt;/p&gt;

</description>
      <category>career</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>It Was Just a Patch Update. What Could Possibly Go Wrong?</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 30 Jul 2026 08:02:27 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/it-was-just-a-patch-update-what-could-possibly-go-wrong-3be3</link>
      <guid>https://dev.to/sylwia-lask/it-was-just-a-patch-update-what-could-possibly-go-wrong-3be3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You know those version numbers in libraries and frameworks, right? If not, here's a quick refresher. When we have something like &lt;code&gt;package@x.y.z&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;x&lt;/strong&gt; is a major release, where breaking changes are allowed,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;y&lt;/strong&gt; is a backward-compatible feature release,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;z&lt;/strong&gt; is a patch, usually containing small fixes and bugfixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we want to keep our projects healthy, we should update at least patch versions regularly. In fact, nowadays our package managers often do it automatically if we let them.&lt;/p&gt;

&lt;p&gt;One day, however, upgrading &lt;strong&gt;just the third number&lt;/strong&gt; completely broke our application. And it wasn't the framework's fault. It was ours.&lt;/p&gt;

&lt;p&gt;I fix plenty of bugs in my daily job. But finding &lt;em&gt;the one&lt;/em&gt; worth telling in a contest meant digging surprisingly far back into my memory...&lt;/p&gt;

&lt;p&gt;So let me take you back to &lt;strong&gt;2017&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Welcome Back to 2017
&lt;/h2&gt;

&lt;p&gt;Web applications have only been taking over the world for a few years. ECMAScript 6 has been around for two years already, but we're still using its revolutionary features (Promises, arrow functions, &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt;) very carefully because browser support isn't exactly great yet.&lt;/p&gt;

&lt;p&gt;The market is so hungry for developers that companies are basically hiring anyone who can write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meetups are full of talks like &lt;em&gt;"Introduction to Angular."&lt;/em&gt; Well, the new Angular itself isn't even a year old yet. At least creating a new project only takes a single CLI command. Meanwhile, creating a React project still feels like downloading half of npm.&lt;/p&gt;




&lt;p&gt;I'm working as a fairly ambitious mid-level developer in a team that has been using Angular almost since its very beginning.&lt;/p&gt;

&lt;p&gt;The project is a large enterprise application used to monitor Fair Trade certified products. It has to work all over the world, from Western Europe to small African countries where someone might connect to the Internet from a public library once every few weeks over a painfully slow connection.&lt;/p&gt;

&lt;p&gt;Future-proofing matters.&lt;/p&gt;




&lt;p&gt;We're basically learning modern frontend development while building this application. How do Observables work? What exactly is RxJS? When should we use services?&lt;/p&gt;

&lt;p&gt;It doesn't help that Angular itself is still maturing and sometimes things simply don't work because... well... there's a bug in Angular. We file issue after issue. &lt;/p&gt;

&lt;p&gt;To Angular's credit, the team reacts incredibly fast. Sometimes they fix a bug before we even finish filling out the issue template.&lt;/p&gt;

&lt;p&gt;Naturally, we keep upgrading regularly, including minor and patch releases.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Angular's Early i18n
&lt;/h2&gt;

&lt;p&gt;As I mentioned, our application has to support many languages. Angular already has the beginnings of an i18n system, but it's nothing like what we have today. Without diving too deeply into the implementation, translatable elements are simply marked with an &lt;code&gt;i18n&lt;/code&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;i18n&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Angular CLI scans the application and generates translation files from those elements.&lt;/p&gt;

&lt;p&gt;The problem is that each language requires its own build. Switching languages at runtime isn't really an option. And unfortunately, &lt;strong&gt;runtime language switching is a hard requirement for our application&lt;/strong&gt; (I honestly don't remember why anymore 😄).&lt;/p&gt;

&lt;p&gt;Since the Angular ecosystem is still incredibly young and there aren't any mature libraries solving this problem, we decide to build our own solution.&lt;/p&gt;




&lt;p&gt;Our implementation is surprisingly simple. Whenever the language changes, we scan the page for every element containing the &lt;code&gt;i18n&lt;/code&gt; attribute and replace its contents with the proper translation.&lt;/p&gt;

&lt;p&gt;Elegant. Simple. Maybe fifteen lines of code.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Patch Update
&lt;/h2&gt;

&lt;p&gt;Everything works perfectly... until the middle of 2017.&lt;/p&gt;

&lt;p&gt;Angular is now on version 4. (I remember they skipped version 3 for perfectly reasonable reasons, although I couldn't tell you what those reasons were anymore. 😄)&lt;/p&gt;

&lt;p&gt;One day we perform a completely routine Angular upgrade. I don't remember the exact version numbers anymore, but it was something along the lines of upgrading from &lt;strong&gt;4.2.4 to 4.2.8&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A tiny patch update. Nothing should happen. Except... it did. Our translations, our entire internationalization system. All gone!&lt;/p&gt;

&lt;p&gt;The application starts normally and everything looks fine. But as soon as we try to switch languages... nothing happens. We're stuck with English.&lt;/p&gt;




&lt;h2&gt;
  
  
  Time for Some Digital Detective Work
&lt;/h2&gt;

&lt;p&gt;Now we're entering my favorite part of programming: &lt;strong&gt;software forensics.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At first, I completely dismiss the idea that such a tiny Angular update could possibly be responsible. We upgrade patches all the time. Surely something else must have happened.&lt;/p&gt;

&lt;p&gt;Back then, things like CI pipelines and automated testing are still in their infancy. Maybe our tester simply hasn't switched languages for a week or two?&lt;/p&gt;

&lt;p&gt;I go through Git history. Nothing looks suspicious. None of the recent commits touch internationalization.&lt;/p&gt;

&lt;p&gt;Maybe the backend is broken? Did the translation files disappear? &lt;/p&gt;

&lt;p&gt;Nope. Everything is exactly where it should be.&lt;/p&gt;

&lt;p&gt;Finally, almost unwillingly, I look at the Angular upgrade again.&lt;/p&gt;

&lt;p&gt;I start going backwards. Patch after patch. And sure enough... between two tiny patch versions, translations suddenly stop working.&lt;/p&gt;

&lt;p&gt;So Angular must be guilty. Or... is it?&lt;/p&gt;




&lt;h2&gt;
  
  
  Solving the Mystery
&lt;/h2&gt;

&lt;p&gt;Digging through Angular's changelog, I found a change that basically said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Why keep the unnecessary &lt;code&gt;i18n&lt;/code&gt; attribute in the generated HTML? The compiler has already done everything it needed with it. Let's remove it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suddenly everything made sense. Our entire runtime translation system depended on an implementation detail that Angular had never promised to preserve.&lt;/p&gt;

&lt;p&gt;For Angular, removing that attribute was a perfectly reasonable cleanup. For us... it broke the entire application.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Official references (if you're curious). As you see, we weren't the only people affected 🤣:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular changelog (Angular 4.2.6): "compiler: remove i18n markup even if no translations"&lt;/li&gt;
&lt;li&gt;PR #17999: &lt;a href="https://github.com/angular/angular/pull/17999" rel="noopener noreferrer"&gt;https://github.com/angular/angular/pull/17999&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Original issue #11042: &lt;a href="https://github.com/angular/angular/issues/11042" rel="noopener noreferrer"&gt;https://github.com/angular/angular/issues/11042&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow-up discussion #20055: &lt;a href="https://github.com/angular/angular/issues/20055" rel="noopener noreferrer"&gt;https://github.com/angular/angular/issues/20055&lt;/a&gt;
(I even see my collegue's comments there 🥰)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;Fortunately, fixing the problem wasn't particularly difficult. It was just... annoying. Instead of relying on Angular's internal &lt;code&gt;i18n&lt;/code&gt; attribute, we created our own directive.&lt;/p&gt;

&lt;p&gt;Its name?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fi18n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I know. Peak engineering creativity. 😂&lt;/p&gt;




&lt;h2&gt;
  
  
  Were We Terrible Engineers?
&lt;/h2&gt;

&lt;p&gt;Does this story mean we were inexperienced developers who had no idea what we were doing?&lt;/p&gt;

&lt;p&gt;Quite the opposite! We had successfully implemented &lt;strong&gt;runtime language switching&lt;/strong&gt; years before "it was cool" 😉&lt;/p&gt;

&lt;p&gt;The only mistake we made was assuming that something we happened to observe was actually part of Angular's public contract. It wasn't. We built our solution on an implementation detail that Angular had every right to change.&lt;/p&gt;

&lt;p&gt;And eventually... it did.&lt;/p&gt;

&lt;p&gt;Luckily for us, the application wasn't anywhere near production yet 😅. So in our youthful optimism, we got away with it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Bug?
&lt;/h2&gt;

&lt;p&gt;After more than a decade of professional programming, why would I choose &lt;em&gt;this&lt;/em&gt; bug instead of one of the many much bigger production incidents I've dealt with? Because the lesson has become even more relevant.&lt;/p&gt;

&lt;p&gt;In 2026, frontend development looks completely different. Nobody gives talks called &lt;em&gt;"Introduction to Angular"&lt;/em&gt; anymore. React, Angular and Vue are all mature ecosystems. Whatever problem you're facing, chances are someone has already solved it.&lt;/p&gt;

&lt;p&gt;And then there's AI, which can already handle a surprising amount of routine programming work.&lt;/p&gt;

&lt;p&gt;But could this still happen today? Absolutely. Just... probably not in frontend anymore.&lt;/p&gt;

&lt;p&gt;Today we have a brand-new ecosystem growing at an incredible pace: &lt;strong&gt;AI, and especially AI agents.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;This is where many of today's biggest engineering questions live. Conferences and meetups appear all the time because nobody has all the answers yet. We're still writing articles explaining how an agent loop works, and those aren't even beginner topics. Protocols like MCP evolve rapidly enough that staying current requires genuine effort.&lt;/p&gt;

&lt;p&gt;It reminds me a lot of frontend development back in 2017.&lt;/p&gt;

&lt;p&gt;And just like we did back then, it's incredibly easy to make dangerous assumptions during development.&lt;/p&gt;

&lt;p&gt;Someone parses a model's free-form response with a regular expression instead of using structured output.&lt;/p&gt;

&lt;p&gt;Someone assumes the model will always wrap JSON inside the exact same Markdown block.&lt;/p&gt;

&lt;p&gt;Someone builds business logic around an undocumented field returned by a provider.&lt;/p&gt;

&lt;p&gt;Someone assumes the exact same prompt will always trigger the exact same tool.&lt;/p&gt;

&lt;p&gt;Everything works today. Tomorrow it probably still works. Next month, a tiny update changes one seemingly insignificant detail...&lt;/p&gt;

&lt;p&gt;...and suddenly everything falls apart.&lt;/p&gt;

&lt;p&gt;Just like our little &lt;code&gt;i18n&lt;/code&gt; attribute did.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Lesson
&lt;/h2&gt;

&lt;p&gt;Looking back, I don't think this story is really about Angular. It's about something much more universal.&lt;/p&gt;

&lt;p&gt;As engineers, we often mistake &lt;strong&gt;observable behavior&lt;/strong&gt; for &lt;strong&gt;a guaranteed contract&lt;/strong&gt;. Just because something exists today doesn't mean the authors intended you to rely on it.&lt;/p&gt;

&lt;p&gt;If your solution depends on undocumented behavior, you're not building on solid ground. You've simply been lucky so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  BUT!
&lt;/h2&gt;

&lt;p&gt;That doesn't mean we should beat ourselves up over mistakes. Nobody gets everything right. The important part is learning from them.&lt;/p&gt;

&lt;p&gt;And this particular project? It got a happy ending. I left it years ago. But the application is still alive and doing well. Most of my code has probably disappeared by now... but I checked just before writing this article.&lt;/p&gt;

&lt;p&gt;The login screen still looks exactly the way I designed it almost a decade ago. That made me smile. HOW COOL IS THAT 🤣❤️&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>angular</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The Dirty Secret Behind AI Agents (Demo 🚀)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 23 Jul 2026 07:03:51 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/the-dirty-secret-behind-ai-agents-demo--273d</link>
      <guid>https://dev.to/sylwia-lask/the-dirty-secret-behind-ai-agents-demo--273d</guid>
      <description>&lt;p&gt;For quite a while now, I've had the feeling that AI agents are surrounded by this mystical aura. Nobody really knows what they're doing, they're probably going to take over the world soon, and if you want to build one yourself... well, obviously you need a framework.&lt;/p&gt;

&lt;p&gt;What if I told you that's not true? You can build your own AI agent in about 80 lines of code.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Today is my birthday, so as a little gift from me to myself (and to all of you!), I wrote this article. 😄 I hope you'll enjoy it!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Do We Really Need a Framework?
&lt;/h2&gt;

&lt;p&gt;Let's get to the point.&lt;/p&gt;

&lt;p&gt;Frameworks like LangChain, CrewAI, or Mastra aren't doing magic. They simplify things like conversation memory, tool execution, retries, fallbacks, etc.&lt;/p&gt;

&lt;p&gt;Once you understand the underlying mechanism, it becomes much easier to decide when a framework is actually worth using. And even if you end up using one anyway, you'll understand what's happening under the hood. &lt;/p&gt;

&lt;p&gt;So I decided to build a small demo and see how little code an AI agent actually needs.&lt;/p&gt;

&lt;p&gt;I wrote an AI agent in Node.js in roughly &lt;strong&gt;80 lines of code&lt;/strong&gt;... okay, okay, the &lt;strong&gt;core loop&lt;/strong&gt; is about 80 lines. There are still tools, a provider abstraction, and a bit of surrounding logic. But come on, &lt;em&gt;"an AI agent in 80 lines"&lt;/em&gt; sounds much better. 😄&lt;/p&gt;

&lt;p&gt;Here's the repository:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/sylwia-lask/code-review-agent" rel="noopener noreferrer"&gt;https://github.com/sylwia-lask/code-review-agent&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And since it's my birthday... if you enjoy the project, feel free to give it a ⭐. Only if you actually like it, of course. 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Steve
&lt;/h2&gt;

&lt;p&gt;The application is a simple code review agent. Well... not exactly.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Steve&lt;/strong&gt;: a software engineer with 15 years of experience reviewing other people's code. Steve doesn't take anything at face value. Sure, he can be a little sarcastic sometimes... but it's hard to argue with his conclusions.&lt;/p&gt;

&lt;p&gt;Here's what one of his code reviews looks like:&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfydb5wavs15jzt8krqg.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfydb5wavs15jzt8krqg.png" alt="Steve's agent code review" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fze4eklyq11qlo7kgg1d3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fze4eklyq11qlo7kgg1d3.png" alt="Steve's agent code review - part 2" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or when you have empty diff: &lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhqbe2cwceh41qufmv2ws.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhqbe2cwceh41qufmv2ws.png" alt="Review with empty diff" width="798" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For now, Steve reviews the local Git diff. Which basically means... he's reviewing &lt;strong&gt;himself&lt;/strong&gt;. So I guess I've built a prototype of the famous self-healing agent that, according to &lt;a class="mentioned-user" href="https://dev.to/nitsancohen770"&gt;@nitsancohen770&lt;/a&gt;, is going to take my job one day.&lt;/p&gt;

&lt;p&gt;As you can see, I'm basically helping automate myself out of employment. Maybe it's finally time to start thinking about retirement. 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  "An Agent Is Just a While Loop"
&lt;/h2&gt;

&lt;p&gt;In my previous article, I joked about people claiming that an AI agent is nothing more than a &lt;code&gt;while&lt;/code&gt; loop. Well... Mine isn't even a &lt;code&gt;while&lt;/code&gt; loop. It's a &lt;code&gt;for&lt;/code&gt; loop, because I wanted to protect myself from accidentally creating an infinite loop and loosing too much money on tokens. 😄&lt;/p&gt;

&lt;p&gt;Okay, to be fair, the loop itself doesn't actually &lt;em&gt;do&lt;/em&gt; anything. It's simply responsible for orchestrating the process. But the funny part is that most agent frameworks are doing something remarkably similar under the hood.&lt;/p&gt;

&lt;p&gt;The loop itself was trivial to write. The real challenge was exactly where you'd expect it to be.&lt;/p&gt;

&lt;p&gt;Building an AI agent starts with... choosing an LLM. 😄 This time I picked the Gemini API because tokens for projects like this are ridiculously cheap. I'm definitely tempted to build the next version using a local model, but... hold on. 😄&lt;/p&gt;

&lt;p&gt;I immediately ran into one issue: some Gemini models were overloaded, so I kept getting &lt;strong&gt;503&lt;/strong&gt; responses. That meant I had to implement something frameworks usually provide out of the box — a simple retry mechanism.&lt;/p&gt;

&lt;p&gt;Mine is intentionally very basic. Production frameworks usually offer much more, like exponential backoff, jitter, or automatic fallback to another model.&lt;/p&gt;

&lt;p&gt;The next challenge was, of course, writing the right prompt. After that, everything became surprisingly straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does the Agent Actually Work?
&lt;/h2&gt;

&lt;p&gt;It's much simpler than you might think.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1:  Send the prompt and available tools
&lt;/h3&gt;

&lt;p&gt;We send two things to the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the user's message,&lt;/li&gt;
&lt;li&gt;the list of tools the model is allowed to use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's what the request looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gemini-2.5-flash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Please review the current git diff."&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"systemInstruction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You are Steve, a senior software engineer with 15 years of experience..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"functionDeclarations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getDiff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Get the git diff of the current repository..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OBJECT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getFile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Read a file from the repository..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OBJECT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"STRING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Path to the file relative to the repository root"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"listFiles"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"List files and directories at a given path..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OBJECT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"STRING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Directory path relative to the repository root"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Wait for the model's response
&lt;/h3&gt;

&lt;p&gt;The model can respond in one of three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;with plain text,&lt;/li&gt;
&lt;li&gt;by requesting a tool call,&lt;/li&gt;
&lt;li&gt;or with both.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it returns plain text, we're done: that's our final code review. If it asks us to call a tool, we move on to Step 3.&lt;/p&gt;

&lt;p&gt;For example, we might receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"candidates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Let's see what damage we're dealing with today..."&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"functionCall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getDiff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Execute the tool locally
&lt;/h3&gt;

&lt;p&gt;Now it's our application's turn.&lt;/p&gt;

&lt;p&gt;We execute the requested tool locally. For example, running &lt;code&gt;git diff&lt;/code&gt; or reading a file from the repository, and send the result back to the model &lt;strong&gt;as another message in the conversation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The tools available in this demo are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;getDiff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getFile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;listFiles&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, everything a good code reviewer needs. 😄&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Repeat until the model is done
&lt;/h3&gt;

&lt;p&gt;Then we simply go back to Step 2. To avoid getting stuck in an infinite loop, I limit the maximum number of iterations to &lt;strong&gt;10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There's one more important detail, though.&lt;/p&gt;

&lt;p&gt;Take a look at the next request. Notice that we're sending the &lt;strong&gt;entire conversation history&lt;/strong&gt; back to the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Please review the current git diff."&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Let's see what damage we're dealing with today..."&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"functionCall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getDiff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"functionResponse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getDiff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"diff --git a/src/auth.ts b/src/auth.ts&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;--- a/src/auth.ts&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;+++ b/src/auth.ts&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;@@ -12,7 +12,7 @@&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;-  if (password === storedHash) {&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;+  if (password == storedHash) {&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And... that's it. The LLM decides &lt;strong&gt;which tool to use&lt;/strong&gt; and &lt;strong&gt;when it's done&lt;/strong&gt;. Everything else — executing the tools, handling retries, enforcing iteration limits, and orchestrating the loop — is the responsibility of our application.&lt;/p&gt;

&lt;p&gt;Simple, isn't it? If you like visualisations, ChatGPT prepared one for us 😉&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmzwfwpipz593yrikngg5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmzwfwpipz593yrikngg5.png" alt="Visualisation of how agent works" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;I'd like to write at least two follow-up articles in the future. One about connecting Steve to &lt;strong&gt;MCP&lt;/strong&gt;, and another about replacing the hosted model with a &lt;strong&gt;local LLM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But... hold on. One step at a time. 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: How does the model know it should call a function?
&lt;/h2&gt;

&lt;p&gt;If you only came here to learn how to build an AI agent, you can probably stop reading now. 😄&lt;/p&gt;

&lt;p&gt;This section is for the curious ones. Because sooner or later, someone is going to ask: &lt;em&gt;"Sylwia, what are you talking about? You say you're building your own AI agent, but you're just using the Gemini SDK. You send it JSON, you get JSON back."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And, as &lt;a class="mentioned-user" href="https://dev.to/darkwiiplayer"&gt;@darkwiiplayer&lt;/a&gt; often points out, an LLM is basically a very sophisticated next-token predictor, not some magical JSON generator.&lt;/p&gt;

&lt;p&gt;So... How does the model know what to do when we send it JSON? What would happen if, instead of Gemini, we used some old local Llama model?&lt;/p&gt;

&lt;p&gt;Does the Gemini SDK secretly prepend some special prompt? Or are the models themselves trained for this?&lt;/p&gt;

&lt;p&gt;The honest answer is that we don't know all the details. What we &lt;em&gt;do&lt;/em&gt; know is that models like &lt;strong&gt;Gemini&lt;/strong&gt; and &lt;strong&gt;GPT&lt;/strong&gt; have native support for tool calling. The SDK is responsible for formatting requests correctly and communicating with the API, while the model itself understands tool declarations and can generate function calls when it decides they're needed.&lt;/p&gt;

&lt;p&gt;In other words, if we took an older Llama model, we could still write a prompt explaining how to interpret the JSON and asking it to respond in a specific JSON format.&lt;/p&gt;

&lt;p&gt;Then we'd simply call &lt;code&gt;JSON.parse()&lt;/code&gt;...&lt;/p&gt;

&lt;p&gt;...assuming the model actually returns valid JSON instead of Markdown, an explanation, or a few "helpful" comments it decided to add. 😄&lt;/p&gt;

&lt;p&gt;That said, it's worth mentioning that newer open-source models increasingly support tool calling natively as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogue: An agent written by another agent
&lt;/h2&gt;

&lt;p&gt;Let's be honest. It's 2026. This agent was written largely by... &lt;strong&gt;another AI agent&lt;/strong&gt;. 😄&lt;/p&gt;

&lt;p&gt;Since I've been an AWS Community Builder for a while now, I cancelled my Claude Code subscription and switched to &lt;strong&gt;Kiro&lt;/strong&gt;: an AI IDE with built-in support for multiple LLMs, including Claude, GPT, and Gemini. It costs about the same, but thanks to the program, I get to use it for free. &lt;/p&gt;

&lt;p&gt;So far, I'm really enjoying it. It feels a bit like an agent-powered layer on top of VS Code, so I immediately felt at home. I also have the feeling that I'm currently using maybe &lt;strong&gt;10%&lt;/strong&gt; of what it can actually do, so I'm pretty sure I'll write more about it in the future.&lt;/p&gt;

&lt;p&gt;Now I'm just hoping AWS will finally send me some swag. 😄 I'm especially dreaming about one of their T-shirts. Years ago, we actually had a political party in Poland called &lt;strong&gt;AWS&lt;/strong&gt;, so I'd absolutely love to see the expressions on some older people's faces. 😄&lt;/p&gt;

&lt;p&gt;AWS... if you're reading this... I'm waiting!! 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;As you can see, an AI agent doesn't have to start with a framework. Sometimes all you need is an LLM, tools, convarsation history and a simple loop. Everything else is convenience, production hardening, and quality-of-life improvements.&lt;/p&gt;

&lt;p&gt;So...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think about Steve? And how do you like this approach to building an AI agent?&lt;/strong&gt; 😄&lt;/p&gt;

&lt;p&gt;If you liked this post you can also follow me on &lt;a href="https://www.linkedin.com/in/sylwia-laskowska-5a8467131/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>node</category>
      <category>ai</category>
      <category>agents</category>
      <category>javascript</category>
    </item>
    <item>
      <title>8 Things Developers Confidently Explain After Watching One YouTube Video</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Tue, 14 Jul 2026 17:57:43 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/8-things-developers-confidently-explain-after-watching-one-youtube-video-3jio</link>
      <guid>https://dev.to/sylwia-lask/8-things-developers-confidently-explain-after-watching-one-youtube-video-3jio</guid>
      <description>&lt;p&gt;I just got back from my vacation which, like 99% of Polish people, I spent in Croatia. &lt;strong&gt;Dobar dan!&lt;/strong&gt; 🇭🇷&lt;/p&gt;

&lt;p&gt;I've got a really fun article in my head right now, but it needs a bit of research before I can publish it, so that'll be coming next week. In the meantime, let's do something much lighter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BTW, a small update.&lt;/strong&gt; &lt;em&gt;I said that FrontKon would be my last conference this year... well, apparently I lied. 😂 When&lt;/em&gt; &lt;strong&gt;iJS Munich&lt;/strong&gt; &lt;em&gt;reaches out, you simply don't say no. Especially after looking at the speaker lineup. It's basically a conference full of geniuses... plus me. 😅 So I'll be speaking there at the end of October about&lt;/em&gt; &lt;strong&gt;WebAssembly and WebGPU in React&lt;/strong&gt;, &lt;em&gt;and I'm already ridiculously excited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you happen to have a spare bag of money lying around xDDD (or, much more realistically, your company still has some training budget left), come and say hi! I'd love to meet some of you in person. 😊&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Anyway... let's get back to today's topic.&lt;/p&gt;

&lt;p&gt;As many of you probably know, I have a soft spot for LinkedIn gurus and people who explain everything with absolute confidence. You know the type: their solution is always the best one, everyone else is wrong, and there are absolutely no trade-offs. 😄&lt;/p&gt;

&lt;p&gt;Sometimes I get the feeling that at least some of that confidence comes directly from a single 15-minute YouTube tutorial.&lt;/p&gt;

&lt;p&gt;But let's be fair for a second.&amp;nbsp;Who among us hasn't watched a short video, finished it thinking &lt;em&gt;"Yep, I totally understand this now!"&lt;/em&gt;, and then discovered during the actual implementation that reality was... slightly more complicated? 😂&lt;/p&gt;

&lt;p&gt;Since I spend most of my time working with JavaScript and AI agents these days, most examples will probably come from those areas. Feel free to add your own in the comments!&lt;/p&gt;




&lt;h2&gt;
  
  
  1. React / Angular / Vue (cross out the unnecessary one) is the best framework
&lt;/h2&gt;

&lt;p&gt;This is probably the most common opinion after watching an internet guru, especially if you haven't formed your own yet.&lt;/p&gt;

&lt;p&gt;Angular is the best because it has everything.&amp;nbsp;React is the best because everybody uses it.&amp;nbsp;Vue is the best because... well... Vue people will tell you why. 😄&lt;/p&gt;

&lt;p&gt;Then you spend a few years building real projects and suddenly discover that all of these have strengths, weaknesses and different use cases. In the end, the "best framework" is usually just the one that solves &lt;em&gt;your&lt;/em&gt; problem best.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. LLMs are just autocomplete
&lt;/h2&gt;

&lt;p&gt;Or, if you prefer another popular version:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"They're just stochastic parrots."&lt;/p&gt;

&lt;p&gt;"They're not creative."&lt;/p&gt;

&lt;p&gt;"They don't really understand anything."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well... if it's all that simple, why do entire teams of researchers and engineers spend years working on them? Why are companies burning through billions of dollars worth of GPUs? 😄&lt;/p&gt;

&lt;p&gt;Another statement that always makes me smile is that LLMs "aren't creative."&amp;nbsp;Sure, they probably won't invent something completely detached from everything humanity has ever known.&lt;/p&gt;

&lt;p&gt;But then again... neither do most humans.&lt;/p&gt;

&lt;p&gt;Most people don't wake up one morning and invent quantum mechanics or write &lt;em&gt;The Lord of the Rings&lt;/em&gt;. Creativity is usually about combining existing ideas in interesting ways, and LLMs are actually surprisingly good at that.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. CQRS (or Redux on the frontend) is easy
&lt;/h2&gt;

&lt;p&gt;Sure.&amp;nbsp;Then you open the codebase and suddenly you're staring into the architectural equivalent of a horror movie.&lt;/p&gt;

&lt;p&gt;I've honestly seen everything.&amp;nbsp;Business logic split between Redux stores and components.&amp;nbsp;Half the state managed globally, the other half locally.&amp;nbsp;Actions that somehow contain business logic.&amp;nbsp;Reducers that apparently decided to become services.&lt;/p&gt;

&lt;p&gt;Years ago, when I was interviewing developers more often, I used to ask a very simple question:&amp;nbsp;&lt;strong&gt;"Why do we actually need CQRS (or Redux)?"&amp;nbsp;&lt;/strong&gt;(By the way... not everyone even knew the difference between the two.)&amp;nbsp;Then I'd ask another one:&amp;nbsp;&lt;strong&gt;"Why can't we solve this in a simpler way?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I swear, a surprising number of people answered something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I don't know... that's just how people do it."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. AI agents are just a while loop
&lt;/h2&gt;

&lt;p&gt;To be fair!&amp;nbsp;A good friend of mine, and my former tech lead, actually gives an excellent conference talk with exactly this title. It's intentionally provocative.&lt;/p&gt;

&lt;p&gt;And let's face the truth... there is quite a bit of truth to it.&amp;nbsp;Many AI agents really are "just a while loop."&lt;/p&gt;

&lt;p&gt;The funny part starts about three weeks later.&amp;nbsp;Suddenly your tiny little while loop has three MCP servers, an orchestration framework, retries, memory, tool calling, etc, etc...&lt;/p&gt;

&lt;p&gt;Still one of the most fun things I've worked with recently, though.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. WebAssembly is always faster
&lt;/h2&gt;

&lt;p&gt;Whenever someone says this, I always ask the same two questions:&amp;nbsp;&lt;strong&gt;Faster than what&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;And faster at doing what?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't get me wrong, WebAssembly is amazing. There are plenty of scenarios where it absolutely destroys JavaScript performance, especially when you're dealing with computationally intensive algorithms, simulations or similar workloads.&lt;/p&gt;

&lt;p&gt;But if your application spends most of its life waiting for HTTP requests to finish...&amp;nbsp;WebAssembly probably won't make the internet faster.&lt;/p&gt;

&lt;p&gt;And it probably won't suddenly turn your dashboard into NASA software either. 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Unit tests are our golden ticket
&lt;/h2&gt;

&lt;p&gt;Especially the ones generated by the same LLM that just generated the production code. 😂&amp;nbsp;100% confidence!&lt;/p&gt;

&lt;p&gt;Or... maybe not.&lt;/p&gt;

&lt;p&gt;This can be particularly misleading on the frontend, where unit tests often verify exactly the code that was the easiest to write in the first place.&lt;/p&gt;

&lt;p&gt;Congratulations, you've successfully achieved 100% test coverage, and 0% confidence!&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Let's just add RAG
&lt;/h2&gt;

&lt;p&gt;Yeees...&lt;/p&gt;

&lt;p&gt;As if finding, cleaning, maintaining and selecting the right documents was somehow the easy part. 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Microservices / Microfrontends are the only good architecture
&lt;/h2&gt;

&lt;p&gt;Absolutely!&amp;nbsp;Especially if your application consists of six screens and one backend service. 😄&amp;nbsp;Or if you've got a perfectly healthy monolith that everyone on the team understands.&lt;/p&gt;

&lt;p&gt;Sometimes a distributed architecture is exactly what you need.&amp;nbsp;Sometimes it's just distributed complexity.&lt;/p&gt;




&lt;p&gt;I could probably keep going for another twenty examples, but I think that's enough for today. 😂&lt;/p&gt;

&lt;p&gt;What about you?&amp;nbsp;Have you ever met one of those &lt;strong&gt;"one-YouTube-video gurus"&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you enjoyed this article, consider following me also on&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/sylwia-laskowska-5a8467131/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/sylwia-laskowska-5a8467131/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jokes</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>What's Next for AI?</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Mon, 29 Jun 2026 07:18:48 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/whats-next-for-ai-219i</link>
      <guid>https://dev.to/sylwia-lask/whats-next-for-ai-219i</guid>
      <description>&lt;p&gt;I have been writing about AI for quite a while now, but this is probably the first time I genuinely do not know what to think. Not because the technology has suddenly slowed down, but because the rules of the game may be changing.&lt;/p&gt;

&lt;p&gt;I wanted to write something lighter today, but I feel like I have to share some thoughts from the last few days. It is getting harder and harder to ignore what is happening around the newest AI models. &lt;a class="mentioned-user" href="https://dev.to/pascal_cescato_692b7a8a20"&gt;@pascal_cescato_692b7a8a20&lt;/a&gt;  post, &lt;a href="https://dev.to/pascal_cescato_692b7a8a20/1-15n0"&gt;1%&lt;/a&gt;, only confirmed that I am not the only person wondering what comes next.&lt;/p&gt;

&lt;p&gt;But let’s start from the beginning. Last Friday, well-known technology journalist Adrian Bridgwater asked me for a comment for this article: &lt;a href="https://thenewstack.io/openai-gpt56-access-restricted/?brid=YWdncwEMxBTPiT6ShdbXEYRc5kmt" rel="noopener noreferrer"&gt;OpenAI GPT-5.6 Access Restricted&lt;/a&gt;. As someone who used to work in media, I know exactly what journalists hope for when they ask for a comment: a quick response, a short quote, and one strong punchline. 😅 But this time, the topic made me stop and think.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four years that changed everything
&lt;/h2&gt;

&lt;p&gt;In the last few years, the progress of AI has been incredible. We all know that. On November 30, 2022, OpenAI released ChatGPT, based on GPT-3.5, and generative AI suddenly became mainstream. It took only a few months, and by January 2023 ChatGPT had already reached around 100 million monthly users.&lt;/p&gt;

&lt;p&gt;Even then, people were saying that AI would soon take jobs away from developers. And yet, from today’s perspective, less than four years later, GPT-3.5 almost feels dumb.&lt;/p&gt;

&lt;p&gt;A year later, we were all laughing at vibe coders and contrasting them with REAL software engineers. But then coding agents arrived, and suddenly we all became vibe coders 😉 Okay, we all know that Claude Code or similar tools still will not replace a good developer today, and AI adoption inside companies often leaves a lot to be desired.&lt;/p&gt;

&lt;p&gt;But this is still less than four years of LLMs being truly available on the market. What if, in another two or four years, agents really are good enough to write code much better than humans? Where is the limit of this technology?&lt;/p&gt;

&lt;h2&gt;
  
  
  Where do developers fit in?
&lt;/h2&gt;

&lt;p&gt;I have to admit, I am a typical overthinker. I love analyzing the world and people, and thinking two hundred steps ahead. Of course, developers would still be needed in such a world, but would all of us be needed? Or would a company that used to need 500 engineers suddenly need five? Or just a small group of people training, supervising, and integrating models?&lt;/p&gt;

&lt;p&gt;I am a solid senior engineer, and my market advantage is that apart from writing code, I can talk to people. And business desperately needs that. But I am not the kind of person who will lock herself in a basement for a month and dig deep into hardware internals to make LLMs run faster. I am also not someone who will happily spend 12 hours a day in silence working on benchmarks. I admire people like that, but that is definitely not me.&lt;/p&gt;

&lt;p&gt;And I am not sure that if LLMs developed much further, my advantage of “being able to talk to business” would still be an advantage at all. So what should I do? Maybe slowly start looking toward developer advocacy, since that seems to be going well for me? Maybe send my CV to the nearby Biedronka discount store just in case — they are actually hiring, and I am there every day anyway, sometimes guiding people to products better than the staff 😆&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes, changes...
&lt;/h2&gt;

&lt;p&gt;But then something started to change. Tokens became much more expensive. Companies started realizing that maybe, for simple tasks, a junior developer might actually make more sense 😅 And seriously, I do not yet see a massive wave of hiring interns, but saving tokens, giving up certain tools, and saying “use a cheaper model for simple tasks” has become very common.&lt;/p&gt;

&lt;p&gt;And now there is the embargo. First around Mythos and Fable, and now around GPT-5.6. If you missed it, the short version is that access to some of the most advanced AI models is no longer simply “available to everyone who can pay.” It is becoming restricted, limited by geography, organization type, security concerns, or strategic decisions. In practice, this means that not every developer, company, or country can count on equal access to the best models anymore.&lt;/p&gt;

&lt;p&gt;I do not know what to think about this. Are these models really so dangerous for critical infrastructure? &lt;/p&gt;

&lt;p&gt;Or maybe governments have simply started treating them as a strategic asset, similar to semiconductors? Maybe this is the end of the free AI market?&lt;/p&gt;

&lt;p&gt;For developers, at first, it probably will not matter that much. Even if LLM progress stopped at the models we already have today, we would still improve the infrastructure, polish the agents, build better tooling, and continue working quite happily. Maybe for some time the models would even become more stable, with more reliable APIs and better developer experience.&lt;/p&gt;

&lt;p&gt;But what happens next? Will working with powerful LLMs be reserved only for selected people? Or selected companies? Or selected countries?&lt;/p&gt;

&lt;p&gt;On the other hand... these models are ridiculously expensive. Somebody has to pay for them. It is difficult for me to imagine companies investing billions only to keep their best models locked in a vault forever. They need customers. They need revenue. So maybe this whole "AI embargo" is only temporary? Or maybe governments will eventually step in and treat frontier AI the way they treat strategic infrastructure? Honestly, I have no idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  So... what happens next?
&lt;/h2&gt;

&lt;p&gt;Maybe it will be like Polish sci-fi writer Rafał Kosik predicted 20 years ago in his young adult series Felix, Net and Nika — AI will become unavailable to the public because it will be considered too dangerous, and models will be kept locked away? 😉 Of course, this is an extreme vision, but honestly, nothing surprises me anymore.&lt;/p&gt;

&lt;p&gt;Just a year or two ago, we were asking whether AI would replace developers. Today I find myself wondering about something slightly different: will the most powerful AI even remain available to ordinary people?&lt;/p&gt;

&lt;p&gt;What do you think? Where is all of this going? I do not want to pretend to be an all-knowing sheriff here, and I am genuinely curious about your perspective.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also, I will not publish anything next week because I am going on vacation — like every self-respecting Polish person, to Croatia. This is just a note for those of you who read my posts every Sunday around lunchtime 😆&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And if you are from Czechia or somewhere nearby, come to *&lt;/em&gt;&lt;a href="https://www.frontkon.tech/" rel="noopener noreferrer"&gt;FrontKon&lt;/a&gt;*&lt;em&gt;, where I will be speaking. Let’s high-five there!&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Or, if you like, please follow me on &lt;a href="https://www.linkedin.com/in/sylwia-laskowska-5a8467131/" rel="noopener noreferrer"&gt;LinkedIn.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>webdev</category>
    </item>
    <item>
      <title>7 New JavaScript Features (And 2 I'm Still Waiting For)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Wed, 24 Jun 2026 09:14:11 +0000</pubDate>
      <link>https://dev.to/sylwia-lask/7-new-javascript-features-and-2-im-still-waiting-for-2ck8</link>
      <guid>https://dev.to/sylwia-lask/7-new-javascript-features-and-2-im-still-waiting-for-2ck8</guid>
      <description>&lt;p&gt;Remember how I promised you (or rather myself) two weeks ago that from now on I'd only write light, easy posts? Well… I broke that promise 😅 Last week I published a huge article about one of the least sexy topics imaginable: legacy applications. Somehow, despite that, the DEV editorial team liked it enough to include it in the &lt;strong&gt;Top 7 Posts of the Week&lt;/strong&gt; ❤️&lt;/p&gt;

&lt;p&gt;But today is finally the day for something a bit lighter. And I think it's a topic that deserves more attention.&lt;/p&gt;

&lt;p&gt;These days we spend a lot of time talking about AI agents, and I absolutely understand why, because it's a fascinating field. But I sometimes feel we're forgetting that the programming languages we use every day are evolving too.&lt;/p&gt;

&lt;p&gt;I spend most of my days writing JavaScript (well… TypeScript, obviously 😄). And yes, the ecosystem has matured a lot over the last few years. We no longer have endless React vs Angular wars. We're also mostly past those times when everyone loved Redux one month and six months later decided it was an overengineered monster and removed it from every application 😅.&lt;/p&gt;

&lt;p&gt;But both the ecosystem and the ECMAScript standard keep evolving.&lt;/p&gt;

&lt;p&gt;After the legendary ES6 release in 2015, which changed frontend development forever, the TC39 committee switched to an iterative approach and started shipping new features every year.&lt;/p&gt;

&lt;p&gt;And the nice thing is that if you're using modern browsers or runtimes, you often get access to these features almost immediately.&lt;/p&gt;

&lt;p&gt;So, what do we get in &lt;strong&gt;ECMAScript 2026&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Oh, and to keep things entertaining, all code examples in this article are based on the internal monologue of imaginary LinkedIn gurus with very strong opinions. Any resemblance to actual people is, naturally, purely coincidental 😇&lt;/p&gt;

&lt;p&gt;Other articles from this series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/sylwia-lask/stop-installing-libraries-10-browser-apis-that-already-solve-your-problems-35bi"&gt;Stop Installing Libraries: 10 Browser APIs That Already Solve Your Problems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/sylwia-lask/9-things-youre-overengineering-the-browser-already-solved-them-o99"&gt;9 Things You're Overengineering — The Browser Already Solved Them&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/sylwia-lask/16-modern-javascript-features-that-might-blow-your-mind-4h5e"&gt;16 Modern JavaScript Features That Might Blow Your Mind&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Map.prototype.getOrInsert() / Upsert
&lt;/h2&gt;

&lt;p&gt;MDN:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/getOrInsert" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/getOrInsert&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is one of those features that makes you wonder: "Wait… why didn't we have this ten years ago?"&lt;/p&gt;

&lt;p&gt;Imagine we're collecting opinions from LinkedIn gurus. Until now, we had to do something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;opinions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addOpinion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;opinions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;opinions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;opinions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;addOpinion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React is dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10x Engineer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;addOpinion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React is dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Principal AI Evangelist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, but there's quite a bit of boilerplate.&lt;/p&gt;

&lt;p&gt;With ES2026, things become much nicer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;opinions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;opinions&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrInsert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React is dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10x Engineer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;opinions&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrInsert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React is dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Principal AI Evangelist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opinions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also get a computed version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;opinions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;opinions&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrInsertComputed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nobody writes clean code anymore&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DDD Purist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Come on, that's so much cleaner and easier to read. It's also perfect for caching! Much less code, much nicer API.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Iterator.concat()
&lt;/h2&gt;

&lt;p&gt;MDN:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator/concat" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator/concat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we talk about &lt;code&gt;concat()&lt;/code&gt;, let's quickly answer a question:&lt;/p&gt;
&lt;h3&gt;
  
  
  What is an iterator?
&lt;/h3&gt;

&lt;p&gt;An iterator is basically a cursor that lets us consume data one element at a time without storing everything in memory.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Angular is dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript was a mistake&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iterator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// { value: "Angular is dead", done: false }&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// { value: "JavaScript was a mistake", done: false }&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// { value: undefined, done: true }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And because iterators are lazy, we can even generate infinite sequences without blowing up memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;endlessHotTakes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Everything should be rewritten in Rust.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iterator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;endlessHotTakes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Last year we got Iterator Helpers, which introduced things like &lt;code&gt;map()&lt;/code&gt;, &lt;code&gt;filter()&lt;/code&gt;, and friends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;linkedinFeed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Use Rust for everything&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript was a mistake&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Clean code is dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Angular is dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controversialTakes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nf"&gt;linkedinFeed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`🔥 &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;controversialTakes&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now we get another nice addition: &lt;code&gt;Iterator.concat()&lt;/code&gt;. Suppose frontend gurus and backend gurus each have their own stream of wisdom:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;frontendExperts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React is dead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nobody needs Redux&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;backendExperts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Microservices solve everything&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Frontend developers don't understand architecture&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can combine them elegantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;frontendExperts&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nf"&gt;backendExperts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my opinion, these iterator features don't get nearly as much attention as they deserve.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Array.fromAsync()
&lt;/h2&gt;

&lt;p&gt;MDN:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fromAsync" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fromAsync&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is basically the async equivalent of our beloved &lt;code&gt;Array.from()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It's primarily designed for async iterators, although I suspect that most JavaScript developers don't use async iterators every day. For example, imagine comments arriving one by one from LinkedIn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;angryComments&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This could have been a plain HTML form.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Angular is dead.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React is dead.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript was a mistake.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;angryComments&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// This could have been a plain HTML form.&lt;/span&gt;
&lt;span class="c1"&gt;// Angular is dead.&lt;/span&gt;
&lt;span class="c1"&gt;// etc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But here's something many people don't realize: it also works with promises.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;opinions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nobody should use classes.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Signals change everything.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Microservices ruined software.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;takes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opinions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;takes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you can even map values immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;angryComments&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nx"&gt;opinion&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;opinion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pretty convenient.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Math.sumPrecise()
&lt;/h2&gt;

&lt;p&gt;MDN:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sumPrecise" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sumPrecise&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one solves a floating-point problem that's almost as old as the Internet itself 😄 As many of you probably know, in JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 0.30000000000000004&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I won't dive into why that happens today: we'd be here all night 😄&lt;/p&gt;

&lt;p&gt;The important thing is that ES2026 introduces &lt;code&gt;Math.sumPrecise()&lt;/code&gt;, which performs much more accurate summation and avoids the accumulation of rounding errors.&lt;/p&gt;

&lt;p&gt;Suppose a LinkedIn guru is listing all the things that allegedly increase productivity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;productivityBoosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// cold showers&lt;/span&gt;
  &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// AI agents&lt;/span&gt;
  &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// journaling&lt;/span&gt;
  &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// waking up at 4 AM&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sumPrecise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;productivityBoosts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, to be fair, most frontend developers will probably never need this. Plain old addition works perfectly fine for everyday use.&lt;/p&gt;

&lt;p&gt;But if you're working in finance, statistics, simulations, or AI/ML, where tiny errors can accumulate over thousands or millions of operations, this becomes much more interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Error.isError()
&lt;/h2&gt;

&lt;p&gt;MDN:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/isError" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/isError&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one is probably aimed more at library authors and advanced developers. Or maybe not? 😉 Until now, checking whether something was actually an error usually looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Angular is dead.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And most of the time, that worked perfectly fine. Until it didn't.&lt;/p&gt;

&lt;p&gt;If an error originated in another realm, for example an iframe, a Web Worker, or a VM context—&lt;code&gt;instanceof Error&lt;/code&gt; could suddenly betray you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;strangeThing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;new Error('JavaScript was a mistake.')&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;strangeThing&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// false &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This problem has been annoying library authors for years, which is why many frameworks and libraries have their own helper functions for detecting errors. Now we finally get a built-in solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;strangeThing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple and beautiful.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Base64 for Uint8Array
&lt;/h2&gt;

&lt;p&gt;MDN:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toBase64" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toBase64&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quick reminder: Base64 is simply a way of converting binary data into plain text. Why would we do that? Because many protocols and formats are much happier dealing with text than raw bytes. For example, we might send an image as a Base64 string.&lt;/p&gt;

&lt;p&gt;Now, someone might say: "Wait a minute, Base64 already existed in JavaScript!" And yes, it did. But it mostly worked with strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;btoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript was a mistake.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When dealing with binary data, things quickly became ugly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;btoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromCharCode&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not terrible, but definitely not something you'd call elegant.&lt;/p&gt;

&lt;p&gt;Now we can simply write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/proof/react-is-dead.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBase64&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much cleaner. And, perhaps more importantly, much easier to understand six months later.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. JSON.parse Source Text Access
&lt;/h2&gt;

&lt;p&gt;MDN:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;JSON.parse()&lt;/code&gt; is great. Until somebody sends you a gigantic number. Suppose a LinkedIn guru claims to have 999 trillion followers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
{
  "followers":
  999999999999999999999999999999
}
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;followers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Oops. JavaScript numbers have limits, and very large integers may lose precision.&lt;/p&gt;

&lt;p&gt;With ES2026, the reviver callback gets access to the original source text, allowing us to recover huge values safely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;followers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;followers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more accidental corruption of giant numbers.&lt;/p&gt;

&lt;p&gt;Most of us won't need this every day. But if you're dealing with IDs, financial data, or huge integer values, this can save you from some nasty bugs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: The Great Absentees
&lt;/h2&gt;

&lt;p&gt;I was really hoping these features would make it into ES2026, but unfortunately we'll have to wait another year.&lt;/p&gt;

&lt;p&gt;Well, sort of. Modern browsers and runtimes have already started implementing them, but they are not officially part of the ECMAScript 2026 specification yet.&lt;/p&gt;

&lt;p&gt;These are probably the two features I'm personally most excited about.&lt;/p&gt;




&lt;h2&gt;
  
  
  Temporal API
&lt;/h2&gt;

&lt;p&gt;TC39 proposal:&lt;br&gt;
&lt;a href="https://github.com/tc39/proposal-temporal" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-temporal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've been doing frontend development long enough, chances are you've had at least one traumatic experience involving dates. Maybe something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2026-03-30&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depending on your timezone, congratulations! You've just entered the exciting world of: "Why is it yesterday?"&lt;/p&gt;

&lt;p&gt;Or perhaps you've experienced everyone's favorite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setMonth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And suddenly you're debugging why March plus one month somehow became May.&lt;/p&gt;

&lt;p&gt;Or maybe you've been lucky enough to deal with time zones.&lt;/p&gt;

&lt;p&gt;At which point you discover that time itself is apparently an illusion and that daylight saving time was invented specifically to ruin programmers' lives.&lt;/p&gt;

&lt;p&gt;This is why many of us ended up using libraries like Moment.js. Ironically, even the Moment.js maintainers now recommend using other solutions. Then came date-fns, Luxon, and various other attempts to restore sanity.&lt;/p&gt;

&lt;p&gt;They certainly help. Until somebody says: "By the way, users in Australia are reporting weird bugs." And that's usually where the fun begins.&lt;/p&gt;

&lt;p&gt;Temporal aims to fix all of this by introducing proper date and time types.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we get things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Temporal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instant&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;birthday&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;Temporal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PlainDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1987-07-23&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;meeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;Temporal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ZonedDateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2026-11-03T10:00:00[Europe/Warsaw]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And suddenly everything becomes much more explicit.&lt;/p&gt;

&lt;p&gt;By the way, I spent an embarrassing amount of time trying to figure out whether Temporal had actually made it into ES2026. Eventually, I found the TC39 repository, where it clearly says that although the proposal has already reached Stage 4, its expected publication year is 2027.&lt;/p&gt;

&lt;p&gt;So we're close. Very close. And I can't wait ❤️&lt;/p&gt;




&lt;h2&gt;
  
  
  Explicit Resource Management (&lt;code&gt;using&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;TC39 proposal:&lt;br&gt;
&lt;a href="https://github.com/tc39/proposal-explicit-resource-management" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-explicit-resource-management&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is one of those features that C# and Python developers have been quietly enjoying while the rest of us pretended that &lt;code&gt;try/finally&lt;/code&gt; was perfectly fine 😄&lt;/p&gt;

&lt;p&gt;Sometimes you create something that needs cleaning up afterward: file, database connection, stream, WebSocket, etc. Today, we usually write something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;webinar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nf"&gt;createAIAgentsWebinar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;webinar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;webinar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;finally&lt;/code&gt; block is often written with the same enthusiasm as unit tests. Worse, if we forget it entirely, we may end up with resource leaks and mysterious bugs.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;using&lt;/code&gt;, cleanup happens automatically when leaving the scope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;using&lt;/span&gt; &lt;span class="nx"&gt;webinar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nf"&gt;createAIAgentsWebinar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;webinar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we leave the scope, JavaScript automatically calls the cleanup logic. How cool is that?&lt;/p&gt;

&lt;p&gt;It's one of those features that might not affect the average frontend developer every day, but for Node.js developers, library authors, and people working with streams and files, it can be incredibly useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uff...
&lt;/h2&gt;

&lt;p&gt;I have to admit, this article turned out to be way more work than I originally expected 😅 It was supposed to be short and easy. And somehow I ended up digging through TC39 proposals, MDN pages, browser implementations, and trying to figure out whether Temporal had actually made it into ES2026 or not.&lt;/p&gt;

&lt;p&gt;But I hope it was worth it and that you enjoyed it ❤️&lt;/p&gt;

&lt;p&gt;What about you? Which feature surprised you the most? And are you also eagerly waiting for Temporal to finally free us from all date-related suffering?&lt;/p&gt;

&lt;p&gt;(Or at least that's what the LinkedIn gurus will probably tell us next week 😇)&lt;/p&gt;




&lt;p&gt;If you enjoyed this article, feel free to connect with me on &lt;a href="https://www.linkedin.com/in/sylwia-laskowska-5a8467131/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;😊&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
