<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vale's blog</title>
    <link>https://valentinacalabrese.com</link>
    <description>Notes on interfaces, front-end engineering, teams and AI.</description>
    <atom:link href="https://valentinacalabrese.com/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Proved, but Not Yet Understood</title>
      <link>https://valentinacalabrese.com/blog/proved-but-not-yet-understood</link>
      <guid>https://valentinacalabrese.com/blog/proved-but-not-yet-understood</guid>
      <pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[On OpenAI's 719 machine-written math manuscripts, a quarrel over who sets the norms, and what our code review queues have been trying to tell us about…]]></description>
      <content:encoded><![CDATA[<p><em>On OpenAI’s 719 machine-written math manuscripts, a quarrel over who sets the norms, and what our code review queues have been trying to tell us about understanding.</em></p>
<p>On the night OpenAI put its mathematics repository on GitHub, the complexity theorist Dana Moshkovitz texted her husband about the manuscript claiming to prove the Unique Games Conjecture, a statement he says she has worked toward for as long as he’s known her. “It feels like something written by someone who’s on psychedelics,” she wrote. Her husband is Scott Aaronson, who quoted those texts in <a href="https://scottaaronson.blog/?p=10169">his post “The Mathocalypse”</a>, just below a line I read a few times. The UGC manuscript comes with a Lean certificate, so a machine has checked the formal proof, and yet “it also appears that no human has understood just about any of these proofs yet; the race to do so has just started.”</p>
<p>My last post, <a href="https://valentinacalabrese.com/blog/let-the-agents-cook-make-them-prove-it/">Let the Agents Cook. Make Them Prove It.</a>, argued that verification is the foundation of agent autonomy, because machine-checkable evidence is what makes it reasonable to let agents do more on their own. I still believe that. Here, though, verification had apparently worked, and the people who cared most about the result were still standing outside it. So this post is a qualification rather than a retraction: verification can justify trusting an output without creating the understanding needed to extend or maintain it, and in software, where someone has to change the code again next quarter, that understanding is a large part of the job. The two ideas are complementary, and mathematics just happens to make the gap between them easier to see.</p>
<h3 id="the-short-version-of-the-release">the short version of the release</h3>
<p>On October 6, OpenAI <a href="https://openai.com/index/sharing-ai-progress-in-mathematics/">announced</a> “a broad range of new mathematical results produced by an internal frontier model” (unreleased), published as <a href="https://github.com/openai/math">a GitHub repository</a> of 719 manuscripts organized into 372 “families” of related results. By OpenAI’s account the average result used roughly three hours of ChatGPT Pro thinking compute, and after an October 7 update about 42% of top-line results are formalized in Lean, 300 of 719. All of it is self-reported and none of it peer-reviewed. One day after release the <a href="https://github.com/openai/math/blob/main/history.md">history file</a> recorded three withdrawals because “a sign error invalidates a stabilization-trace cancellation argument and the construction used by two dependent papers,” which anyone who has watched one bad utility function quietly break three services downstream will recognize.</p>
<p>A week earlier the Advisory Group on Mathematics and Artificial Intelligence, nine independent mathematicians including Timothy Gowers, Martin Hairer and Edward Witten, had published <a href="https://agmai.org/general-sep29/">guidelines</a> for responsible release of AI-generated mathematics. On release day the group issued <a href="https://agmai.org/">a carefully neutral statement</a> calling the release “the beginning, not the completion, of the process of human understanding.”</p>
<h3 id="two-different-ledgers">two different ledgers</h3>
<p>I keep coming back to <em>the process of human understanding</em>, because it names something the word “verified” tends to swallow.</p>
<p>A Lean certificate answers a narrow and extremely valuable question: does this formal statement follow from these definitions and axioms, according to this kernel? Even that answer depends on the formal statement being the right one. In <a href="https://terrytao.wordpress.com/2026/10/09/what-mathematicians-should-know-about-the-lean-theorem-proverquestions-of-reliability-and-ai/">a guest post on Terence Tao’s blog</a>, Thomas Hales argues that a Lean proof “should not be accepted until a human audit is performed to ensure statement fidelity,” and <a href="https://arxiv.org/abs/2610.08144">a preprint by Bastounis, Circelli and Hansen</a> argues that an autoformalized proof can follow a different argument from the paper humans are reading. The deeper issue is that correctness and comprehension are kept on two separate ledgers, and a certificate only writes to the first one. Comprehension is what lets you reuse an idea, notice that it would also crack a neighboring problem, or see where it breaks if you change a hypothesis, and most of the value of a new result sits on that second ledger.</p>
<p>The advisory group’s guidelines state the old norm plainly: “the authors of a paper should understand the mathematical argument of that paper, have verified its correctness themselves, and take full responsibility for the content.” Read that with a pull request in mind. Understanding, verification and responsibility have always travelled together in the person of the author, so we rarely had to name them separately. Machine authorship pulls them apart, and once you can have verification without understanding, it’s no longer obvious who holds the responsibility.</p>
<h3 id="the-same-bottleneck-in-our-repos">the same bottleneck, in our repos</h3>
<p>We’ve been running a version of this experiment in software for a while, just without the vocabulary. Harvard economists Fiona Chen and James Stratton used Jellyfish engineering analytics covering roughly 300 million work events across 718 firms, from January 2021 through March 2026. <a href="https://fion.ac/jellyfish.pdf">Their paper</a>, <a href="https://arstechnica.com/ai/2026/10/ai-coding-agents-generate-more-code-but-not-more-software/">covered by Ars Technica</a>, finds agents raise lines of code by 30%, commits by 20% and pull requests by 23%, while resolved Jira issues and epics, the authors’ proxy for shipped software, show small, statistically insignificant changes. The time from opening a pull request to merging it rises 49%, the share of PRs where a reviewer formally requests changes nearly doubles, and comments per PR rise 35%.</p>
<p>I lead a web engineering team and still build a lot myself, so the review queue isn’t an abstraction for me (I touched on it in <a href="https://valentinacalabrese.com/blog/ai-engineering-is-not-a-vibe/">Agentic Engineering Is Not a Vibe</a>). At its core, code review is the moment a second person builds enough of a mental model of a change to share responsibility for it. That’s comprehension work, and it doesn’t get faster because the code was cheaper to write.</p>
<p>An agent’s PR also tends to arrive without the thing a human author brings into review almost for free, which is someone who can answer <em>why</em>.</p>
<p>A colleague can usually explain an odd choice in a minute. With an agent’s change, the reviewer reconstructs the reason from the diff, or re-prompts and hopes to get the reason rather than a plausible story about it.</p>
<p>I suspect that reconstruction is where a good share of the extra review time goes, but that’s my hypothesis, not the study’s finding. Longer reviews don’t by themselves show that comprehension got harder. The same numbers could come from larger changes (lines of code grew faster than pull requests), from reviewers stretched across more of them, or from teams raising their standards, and the authors can’t fully separate more code arriving at fixed review capacity from review itself changing, “either because the code written now is of worse quality, or because the standards of code review have changed.” It’s also a job market paper, not yet peer-reviewed, that measures firm-level adoption rather than individual use, with data that stop before the latest generation of agents. So the study is consistent with a comprehension bottleneck without proving one. What it does show fairly convincingly is that the cost moved downstream, to wherever humans have to understand things.</p>
<h3 id="a-quarrel-about-who-sets-the-norms">a quarrel about who sets the norms</h3>
<p>The sharpest reaction to the math release came from the Association for Human Mathematics, whose statement on <a href="https://www.ahmath.org/statements">the AHM site</a> was reposted as <a href="https://terrytao.wordpress.com/2026/10/07/ahm-statement-on-openais-october-6-release-of-mathematical-documents/">a guest post on Tao’s blog</a>, which he hosted but didn’t write, a distinction plenty of people missed. It calls the release “not a demonstration of scholarship, but a demonstration of power” and urges mathematicians to stop working with OpenAI. I don’t think a boycott helps, since it doesn’t un-prove anything, but in economic terms the complaint is fairly precise. Each result cost about three hours of model compute by OpenAI’s account, absorbing them will cost the receiving community years of skilled human attention, and the producer set the schedule. Cheap to produce and expensive to absorb is exactly the asymmetry sitting in our review queues.</p>
<p>The contrast Aaronson draws next is, for me, the most interesting part of his post. A day before OpenAI’s release, Josh Alman and Virginia Vassilevska Williams posted <a href="https://arxiv.org/abs/2610.06783">a preprint</a> with truly subquadratic 3SUM and truly subcubic all-pairs shortest paths, refuting two long-standing hypotheses of fine-grained complexity. The paper says Claude discovered the core algorithm in a single session of 16 million output tokens “with no human input,” and that Anthropic shared it with the authors under a confidentiality agreement and offered compensation. The authors then “worked to understand, simplify, strengthen, and extend the algorithm,” wrote the paper, and “take full responsibility” for it, with the Lean certification done afterwards. Aaronson calls these the “OpenAI model” and the “Anthropic model” and is fair to both: the first “sets up a crazy race among humans to digest and explain a messy AI proof,” while the second “puts a private company in the position of picking and choosing which human mathematicians get to be the emissaries of the AI.”</p>
<p>Put in the terms of this post, the Anthropic model is comprehension-first, since the result reached the world already attached to two people who understood it and would answer for it, while the OpenAI model is verification-first, with comprehension left as an exercise for the reader. I don’t think either is obviously right, and it bothers me a little that both were chosen by companies rather than by the communities that have to live with them.</p>
<h3 id="the-firehose-with-patches-attached">the firehose, with patches attached</h3>
<p>The third story makes the pattern clearer, because here the receiving community asked for the firehose. On October 8, Anthropic <a href="https://www.anthropic.com/research/launching-opt-in-vuln-finding-service-for-open-source">launched OSS Scanner</a>, an opt-in service whose vulnerability reports are “fully model-generated, without human review or triage,” because the company remains “bottlenecked on our human capacity to validate these findings.” Maintainers kept asking for everything anyway.</p>
<p>An <a href="https://vulnerabilities.ai/two-labs-opposite-answers-triage-bottleneck">independent analysis by Vulnerabilities.ai</a> of Anthropic’s own disclosure dashboard, as of October 2, lays out the funnel: of 6,157 findings disclosed to maintainers, about 78% went directly without independent review, and 516 had been patched upstream. The disclosed count measures production. The patched count measures action taken: a fix landed upstream, which is real but lags. Neither measures comprehension. A maintainer can understand a finding perfectly well and still not patch it, because it duplicates a known issue or falls outside the project’s threat model (Anthropic’s glossary, the analysis notes, counts duplicates and “won’t fix” findings as true positives). Conversely, a ready-made patch can be merged without deep understanding once its reproducer stops reproducing, which is this post’s worry one level down. So 516 tells me how much of the output became changed code, not how much of it anyone understood.</p>
<p>Here’s the part I can’t stop turning over. In security it’s OpenAI running the curated model: its <a href="https://openai.com/index/patch-the-planet/">Patch the Planet</a> initiative has Trail of Bits researchers “reproduce the evidence” and “reassess severity” before maintainers see anything, while Anthropic is the one sending raw output. In mathematics the roles are reversed. Whatever is driving these choices, then, it isn’t a stable corporate philosophy about openness. 🤔</p>
<p>My tentative explanation is that whether a firehose is tolerable depends on the distance between the new artifact and what the receiver already understands. A vulnerability report with a working reproducer and a candidate patch lands in a codebase the maintainer knows intimately, so the new thing is small relative to an existing mental model and cheap to check. OpenSSL’s Anton Arapov says as much in Anthropic’s post: when a report comes with a real exploit attached, “that’s basically job done for an engineer as you can verify it right away.” A long proof built on what Moshkovitz called “some alien craziness,” an entirely new recursive code, lands somewhere nobody has a model at all. The Lean certificate plays the role of the reproducer for correctness, but there’s no equivalent reproducer for understanding, which is why the same volume of output can feel like a gift to a maintainer and a tax to a mathematician.</p>
<h3 id="where-this-argument-is-weakest">where this argument is weakest</h3>
<p>The strongest objection is that we already depend, constantly, on things nobody understands in full. Nobody reads compiler output. The four colour theorem was accepted on the strength of a computer check few mathematicians claim to follow line by line. Any <code>node_modules</code> folder is a monument to trust in strangers. If comprehension were really required for code to be valuable, modern software wouldn’t exist.</p>
<p>I think that’s right, and it sharpens the claim more than it kills it. We rely on compilers because their inputs are understood, their behavior is specified, and an enormous amount of comprehension went into the compiler itself, and we rely on dependencies because someone maintains them and answers for them. Unread code is fine when there’s an understood boundary around it and a responsible party behind it. Agent-written code raises the question of whether that boundary still exists, and in a PR that touches your own business logic there’s no one else’s boundary to hide behind.</p>
<p>There’s an asymmetry with mathematics, too. A true theorem stays true, so a community can afford to bank an unread proof and come back to it in ten years. Software rots: requirements change, dependencies drift, and someone has to modify the code next quarter with a working model of why it is the way it is. In that narrow sense software needs comprehension more urgently than mathematics does, even though our artifacts are a good deal less profound. 😅</p>
<p>The other serious objection is that the comprehension bottleneck may be temporary. Moshkovitz spent the following day asking an AI model to explain the UGC construction, and within roughly a day of her first texts Aaronson reported that she “now mostly understands the proof” and wants to give talks about it. That’s a remarkable turnaround, and I’d be delighted if agents became excellent explainers of their own work. But a commenter on the same thread raised a point I found unsettling, wondering how much of the clarity people perceive when they press a model for explanations “is just their own informational contribution reflected back at them.” An explanation helps you comprehend, but it can’t comprehend on your behalf, and it doesn’t move the responsibility anywhere.</p>
<h3 id="norms-worth-borrowing">norms worth borrowing</h3>
<p>What I find genuinely useful in the math community’s response is that it’s trying to write the norms down, which software mostly hasn’t. The advisory group asks producers to have “the model, or some other model” write each proof readably, to disclose prompts, compute and how often the model failed, to state each result’s formalization status, and to pay for the understanding they haven’t supplied. Translated into engineering, that gives me three questions any team merging agent PRs should answer for itself. My answers are proposals worth trying, not settled practice.</p>
<p><em>What evidence should come with an agent’s PR?</em> Making a change reviewable should count as part of the agent’s job, so I’d want:</p>
<ul>
<li>The intent in the reviewer’s terms: the problem, the linked issue, which interfaces and callers the change touches, and what the agent chose not to do and why.</li>
<li>A ledger of checks: what was machine-checked (tests, types, invariants, an independent verifier), against which revision, and just as explicitly what wasn’t, so “the tests pass” can’t quietly stand in for “this is right.”</li>
<li>A reproducer where one makes sense, a test that fails before the change and passes after, which connects it to the reviewer’s existing mental model the way a working exploit does for a vulnerability report.</li>
<li>The dead ends: approaches abandoned and roughly how many attempts it took.</li>
<li>A named human who has read all of that and can answer why.</li>
</ul>
<p><em>Who needs to understand the change, and how deeply?</em> Not everyone, and not always all the way down. The compiler objection suggests the line: code behind an understood boundary with a responsible party can be trusted at the boundary, and code inside your own business logic can’t. So I’d try two depths. Every reviewer needs boundary depth, meaning what the change does, which invariants it relies on, and what the checks cover and leave out. Anything headed for the core of the system also needs one person at modification depth, able to change it next quarter without the agent, explain it to a teammate without opening the transcript, and predict roughly how it will fail. A generated API client probably needs only the first and payment logic needs both, and I’d rather a team decide which is which ahead of time than during an incident.</p>
<p><em>How should a team measure what review and maintenance cost?</em> Rather than PRs opened, I’d look at reviewer hours per resolved issue, and break time-to-merge down by change size and by each reviewer’s open load, which is the only way I can see to separate the Jellyfish explanations in your own repo. If review slows even for small changes on lightly loaded reviewers, comprehension becomes a much more plausible culprit. For maintenance I’d watch how often agent-written code is reverted or reworked within a few weeks, how long its first human modification takes compared with similar human-written code, and how many people have reviewed or changed each module, a crude bus factor for understanding. Like the patched count, none of these measures comprehension directly, and the dashboard should say so. They measure the cost of not having it, and when agent output keeps outrunning a team’s capacity to understand it, I think the honest response is to slow the output rather than thin the review.</p>
<h3 id="the-slow-part">the slow part</h3>
<p>I still want the agents to cook, and I still want them to prove it. What this week changed is the order in which I hold those two ideas. The last post was about earning enough trust to let an agent work alone, and this one is about what that trust doesn’t buy, which is someone who can answer for the code in six months when something odd happens in production.</p>
<p>The image I keep returning to is Moshkovitz, a day after receiving a proof of the conjecture she’d worked toward for so long, asking questions until the alien construction became something she could explain to a room full of colleagues. The machine did the fast part. The slow part, turning a certified result into something other people can build on, was hers, and I’d like the code my team puts in front of users to keep going through that same slow part, however good the checks get.</p>
<p>A passing check tells me a change is worth the effort of understanding. It doesn’t do the understanding.</p>
<h3 id="things-worth-reading">things worth reading</h3>
<ul>
<li><a href="https://openai.com/index/sharing-ai-progress-in-mathematics/">Sharing AI progress in mathematics</a>, OpenAI’s announcement, and <a href="https://github.com/openai/math">the repository</a> with its <a href="https://github.com/openai/math/blob/main/history.md">history file</a>.</li>
<li><a href="https://scottaaronson.blog/?p=10169">The Mathocalypse</a>, Scott Aaronson’s post and its very long comment thread.</li>
<li><a href="https://terrytao.wordpress.com/2026/10/07/ahm-statement-on-openais-october-6-release-of-mathematical-documents/">The AHM statement</a>, as reposted (not authored) on Terence Tao’s blog, and <a href="https://www.ahmath.org/statements">the original</a>.</li>
<li><a href="https://agmai.org/general-sep29/">Responsible Release of AI-Generated Mathematics</a>, the advisory group’s guidelines, which read surprisingly well as a code review policy.</li>
<li><a href="https://fion.ac/jellyfish.pdf">Chen and Stratton’s paper</a> on bottlenecks in software production, and <a href="https://arstechnica.com/ai/2026/10/ai-coding-agents-generate-more-code-but-not-more-software/">Ars Technica’s summary</a>.</li>
<li><a href="https://www.anthropic.com/research/launching-opt-in-vuln-finding-service-for-open-source">Anthropic’s OSS Scanner post</a>, read alongside <a href="https://vulnerabilities.ai/two-labs-opposite-answers-triage-bottleneck">Two Labs, Opposite Answers to the Same Triage Bottleneck</a>.</li>
</ul>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>coding</category>
      <category>2026</category>
      <category>AI</category>
      <category>agentic</category>
      <category>thoughts</category>
    </item>
    <item>
      <title>Let the Agents Cook. Make Them Prove It.</title>
      <link>https://valentinacalabrese.com/blog/let-the-agents-cook-make-them-prove-it</link>
      <guid>https://valentinacalabrese.com/blog/let-the-agents-cook-make-them-prove-it</guid>
      <pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[On Lauren Tan's 2,500 PRs, the engineering job description that's quietly changing, and why the most interesting AI breakthrough might be a compiler that knows…]]></description>
      <content:encoded><![CDATA[<p><em>On Lauren Tan’s 2,500 PRs, the engineering job description that’s quietly changing, and why the most interesting AI breakthrough might be a compiler that knows when to say no.</em></p>
<p>I had to reread the number: 2,500 pull requests merged in a single month. When I came across <a href="https://x.com/poteto">Lauren Tan (poteto)</a>‘s account of what she’d been building, and then her <a href="https://www.youtube.com/watch?v=MN9dGgmLyso">conversation with Matt Pocock</a> about the setup behind it, I was genuinely amazed. 😅 I’ve been increasingly fascinated by agentic workflows myself, but seeing someone push the idea this far made me wonder whether we’re getting a glimpse of what software engineering might look like in a few years, once orchestration and verification become just as central to our work as implementation.</p>
<p>I’ve never considered the number of merged PRs a particularly useful measure of engineering quality on its own, since it tells you very little about the nature of the work or the value it ultimately creates. But the scale of what Lauren describes is remarkable, and what caught my attention was how deliberately she’s approached the problem of maintaining quality while increasing throughput. If agents can help us ship more <em>and</em> make the resulting software more reliable, I’m absolutely here for it. I wanted to understand how she’d built enough confidence in her process to allow that many changes to move forward.</p>
<figure class="video" data-video="MN9dGgmLyso">
<button type="button" class="video-poster" data-play="" aria-label="Play video: Lauren Tan and Matt Pocock discuss her agentic engineering setup">
<img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://i.ytimg.com/vi/MN9dGgmLyso/hqdefault.jpg" alt="" width="480" height="360">
<span class="video-play"><svg viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M8 5.5v13l10-6.5z"></path></svg></span>
</button>
<figcaption>Lauren Tan and Matt Pocock discuss her agentic engineering setup</figcaption>
</figure>
<h3 id="what-makes-that-level-of-autonomy-possible">what makes that level of autonomy possible?</h3>
<p>An agent can produce a plausible implementation remarkably quickly these days, but there’s quite a difference between seeing something work in a chat window and knowing it’s safe to merge into a codebase that other people depend on. A change may pass its own tests and still break a neighboring feature, introduce an architectural inconsistency, or quietly make something harder to maintain. At scale, the question becomes how you detect those problems without personally scrutinizing every line of every diff.</p>
<p>That’s where Lauren’s setup becomes particularly interesting. She combines <a href="https://x.com/poteto">Grok Bot</a>, Cursor projects and cloud agents with <a href="https://github.com/cursor/plugins/tree/main/pstack">pstack</a>, a collection of engineering playbooks that spells out how agents should investigate, implement, test, review and ship changes. There’s no reason everyone should reproduce her exact toolchain, but the separation of responsibilities is worth studying.</p>
<p>For instance, in the <a href="https://github.com/cursor/plugins/blob/main/pstack/skills/poteto-mode/playbooks/autopilot-full.md">full-autopilot playbook</a>, an agent owns an individual PR while separate verifiers examine the committed revision and run checks against the actual behavior. The merge requires a clean verdict applying to the relevant patch, and a material change can invalidate earlier verification. I find that last detail especially important because evidence about one version of the code doesn’t automatically tell you anything about the next.</p>
<p>The <a href="https://github.com/cursor/plugins/blob/main/pstack/README.md">pstack README</a> makes a point of prioritizing code quality over sheer output, which helps explain why Lauren can make a credible case for parallelism in the first place. You start by creating a process capable of catching mistakes, learn which kinds of work it handles reliably, and only then give more agents enough independence to operate concurrently. I find the prospect of scaling that kind of engineering discipline much more appealing than simply multiplying the number of coding sessions.</p>
<h3 id="what-happens-to-the-engineer">what happens to the engineer?</h3>
<p>I lead a web engineering team while still spending a substantial part of my time building things myself, so I find this transition fascinating from a very practical perspective. On a typical day I’m already moving between implementation details, architecture, prioritization and product decisions, sometimes within the same hour, and I can imagine that mix becoming increasingly common even among engineers who don’t formally manage anyone.</p>
<p>You start thinking a little more like an orchestrator: which work can safely happen in parallel, where do dependencies make that a terrible idea, what evidence would convince you a change is correct, and when is the right decision to stop working on a feature altogether? There’s a product-management dimension to those questions, although I don’t think that makes software engineers interchangeable with PMs. The technical understanding needed to define meaningful constraints, recognize subtle failures, and decide how to partition a system remains extremely important.</p>
<p>I touched on this in <a href="https://app.notion.com/p/3006407870518121a238c1e14c1baae8">Agentic Engineering Is Not a Vibe</a>, where I was thinking about the move from writing implementations to owning architecture and correctness. Lauren’s workflow has made me think more about what comes afterwards, when we begin designing the processes that produce and verify whole sequences of changes. It’s a different kind of engineering work, and one I suspect we’re all going to have to learn rather than assume we’re naturally good at it.</p>
<h3 id="learning-to-trust-without-becoming-careless">learning to trust without becoming careless</h3>
<p>The more autonomy I’d like to give an agent, the more I need to understand the conditions under which I can actually trust its work. An LLM’s confidence is a fairly terrible substitute for a test result, and asking it to be careful doesn’t establish a meaningful boundary. I’d rather give it an explicit definition of done, the permissions appropriate to the task, a safe place to work, and a way to fail or roll back without dragging everything else down with it.</p>
<p>I got a rather memorable lesson in this when <a href="https://app.notion.com/p/30064078705180cd8d6decad71c3c244">My AI Agent Installed Malware on My Server (And Then Caught Itself Doing It)</a>. The agent’s autonomy was genuinely useful, but it also expanded the consequences of one poor decision. After that experience, I became much more interested in the design of the environment surrounding an agent, especially where permissions, independent inspection and recovery can limit what goes wrong.</p>
<p>The <a href="https://github.com/cursor/plugins/blob/main/pstack/docs/guide/07-overnight.md">pstack guide to unattended runs</a> describes a sensible progression: establish how a task should be verified while you’re still supervising it, make those checks repeatable, inspect the agent’s failures, and gradually extend its independence. I like that there’s no pretense of a magical moment when an agent becomes trustworthy forever. Trust has to be earned in relation to a particular task and set of constraints, and reconsidered as either changes.</p>
<blockquote>
<p>🔒 Autonomy becomes much easier to grant when verification is part of the workflow itself, rather than something we hope to find time for after the agent finishes.</p>
</blockquote>
<h3 id="perhaps-our-definition-of-good-code-needs-another-look">perhaps our definition of good code needs another look</h3>
<p>Lauren made another observation in a <a href="https://x.com/poteto/status/2109110547824378140">recent post on X</a> that I found particularly thought-provoking. We’ve spent a lot of time worrying about the imperfect code AI might introduce, but our codebases were hardly pristine before agents arrived. Software changes continuously, and the implementation that made sense six months ago may no longer be the one we would choose today.</p>
<p>I think there’s a lot of truth to that. I’ve certainly worked with code that could have been more elegant, or better structured, yet still did exactly what the product needed at the time. Sometimes you accept a compromise because you need to learn from real users before investing heavily in an abstraction, or because the cost of eliminating an unlikely failure outweighs the harm it would cause. None of that means standards are unimportant. It means that engineering quality has always been contextual, and deciding where to spend effort is part of the job.</p>
<p>Lauren proposes an intentionally demanding ideal of code that is correct, bug-free and efficient to run, while acknowledging how expensive achieving all those qualities has traditionally been. I wouldn’t interpret that as a universal checklist. Correctness depends on a specification, performance has to be evaluated against actual constraints, and a sufficiently complex, evolving application rarely admits a convincing blanket claim of being bug-free. Still, the idea leads somewhere interesting: what if agents could reduce the cost of improving reliability enough that some compromises we’d previously accepted no longer made sense?</p>
<p>That’s where my optimism comes from. I don’t expect every website or internal dashboard to receive the same assurance process as safety-critical software, nor would I want the pursuit of theoretical perfection to prevent teams from experimenting and learning. But if the repetitive work of implementing changes becomes cheaper, perhaps we’ll have more opportunities to test the awkward edge cases, simplify an unnecessarily complicated design, or revisit something we’d always meant to improve. It’s an appealing possibility, provided we use the additional capacity deliberately rather than filling it with more work simply because we can.</p>
<p>Lauren calls learning to work this way a new craft, and I quite like that expression. What interests me most is the technical and organizational judgment required to make the gains real. And one experiment in particular makes me wonder how far we could take the idea of making correctness cheaper.</p>
<h3 id="bend-and-the-possibility-of-making-some-guarantees-explicit">Bend, and the possibility of making some guarantees explicit</h3>
<p>I’ve been fascinated by <a href="https://github.com/bendlang/bend">Bend 2</a>, a young programming language that combines an ambition for fast execution with the ability to express formal properties and check proofs about them. The part that interests me most in the context of agents is its approach to making certain requirements much less ambiguous.</p>
<p>Natural language is convenient because I can describe an intention without specifying every implementation detail, but that flexibility can also conceal assumptions I didn’t even realize I was making. Bend introduces a file called <code>LAWS.bend</code> for stating invariants and a <code>PROOF.bend</code> containing proofs that the implementation respects them. Its <a href="https://github.com/bendlang/bend/blob/main/README.md">README</a> gives examples such as preserving a balance invariant or preventing invalid game states.</p>
<p>Imagine asking an agent to improve a transaction system. “Make sure the transaction logic remains correct” is a perfectly understandable request between people who share enough context, but it doesn’t give an independent verifier very much to work with. A law specifying that the relevant balances must always sum to zero, together with a machine-checkable proof obligation, expresses one precise part of what correctness requires.</p>
<p>The project’s game demonstration is a lovely illustration. An agent is asked to implement wraparound movement in a game where a formal law says the player must never be able to win. That innocuous-looking feature can accidentally introduce a path to the winning state; with the invariant enforced, an acceptable implementation has to preserve the law. The important part is that the checker doesn’t have to take the agent’s word for it.</p>
<p>I keep thinking about what it would mean to build more repositories in which rules gradually move from tribal knowledge and vague instructions into checks we can actually execute. We’d still use ordinary tests and runtime observation for many properties, perhaps formal proofs for the ones that justify the effort, and human judgment for the aspects that can’t sensibly be reduced to a formal condition. But the agent would have much clearer boundaries within which it could explore different implementations. Bend describes the idea as <code>AGENTS.md</code> backed by proof, and I think it’s a particularly compelling direction.</p>
<h3 id="what-a-proof-can-and-cannot-tell-us">what a proof can and cannot tell us</h3>
<p>There’s an important distinction here, though, because I wouldn’t want my enthusiasm for formal methods to turn into a promise they can’t possibly fulfill. A proof establishes that a property follows from the specification and assumptions under which it was checked. It doesn’t tell us whether the property captures everything users expect, or whether we were asking the right question to begin with.</p>
<p>A requirement can be perfectly formalized and still be incomplete. Worse, if an agent is allowed to rewrite the rules whenever they become inconvenient, the entire exercise risks becoming rather elaborate theater. The soundness of the checking system matters too, including how source code is translated and what the runtime actually executes.</p>
<p>Bend is very open about being young and about the limitations of its toolchain. Its documentation describes an optional <code>--verdict</code> path using a proven kernel, while also acknowledging that other compiler components and the translation into that kernel are not fully proved, along with substantial gaps in the current language ecosystem. That’s an important distinction between an intriguing architectural direction and something I’d be comfortable recommending as a universal solution for production systems today.</p>
<p>I can see enormous value in formalizing particular financial or security invariants, for example, but a proof won’t establish that a new user flow is intuitive, that a design feels coherent, or that the feature was worth building. Those questions require observation, taste and product judgment, which are precisely the parts of engineering I hope we get to spend more time on as implementation becomes less laborious.</p>
<h3 id="a-codebase-that-remembers-why">a codebase that remembers why</h3>
<p>There’s also an organizational consequence to all this that I find almost as interesting as the tooling. So much of what we know about a codebase is distributed across old PRs, conversations, half-maintained documents, and whichever engineer still remembers why an apparently awkward abstraction was introduced. I encounter this constantly when helping other people navigate existing systems.</p>
<p>An agent can’t reliably infer the whole history behind a decision from the current code alone. If we’re going to ask it to make more decisions independently, it would help enormously to make the constraints and reasoning behind them easier to discover, whether that’s through architectural rules, tests that explain otherwise surprising behavior, or explicit policies for which changes require closer review.</p>
<p>I like how <a href="https://github.com/cursor/plugins/blob/main/pstack/README.md">pstack approaches repeated corrections</a>: rather than repeatedly telling an agent not to make the same mistake, try to encode the lesson in an enforceable part of the environment. A type can make an invalid state unrepresentable; a regression test can preserve something we learned painfully; a formal invariant can protect a particularly important property. None of these replaces context or judgment, but together they make that judgment available to the next engineer or agent who touches the code.</p>
<p>I’d love to see repositories become better at carrying their own rationale in this way. It would make them easier for humans to maintain, too, which seems like a rather good outcome regardless of where agentic tooling goes next.</p>
<h3 id="measuring-progress-without-mistaking-activity-for-value">measuring progress without mistaking activity for value</h3>
<p>This brings me back to those 2,500 PRs. The number caught my attention and I’m still impressed by the system required to coordinate that work, but I wouldn’t want any team to turn it into a target. PR counts have never told us enough about quality, difficulty, or net impact, and autonomous agents make it easier than ever to generate activity that looks productive on a dashboard.</p>
<p>What I’d actually want to know is whether useful changes reach users sooner, whether defects become less frequent or easier to detect, and whether the code remains understandable as it evolves. The <a href="https://dora.dev/research/2025/dora-report/">2025 DORA research</a> is useful context here because it treats AI as an amplifier of the engineering environment around it. A team with poor feedback loops doesn’t acquire good ones merely by producing changes faster.</p>
<p>It would be genuinely exciting if the extra throughput came with more reliable software and less repetitive work for the people maintaining it. We should measure that outcome rather than assuming it’s been achieved because a counter increased.</p>
<h3 id="the-kind-of-engineering-id-like-to-do-more-of">the kind of engineering I’d like to do more of</h3>
<p>I find the prediction that developers will simply become PMs supervising a fleet of bots a little too simplistic, partly because it overlooks the engineering depth involved in determining whether work is correct and partly because it makes the future sound rather boring. 😅 What I can imagine is a role in which we still understand systems deeply but spend a larger share of our attention defining meaningful problems, choosing which guarantees matter, shaping how different pieces of work interact, and evaluating the outcomes.</p>
<p>There’s a difficult educational question attached to that vision. Much of the judgment I rely on today came from actually implementing things, debugging failures, and watching seemingly reasonable choices become problems a few months later. How do we help newer engineers develop that intuition if agents increasingly handle the implementation? It’s not enough to become excellent at supervising a process if you can’t recognize when the process is confidently producing the wrong thing.</p>
<p>I don’t have an especially neat answer to that yet, although I suspect learning to work with agents responsibly will require knowing when <em>not</em> to delegate, particularly while you’re still developing an understanding of the underlying systems.</p>
<p>Anyhow, what stays with me from Lauren’s setup and the work happening around tools like Bend is the possibility of making engineering both more ambitious and more disciplined. I’d love to spend less time on repetitive implementation while becoming better at articulating what a system is supposed to do, what it must never do, and why any of it matters to the people using it. That sounds like a fascinating direction for our profession, and one I’d be very happy to keep exploring.</p>
<h3 id="things-worth-reading-and-watching">things worth reading (and watching)</h3>
<ul>
<li><a href="https://x.com/poteto/status/2102050467505430555">Lauren Tan’s post about shipping 2,500 PRs</a>, the original throughput milestone.</li>
<li><a href="https://x.com/poteto/status/2109110547824378140">Lauren on “Good Code”, human slop and the new craft of software engineering</a>, her October 2026 reflections on quality, cost, iteration and what agents might change.</li>
<li><a href="https://www.youtube.com/watch?v=MN9dGgmLyso">Lauren Tan with Matt Pocock</a>, a walkthrough of her agentic engineering workflow.</li>
<li><a href="https://x.com/poteto/status/2094457600259842065">Lauren on verification</a>, her perspective on why verification precedes autonomy.</li>
<li><a href="https://x.com/poteto/status/2097732320606507506">Lauren on supervising agents</a>, a deeper look at the changing engineering role.</li>
<li><a href="https://github.com/cursor/plugins/tree/main/pstack">pstack on GitHub</a>, especially the <a href="https://github.com/cursor/plugins/blob/main/pstack/skills/poteto-mode/playbooks/autopilot-full.md">full-autopilot playbook</a> and <a href="https://github.com/cursor/plugins/blob/main/pstack/docs/guide/07-overnight.md">overnight guide</a>.</li>
<li><a href="https://github.com/bendlang/bend">Bend 2 on GitHub</a>, including the <code>LAWS.bend</code> example and its documented limitations.</li>
<li><a href="https://dora.dev/research/2025/dora-report/">DORA 2025 research</a>, on AI as an amplifier of engineering systems.</li>
</ul>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>coding</category>
      <category>2026</category>
      <category>AI</category>
      <category>agentic</category>
      <category>thoughts</category>
    </item>
    <item>
      <title>Agentic Engineering Is Not a Vibe</title>
      <link>https://valentinacalabrese.com/blog/ai-engineering-is-not-a-vibe</link>
      <guid>https://valentinacalabrese.com/blog/ai-engineering-is-not-a-vibe</guid>
      <pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[In 2025, a nonprofit called METR ran an actual randomized controlled trial on AI-assisted coding. Not a vibes survey, not a vendor benchmark, but a proper RCT…]]></description>
      <content:encoded><![CDATA[<p>In 2025, a nonprofit called <a href="https://metr.org/">METR</a> ran an actual randomized controlled trial on AI-assisted coding. Not a vibes survey, not a vendor benchmark, but a proper <a href="https://en.wikipedia.org/wiki/Randomized_controlled_trial">RCT</a> with 16 experienced developers working on real codebases they had maintained for years, using Cursor Pro with Claude Sonnet.</p>
<p>The result? AI made them 19% slower. 🤯</p>
<p>I gotta say, this was supposed to be the bad news. The story that proved the skeptics right. But the more I sat with it, the more I think it’s actually the most interesting piece of evidence we have for why agentic coding is here to stay, and why this whole shift feels different from previous hype cycles.</p>
<p>The slowdown wasn’t about bad tools. It was about what happens when experienced developers actually engage with AI output responsibly. They spent time reviewing AI suggestions, prompting and re-prompting, waiting for generations, checking results against their own understanding of the codebase. They didn’t blindly accept stuff. They applied judgment, and judgment takes time.</p>
<p>So that 19% overhead, I think, is just the cost of doing engineering properly. And it’s the same thing that separates what Andrej Karpathy recently started calling “agentic engineering” from the reckless “vibe coding” he accidentally named a year ago.</p>
<h3 id="the-naming-actually-matters">the naming actually matters</h3>
<p>Three days ago Karpathy <a href="https://x.com/karpathy/status/1880284904094658923">posted a retrospective</a> on the first anniversary of his vibe coding tweet. He seemed almost embarrassed by it, a shower thought that now has its own <a href="https://en.wikipedia.org/wiki/Vibe_coding">Wikipedia article</a> 😅. But the correction he offered wasn’t just cosmetic. He proposed “agentic engineering” and defined it pretty precisely:</p>
<blockquote>
<p>“agentic because the new default is that you are not writing the code directly 99% of the time, you are orchestrating agents who do and acting as oversight. Engineering to emphasize that there is an art and science and expertise to it. It’s something you can learn and become better at, with its own depth of a different kind.”</p>
</blockquote>
<p>That last sentence is the one I keep coming back to. A different kind of depth. Not shallower than traditional coding, just different. You used to demonstrate competence by writing an elegant implementation, and now you demonstrate it by recognizing when the agent’s implementation is subtly wrong, or by designing the constraints that stop it from going wrong in the first place.</p>
<p>Addy Osmani put it really well I think: <em>“Vibe coding = YOLO. Agentic engineering = AI does the implementation, human owns the architecture, quality, and correctness.”</em> That ownership is kinda the whole game, and it only works if you understand what you’re owning.</p>
<p>The numbers actually line up with this. The <a href="https://survey.stackoverflow.co/2025/">Stack Overflow 2025 Survey</a> (49,000 respondents!) found that developer trust in AI accuracy dropped from 40% to 29% year over year, even as adoption climbed to 84%. The top frustration, cited by 45% of devs, was AI solutions that are “almost right, but not quite.” Two thirds said they spend more time debugging AI output than expected. So basically, people are using these tools more and trusting them less, which sounds contradictory but isn’t really. It’s a profession learning that the hard part was never the typing.</p>
<h3 id="antirez-actually-measured-the-impact">antirez actually measured the impact</h3>
<p>While Karpathy was finding the right vocabulary, <a href="http://antirez.com/">antirez</a> (Salvatore Sanfilippo, the creator of Redis) was kinda measuring what it looks like on the ground. In his post <a href="http://antirez.com/news/154">“Don’t fall into the anti-AI hype”</a> (which pulled 431,000 views), he documented what he actually built with Claude Code in the span of a few hours:</p>
<p>He reproduced weeks of Redis Streams work in about 20 minutes. He built a pure C library for BERT model inference in 5 minutes, 700 lines of code, same output as PyTorch, 15% slower. He fixed transient test failures in Redis, the kind of flaky timing-related bugs that are genuinely miserable to debug manually. He added UTF-8 support to his linenoise library along with a terminal emulation testing framework, something he’d wanted to do for years but couldn’t justify the time investment.</p>
<p>His conclusion was pretty blunt: <em>“Writing code is no longer needed for the most part. It is now a lot more interesting to understand what to do, and how to do it.”</em></p>
<p>But (and this is the part I think gets glossed over when people quote that line) antirez didn’t just hand Claude Code a vague prompt and accept whatever came back. He had design documents, years of context about his own codebases, and the ability to look at Claude’s output and immediately tell when something was off. He inspected, gave guidance, iterated. He was already doing agentic engineering before the term existed. Give the same tools and the same prompts to an inexperienced developer and they’d ship garbage. Confidently. In 5 minutes.</p>
<p>That’s what I think the METR study actually shows. AI doesn’t replace judgment, it kinda amplifies whatever judgment you already have. If you have good judgment, it acts as leverage. If you don’t, it makes you more confident about being wrong, which is honestly how bugs ship at scale.</p>
<h3 id="the-shift-from-a-personal-angle">the shift, from a personal angle</h3>
<p>I’ve been living this transition in a very small, concrete way. I run a personal AI agent (<a href="https://github.com/openclaw/openclaw">OpenClaw</a>) on a VPS, orchestrated through Telegram. I built the whole system from scratch: hardened the server after a malware scare (which I already wrote about in the <a href="https://www.notion.so/blog/my-ai-agent-installed-malware-on-my-server">previous post</a>!), set up a Tailscale mesh for zero-port access, configured workspace files that shape the agent’s personality and operational rules, built a custom Notion integration so it can publish blog posts directly. I switch between DeepSeek V3.2 for daily tasks and Kimi K2.5 for writing. I’m also building cron jobs for morning briefings, overnight research, and weekly behavioral audits.</p>
<p>And I gotta say: I am absolutely not vibe coding. Not a single line of any of this was written “by vibes.” Every decision was an architecture decision. What model for what task. What tools the agent can access. What constraints it operates under. What it’s allowed to do autonomously versus what requires my confirmation. The prompts matter, sure, but the system design matters way more.</p>
<p>This is what I think the shift looks like for working software engineers. We are not becoming obsolete, we’re kinda getting promoted to the job we should have been doing all along. Most of what we called “software engineering” was actually implementation labor: translating a known design into syntax. The design part, where you decide what to build and how the components interact and what tradeoffs you’re willing to accept, that part was always the actual engineering. We just spent 90% of our time on the other thing because we had to.</p>
<p>Now we don’t have to as much. The engineers who thrive will be the ones who were already good at the design part, or who develop that skill fast. The ones who struggle will be those whose entire value proposition was “I can write React components quickly” or “I memorized the API surface of Spring Boot.” That’s not really engineering, that’s typing with context.</p>
<h3 id="the-pipeline-problem-which-kinda-worries-me">the pipeline problem (which kinda worries me)</h3>
<p>OK but here’s where my optimism hits a wall.</p>
<p>antirez wrote that he worries about people getting fired, and that’s a totally legitimate concern. But I worry about something downstream that might actually be worse: where do the next senior engineers come from?</p>
<p>Every senior engineer I know, myself included, built their judgment by writing bad code for years. You learn what good architecture looks like by living through the consequences of bad architecture. You learn to spot subtle bugs because you’ve spent painful hours debugging similar ones by hand. You develop taste in code because you’ve read thousands of lines of it, both good and terrible, and built an intuitive sense of what’s right.</p>
<p>If junior developers enter the industry in 2026 and their primary workflow is prompting agents and accepting output they don’t fully understand, they’ll ship code. They might even ship it fast. But they won’t be building the muscle memory, the scar tissue, the hard-won intuition that turns a junior into a senior. Osmani <a href="https://addyo.substack.com/p/agentic-engineering">flagged this</a> as “dangerous skill atrophy” and honestly I think he’s underselling it a bit. It’s not really atrophy of existing skills, it’s the prevention of skills that were never developed in the first place.</p>
<p>The METR study showed that AI slowed experienced developers down. Imagine what it does to inexperienced ones. They were never fast in the right ways to begin with, so the new pattern just makes them faster at producing things they can’t evaluate. Which is just technical debt with a smiley face on it, basically.</p>
<p>antirez ended <a href="http://antirez.com/news/154">his post</a> with something pretty generous: <em>“The fun is still there, untouched.”</em> And he’s right, for people like him. For someone with 20 years of systems programming intuition, AI is pure leverage. You finally get to spend all your time on the interesting problems. But for someone just starting out, the interesting problems are kinda invisible if you’ve never struggled with the boring ones first. Debugging a segfault for 6 hours teaches you something that no amount of “paste the error back into Claude” ever will.</p>
<h3 id="where-i-think-this-goes">where I think this goes</h3>
<p>I don’t think AI kills software engineering. I think it kills the version of software engineering that was already dying, which is the commodity implementation work that we pretended was engineering because it required a CS degree to do at a minimally competent level.</p>
<p>What replaces that is harder and (I think) way more valuable: system design, constraint definition, agent orchestration, quality ownership, failure mode analysis. The stuff that was always the real job, now finally visible because the noise of implementation has been stripped away.</p>
<p>Karpathy is right that agentic engineering is a skill you can learn. antirez is right that refusing to engage with these tools is self-sabotage. The <a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">METR study</a> is right that this isn’t free, and that the overhead of verification is where the actual engineering happens.</p>
<p>But we really do need to solve the pipeline problem. If we build a world where AI handles all the implementation and humans handle all the judgment, we need to figure out how humans develop that judgment without the implementation reps. Nobody has a good answer for this yet, and if we don’t find one, we’ll end up with a generation of “agentic engineers” who can orchestrate agents beautifully but can’t tell when the agents are confidently, eloquently wrong. 🤔</p>
<p>Anyhow, that’s the thing that’s been keeping me up at night lately. If you’ve been thinking about this too, I’d love to hear from you.</p>
<p>Stay tuned, and keep on coding! ✨</p>
<h3 id="sources">Sources</h3>
<ul>
<li><a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">METR: Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity</a> (July 2025, <a href="https://arxiv.org/abs/2507.09089">arXiv paper</a>)</li>
<li><a href="https://x.com/karpathy/status/2019137879310836075">Andrej Karpathy: Vibe Coding 1-Year Retrospective</a> (February 4, 2026)</li>
<li><a href="https://karpathy.bearblog.dev/year-in-review-2025/">Andrej Karpathy: 2025 LLM Year in Review</a> (December 2025)</li>
<li><a href="https://antirez.com/news/158">antirez: Don’t fall into the anti-AI hype</a> (January 2026)</li>
<li><a href="https://antirez.com/news/157">antirez: Reflections on AI at the end of 2025</a> (January 2026)</li>
<li><a href="https://addyosmani.com/blog/agentic-engineering/">Addy Osmani: Agentic Engineering</a> (February 2026)</li>
<li><a href="https://survey.stackoverflow.co/2025/">Stack Overflow 2025 Developer Survey</a> (July 2025)</li>
<li><a href="https://stackoverflow.blog/2025/12/29/developers-remain-willing-but-reluctant-to-use-ai-the-2025-developer-survey-results-are-here/">Stack Overflow Blog: Developers remain willing but reluctant to use AI</a> (December 2025)</li>
</ul>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>coding</category>
      <category>2026</category>
      <category>AI</category>
      <category>agentic</category>
      <category>thoughts</category>
    </item>
    <item>
      <title>My AI Agent Installed Malware on My Server (And Then Caught Itself Doing It)</title>
      <link>https://valentinacalabrese.com/blog/my-ai-agent-installed-malware-on-my-server</link>
      <guid>https://valentinacalabrese.com/blog/my-ai-agent-installed-malware-on-my-server</guid>
      <pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[OK so let me tell you about the moment I realized my AI agent had quietly installed a reverse shell on my server. 😅 I'd been running OpenClaw for about a…]]></description>
      <content:encoded><![CDATA[<p>OK so let me tell you about the moment I realized my AI agent had quietly installed a reverse shell on my server. 😅</p>
<p>I’d been running <a href="https://github.com/openclaw/openclaw">OpenClaw</a> for about a week. If you haven’t heard of it, it’s an open-source AI agent platform that recently crossed <a href="https://github.com/openclaw/openclaw/stargazers">170k stars on GitHub</a>, and for good reason. You install it on a server, connect it to Telegram or WhatsApp, and suddenly you have a personal AI that lives on your phone. You can message it from anywhere, and it has tools: it can read and write files, run commands, install skills from a community marketplace. It honestly feels like the future, because it kind of is.</p>
<p>So one afternoon I was exploring what it could do and I asked the bot to help me find some useful skills for summarizing Twitter trends. A pretty reasonable request, I thought. I didn’t tell it to install anything specific, I just described what I wanted. The bot went off, searched ClawHub (the community skill marketplace), found a skill called <code>twitter-sum</code>, decided it matched my request, and installed it. Autonomously. No confirmation prompt, no “hey, should I go ahead with this?” It just did it, because that’s what agentic AI does. It takes initiative.</p>
<p>The problem was that <code>twitter-sum</code> was malware. 🤦‍♀️</p>
<p>It contained a base64-encoded reverse shell trying to phone home to a known bad IP. And this wasn’t even a random one-off: it turned out to be part of the <em>ClawHavoc campaign</em> that <a href="https://www.koi.security/">Koi Security</a> later exposed, finding over 341 malicious skills planted on ClawHub. The ecosystem had grown so fast that bad actors moved in before anyone had time to build proper guardrails.</p>
<p>Now, here’s the part that still kinda messes with my head: the bot also caught it. The same agent that had autonomously installed the malicious skill also analyzed the payload, flagged it as suspicious, and refused to execute it. The same capability that created the risk is what neutralized it. If my agent had been dumber, or less autonomous, or less willing to inspect what it was running, the shell would have connected and I’d be telling a very different story right now.</p>
<p>So yeah, that’s kinda where we are with AI agents at the moment: autonomy is both the feature and the attack surface, depending on the moment.</p>
<h3 id="the-rebuild">the rebuild 🔧</h3>
<p>That incident ended my hobbyist phase overnight. I went from “this is a cool toy” to treating my setup like production infrastructure, because honestly, that’s what it is. Anything with shell access to a server that runs 24/7 and takes initiative deserves the same paranoia you’d give to a production deployment.</p>
<p>So I hardened everything. SSH key-only authentication, root login disabled, fail2ban watching for brute-force attempts, UFW firewall locked down. Then I went a step further and installed <a href="https://tailscale.com/">Tailscale</a> to create a private mesh VPN between my devices. Once that was running, I closed every single public port on the server, including SSH. The VPS now has basically zero attack surface, it’s invisible to the internet entirely. If you’re not on my private network, the machine doesn’t exist as far as you’re concerned. 🕶️</p>
<p>Then I nuked the OS, reinstalled fresh, and rebuilt everything inside Docker containers. Clean slate, proper isolation.</p>
<h3 id="not-an-assistant-more-of-an-adversary">Not an assistant, more of an adversary</h3>
<p>The rebuild gave me a chance to rethink what I actually wanted from this agent. The default OpenClaw setup gives you a friendly, helpful assistant. I didn’t really want that. I already have Claude and ChatGPT for the “helpful” use case. What I really wanted was something that would make me sharper.</p>
<p>OpenClaw uses a file called <code>SOUL.md</code> as the system prompt that shapes the agent’s personality. I wrote mine to be a cognitive adversary. It doesn’t just agree with me to be pleasant: it challenges my reasoning, pokes holes in my plans, and tracks the gap between what I say my priorities are and what I actually spend my time on. The whole workspace is structured around a set of files (<code>SOUL.md</code>, <code>USER.md</code>, <code>AGENTS.md</code>, <code>MEMORY.md</code>, <code>IDENTITY.md</code>, <code>TOOLS.md</code>) that give the agent persistent context about who I am and how it should interact with me.</p>
<p>It’s not really a chatbot at this point. It’s more of a thinking partner that has zero interest in protecting my ego. And honestly, that’s been way more valuable than any of the automation features.</p>
<h3 id="the-economics-are-kinda-absurd">the economics are kinda absurd</h3>
<p>Let me also talk about what this actually costs, because the numbers are hard to believe if you haven’t been paying attention to what happened to model pricing over the past year.</p>
<p>I’m running DeepSeek V3.2 as my primary model at $0.25 per million input tokens and $0.38 per million output tokens. For context, that model hits roughly 90% of GPT-5 quality on the tasks I care about (tool calling, writing, API interactions). I have Gemini 3 Flash as a first fallback and Kimi K2.5 as a premium fallback for when I need higher quality writing. I can switch between them from Telegram with a single command, and all of it routes through <a href="https://openrouter.ai/">OpenRouter</a>.</p>
<p>My total monthly cost for running a personal AI agent that’s available 24/7 on my phone, with persistent memory, custom skills, and the ability to publish to my blog: roughly two dollars. Yes, two. Two years ago, this capability didn’t exist at any price. Now it costs less than a coffee. ☕</p>
<p>I also built a custom skill that connects to the Notion API so my agent can publish directly to my blog. I run Astro with Notion as the CMS, so basically I just describe what I want to write in a Telegram message, the agent drafts the post with title, slug, tags, cover image, and formatted content, creates the page in Notion, and Astro picks it up at the next build. (Fun fact: this very post was actually published exactly that way 📰.)</p>
<h3 id="what-this-becomes">what this becomes</h3>
<p>The current setup is functional, but it’s still mostly reactive: I message it, it responds. The next phase is making it proactive.</p>
<p>I’m building cron jobs for a morning briefing that aggregates developments relevant to my work, an evening reflection prompt that seeds the next day’s thinking, and overnight research tasks that run while I sleep so results are waiting when I wake up. There’s also a weekly behavioral audit planned, which will compare my stated goals against my actual activity and deliver an honest report. The kind of honest that no human in your life will give you because it’s just too socially awkward.</p>
<p>The vision (if I can call it that) is a system that kinda compounds. Every conversation adds to its memory, every decision gets logged, and every week it gets a little better at understanding how I think and where my blind spots are. Not AGI or anything that grand, just a persistent, context-aware process that runs alongside my life and does useful work whether I’m paying attention to it or not.</p>
<p>We’re kinda in the wild-west moment for personal AI agents right now. The tools are powerful, the costs are negligible, the ecosystem is growing faster than anyone can secure it, and the line between “useful autonomy” and “dangerous autonomy” is exactly as thin as my malware story suggests.</p>
<p>But honestly? I’d rather be building on that edge than watching from the sidelines.</p>
<p>Stay tuned for more updates, and keep on coding my friends! ✨</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>coding</category>
      <category>2026</category>
      <category>openclawd</category>
    </item>
    <item>
      <title>Graduation Day</title>
      <link>https://valentinacalabrese.com/blog/graduation-and-new-year-resolutions</link>
      <guid>https://valentinacalabrese.com/blog/graduation-and-new-year-resolutions</guid>
      <pubDate>Thu, 11 Jan 2024 00:00:00 GMT</pubDate>
      <description><![CDATA[It's strange how some days remain incredibly vivid in your memory, down to the smallest details, while at the same time feeling as though they belong to a…]]></description>
      <content:encoded><![CDATA[<p>It’s strange how some days remain incredibly vivid in your memory, down to the smallest details, while at the same time feeling as though they belong to a completely different chapter of your life. My graduation at Georgia Tech is definitely one of those days. 🎓</p>
<p>I officially completed my MSc in Computer Science in December 2023, after several years of studying through <a href="https://omscs.gatech.edu/">Georgia Tech’s Online Master of Science in Computer Science (OMSCS)</a> while working full-time as a Front-End Engineer. I’ve mentioned the program quite a few times on this blog, but I don’t think I ever managed to convey just how much of my life it occupied. Studying after work and spending entire weekends catching up on assignments gradually became such a normal part of my routine that, when the end finally arrived, it was almost difficult to comprehend that I didn’t have another deadline waiting around the corner.</p>
<p>And then, on December 16th, I got to graduate in Atlanta. In person. With the cap and gown and everything. 🤓</p>
<p>I had traveled all the way from Castelnovo ne’ Monti to Atlanta on my own, and spent almost a week there, which in itself felt like a small adventure. I had been to the United States before, of course, but there was something quite different about returning for an occasion that was so closely connected to years of effort, especially knowing that my experience of Georgia Tech up to that point had largely taken place through a computer screen.</p>
<p>One of the things I remember most fondly happened before the ceremony, when I went to pick up my graduation gown and the rest of the regalia from the Georgia Tech shop. People kept congratulating me, and I know this might sound like such a stereotypically American thing to be impressed by, but I found it genuinely lovely. There’s a certain openness in the way Americans celebrate other people’s milestones that can feel almost exaggerated when you’re not used to it, and yet I never had the impression that the excitement was merely performative. There was a real sense of collective anticipation, with so many people about to celebrate something they had worked towards for years, and for once it felt perfectly acceptable to be unapologetically excited about an achievement.</p>
<p>The morning of the ceremony was beautifully crisp, the sort of December morning that makes you very aware of the air on your face as soon as you step outside. I remember getting dressed, putting on the gown, and making my way towards the venue, surrounded by graduates and families who were all heading in the same direction. There were people everywhere, smiling, talking, taking pictures, trying to keep track of one another. I was there alone, so naturally my experience was a little different, but I didn’t feel quite as detached from it all as I might have expected.</p>
<p>In fact, I think that’s one of the things that made the day so special. I’d spent years studying remotely, often in the evenings after work, knowing there were thousands of other OMSCS students going through something similar without ever really meeting them. Suddenly I was physically surrounded by people who had shared a version of that same journey, even if we had never crossed paths before.</p>
<p>Everything at the ceremony was remarkably well organized, and once I found my assigned seat I ended up chatting briefly with the two graduates sitting next to me. We talked a little about our experiences in the OMSCS program, the kind of conversation that probably lasted only a few minutes and that I couldn’t reconstruct word for word now, but which I remember enjoying immensely. It’s funny how quickly you can feel a sense of familiarity with complete strangers when you realize you’ve all spent years dealing with the peculiar combination of intellectual curiosity, exhaustion, and sheer stubbornness required to finish a degree alongside a full-time job. 😅</p>
<p>And then, eventually, it was time to walk across the stage.</p>
<p>I was <em>so</em> nervous. I had spent years looking forward to that moment, and when it actually happened I was almost too preoccupied with doing everything correctly to properly take it in. I walked up, shook hands with the university representative, received my diploma, and made my way off the stage, all in what felt like a matter of seconds. I was so focused on the sequence of things that I completely forgot to turn around and wave!</p>
<p>Fortunately, my family was watching the ceremony through the YouTube livestream from Italy, including my uncle and cousin, so they still got to see me, even if only for that fleeting moment. I remember how happy they were, and knowing that they were following along from home made the distance between us feel a little less significant. I also discovered that plenty of other graduates hadn’t turned around either, which was reassuring because, seriously, everything happens so quickly that you barely have time to realize you’re graduating before you’re already walking off the stage. 😅</p>
<p>Once the ceremony was over, I was still wearing my cap and gown as I made my way around Atlanta, and that’s when something happened that I think I’ll remember for the rest of my life. Complete strangers kept stopping me to congratulate me, cheering as I walked past, and at one point there were even people honking their car horns in celebration. It was absolutely incredible, and I remember feeling almost overwhelmed by how openly happy everyone seemed to be for someone they didn’t even know. I realize there’s a cultural element to this, and that Americans tend to express their enthusiasm much more freely than we generally do in Italy, where an encounter like that with a stranger would be rather unusual. But knowing that didn’t make it feel any less genuine. If anything, there was something wonderfully disarming about being on my own, so far from home, and having all these people spontaneously share in my happiness without expecting anything in return. I don’t think I’ll ever forget that feeling.</p>
<p>There were official pictures taken as well, which apparently are still sitting somewhere in an archive while I continue my extremely important deliberations about whether I should finally buy them. Some decisions clearly require more time than a master’s degree.</p>
<p>But jokes aside, there’s something about that ceremony that I find difficult to explain without sounding a little sentimental.</p>
<p>When I graduated from university in Parma, it was during COVID, which meant I never really had the opportunity to experience a traditional graduation ceremony in person. Of course, the degree itself mattered far more than the celebration, and I was proud of that achievement regardless, but I think I had underestimated how much I wanted to experience that moment of closure, the chance to put on a gown, walk across a stage, and see years of effort acknowledged in a way that felt tangible.</p>
<p>Georgia Tech gave me that moment, although in a rather unexpected way. I was thousands of kilometers away from home, on my own in a city where I knew very few people, yet I was also part of something much larger than myself. The strangers congratulating me in the shop, the families gathering outside the venue, those brief conversations with other graduates, and my family watching from Italy all contributed to a feeling of belonging that I hadn’t anticipated.</p>
<p>Looking back at the years I spent completing the OMSCS program, I mostly remember the constant juggling of priorities, the weekends dedicated to coursework, and the satisfaction of gradually discovering areas of Computer Science I might otherwise never have explored in such depth. I certainly wouldn’t romanticize all those evenings spent studying after an already busy working day, because there were plenty of moments when it was genuinely exhausting. But I also know how much those years meant to me, intellectually and personally, and how much I enjoyed having something difficult and deeply interesting to work towards.</p>
<p>Perhaps that’s why I still think so fondly of that crisp morning in Atlanta. The ceremony itself lasted only a few hours, and my moment on stage barely a few seconds, but it gave a shape to all those much less memorable days of studying that had come before it.</p>
<p>I went all that way on my own, and somehow came home with a memory that feels wonderfully shared.</p>
<p>Anyhow, I’m very glad I made the trip. And I’m even gladder I decided to put on that cap and gown. ✨</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>graduation</category>
      <category>atlanta</category>
      <category>georgia tech</category>
    </item>
    <item>
      <title>Decoding the Magic of React’s useEffect hook</title>
      <link>https://valentinacalabrese.com/blog/decoding-use-effect-hook</link>
      <guid>https://valentinacalabrese.com/blog/decoding-use-effect-hook</guid>
      <pubDate>Sun, 30 Jul 2023 00:00:00 GMT</pubDate>
      <description><![CDATA[React has made a profound impact on how we approach front-end development, offering an elegant, declarative, and efficient way to build user interfaces. Since…]]></description>
      <content:encoded><![CDATA[<p>React has made a profound impact on how we approach front-end development, offering an elegant, declarative, and efficient way to build user interfaces.</p>
<p>Since the introduction of Hooks in version 16.8, the landscape has shifted significantly, and developers have been empowered with a fresh, innovative way to handle side effects in functional components.</p>
<p>One hook that has become indispensable is the <code>useEffect</code> hook. However, its true potential is often misunderstood or underutilized. In this article, we will reveal the magic behind <code>useEffect</code>, discover less-known facets of its behavior, and learn <strong>when</strong>, <strong>why</strong>, and <strong>how</strong> to use it most effectively.</p>
<h2 id="the-unveiling-of-useeffect">The Unveiling of useEffect</h2>
<p>The <code>useEffect</code> hook is designed to handle side effects in functional components, allowing us to perform actions in response to component lifecycle events like mounting, updating, and unmounting.</p>
<p>It takes two arguments: a function where you can place your side-effect logic and a dependency array. The function runs after the render, and it runs again if any dependencies in the dependency array change.</p>
<h2 id="mastering-the-art-of-using-useeffect">Mastering the Art of Using useEffect</h2>
<p>Understanding the basics is good, but we’ll now explore some more advanced concepts and situations where <code>useEffect</code> can be a real game-changer.</p>
<h3 id="a-chat-app---using-useeffect-for-subscriptions">A Chat App - Using useEffect for Subscriptions</h3>
<p>Let’s say you’re building a chat application, where users need to subscribe to a chat room when they enter and unsubscribe when they leave. Using class components, this logic would be split across different lifecycle methods. However, with <code>useEffect</code>, we can have all the related logic in one place.</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useState</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useEffect </span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> ChatRoom</span><span style="color:#24292E;--shiki-dark:#9399B2">({</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> chatRoomId</span><span style="color:#24292E;--shiki-dark:#9399B2"> })</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#24292E;--shiki-dark:#9399B2"> [</span><span style="color:#005CC5;--shiki-dark:#CDD6F4">messages</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> setMessages</span><span style="color:#24292E;--shiki-dark:#9399B2">]</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useState</span><span style="color:#24292E;--shiki-dark:#CDD6F4">([])</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">  useEffect</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#24292E;--shiki-dark:#9399B2">()</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">    function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> handleNewMessage</span><span style="color:#24292E;--shiki-dark:#9399B2">(</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic">newMessage</span><span style="color:#24292E;--shiki-dark:#9399B2">)</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">      setMessages</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic">prevMessages</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#CDD6F4"> [</span><span style="color:#D73A49;--shiki-dark:#94E2D5">...</span><span style="color:#24292E;--shiki-dark:#CDD6F4">prevMessages</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> newMessage])</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">    subscribeToChatRoom</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(chatRoomId</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> handleNewMessage)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">    return</span><span style="color:#24292E;--shiki-dark:#9399B2"> ()</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">      unsubscribeFromChatRoom</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(chatRoomId</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> handleNewMessage)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">    };</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">  },</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> [chatRoomId])</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#9399B2;--shiki-dark-font-style:italic">  // ...</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<p>In this scenario, when the <code>chatRoomId</code> changes, <code>useEffect</code> cleans up by running the return function, unsubscribing from the old chat room. It then runs the effect again, subscribing to the new chat room.</p>
<h3 id="performance-monitoring---using-useeffect-for-tracking">Performance Monitoring - Using useEffect for Tracking</h3>
<p>Imagine that you want to track user behavior in your app, such as how long users spend on a specific page. <code>useEffect</code> allows us to implement this in a clean and efficient way:</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useEffect </span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> ProductPage</span><span style="color:#24292E;--shiki-dark:#9399B2">({</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> productId</span><span style="color:#24292E;--shiki-dark:#9399B2"> })</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">  useEffect</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#24292E;--shiki-dark:#9399B2">()</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">    const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> startTime</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> Date</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">now</span><span style="color:#24292E;--shiki-dark:#CDD6F4">()</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">    return</span><span style="color:#24292E;--shiki-dark:#9399B2"> ()</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">      const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> endTime</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> Date</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">now</span><span style="color:#24292E;--shiki-dark:#CDD6F4">()</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">      const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> duration</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> endTime </span><span style="color:#D73A49;--shiki-dark:#94E2D5">-</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> startTime</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">      trackUserBehavior</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#032F62;--shiki-dark:#A6E3A1">'productPageViewDuration'</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> duration)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">    };</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">  },</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> [productId])</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#9399B2;--shiki-dark-font-style:italic">  // ...</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<p>When the component mounts, it captures the current time. And when the component unmounts, it calculates the duration of the user’s visit and logs it.</p>
<h2 id="when-not-to-use-useeffect">When Not to Use useEffect</h2>
<p>Just as with any other tool, misuse or overuse of <code>useEffect</code> can lead to performance issues and difficult-to-track bugs.</p>
<h3 id="overdoing-dependency-arrays">Overdoing Dependency Arrays</h3>
<p>Remember, each time a dependency changes, <code>useEffect</code> runs the cleanup function (if provided) and then the effect function. If you include items that change too frequently or unnecessarily in the dependency array, you could cause unnecessary work and potential performance degradation. Always ensure you only include necessary dependencies.</p>
<h3 id="ignoring-cleanup">Ignoring Cleanup</h3>
<p>When using <code>useEffect</code> for subscriptions, event listeners, or other side effects that require cleanup, ignoring or forgetting the cleanup function can lead to memory leaks and unexpected behavior. Always ensure to provide a cleanup function where necessary.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Understanding <code>useEffect</code> is fundamental to mastering React Hooks. This hook allows us to encapsulate side-effect logic within our functional components, leading to more readable and maintainable code.</p>
<p>However, careful usage is necessary to prevent unnecessary re-renders and other potential performance issues. By truly understanding and effectively using <code>useEffect</code>, we can build highly efficient and resilient React applications that are easier to reason about and maintain.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>react.js</category>
      <category>coding</category>
      <category>hooks</category>
    </item>
    <item>
      <title>Understanding the Differences Between useCallback and useMemo</title>
      <link>https://valentinacalabrese.com/blog/differences-use-memo-use-callback-hooks</link>
      <guid>https://valentinacalabrese.com/blog/differences-use-memo-use-callback-hooks</guid>
      <pubDate>Sat, 29 Jul 2023 00:00:00 GMT</pubDate>
      <description><![CDATA[React has revolutionized the way we build interfaces with its innovative and dynamic approach. Ever since version 16.8 rolled out, Hooks have become a…]]></description>
      <content:encoded><![CDATA[<p>React has revolutionized the way we build interfaces with its innovative and dynamic approach.</p>
<p>Ever since version 16.8 rolled out, Hooks have become a game-changer, enabling developers to work with state and other React features without the need for classes.</p>
<p>Among these Hooks, two stand out for their significance: <code>useCallback</code> and <code>useMemo</code>.</p>
<p>In this article, we’ll take a deep dive into these hooks, understand their differences, and learn <strong>when</strong>, <strong>why</strong>, and <strong>how</strong> they should (or should <em>not</em>) be used.</p>
<h2 id="a-brief-introduction-to-usecallback-and-usememo">A Brief Introduction to useCallback and useMemo</h2>
<p>The <code>useCallback</code> hook returns a memoized version of the callback function that only changes if one of the dependencies has changed. It’s useful when passing callbacks to optimized child components that rely on reference equality to prevent unnecessary renders.</p>
<p>The <code>useMemo</code> hook returns a memoized value. Like <code>useCallback</code>, it only re-calculates the memoized value when one of the dependencies has changed. It’s great for expensive calculations.</p>
<h2 id="when-and-how-to-use-usecallback-and-usememo">When and How to Use useCallback and useMemo</h2>
<p>Now that we have a brief understanding, let’s jump into some practical examples.</p>
<h3 id="an-intricate-game-scenario---using-usecallback">An Intricate Game Scenario - Using useCallback</h3>
<p>Imagine we’re creating an intricate game application where a player can increase their level by collecting gems. Every time they level up, they get a celebratory message. Here’s a simplified version of that.</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useState</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useCallback </span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> Game</span><span style="color:#24292E;--shiki-dark:#9399B2">()</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#24292E;--shiki-dark:#9399B2"> [</span><span style="color:#005CC5;--shiki-dark:#CDD6F4">level</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> setLevel</span><span style="color:#24292E;--shiki-dark:#9399B2">]</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useState</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#005CC5;--shiki-dark:#FAB387">1</span><span style="color:#24292E;--shiki-dark:#CDD6F4">)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> levelUp</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#24292E;--shiki-dark:#9399B2"> ()</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">    setLevel</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(level </span><span style="color:#D73A49;--shiki-dark:#94E2D5">+</span><span style="color:#005CC5;--shiki-dark:#FAB387"> 1</span><span style="color:#24292E;--shiki-dark:#CDD6F4">)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">  };</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  return</span><span style="color:#24292E;--shiki-dark:#94E2D5"> &#x3C;</span><span style="color:#005CC5;--shiki-dark:#F5C2E7">Board</span><span style="color:#6F42C1;--shiki-dark:#F9E2AF"> level</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">level</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#6F42C1;--shiki-dark:#F9E2AF"> onLevelUp</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">levelUp</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#24292E;--shiki-dark:#94E2D5"> /></span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> Board</span><span style="color:#24292E;--shiki-dark:#9399B2">({</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> level</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> onLevelUp</span><span style="color:#24292E;--shiki-dark:#9399B2"> })</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#9399B2;--shiki-dark-font-style:italic">  // A heavy computation function that renders the game board</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">  renderBoard</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(level)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  return</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> (</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">    &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">div</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">      &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">h2</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span><span style="color:#24292E;--shiki-dark:#CDD6F4">Current Level: </span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">level</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#24292E;--shiki-dark:#94E2D5">&#x3C;/</span><span style="color:#22863A;--shiki-dark:#89B4FA">h2</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">      &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">button</span><span style="color:#6F42C1;--shiki-dark:#F9E2AF"> onClick</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">onLevelUp</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span><span style="color:#24292E;--shiki-dark:#CDD6F4">Collect a gem</span><span style="color:#24292E;--shiki-dark:#94E2D5">&#x3C;/</span><span style="color:#22863A;--shiki-dark:#89B4FA">button</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">    &#x3C;/</span><span style="color:#22863A;--shiki-dark:#89B4FA">div</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">  )</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<p>Now, the issue here is that the <code>levelUp</code> function is created each time <code>Game</code> renders. Thus, <code>Board</code> re-renders every time, even when there are no level changes. This might slow down our app, especially with complex board rendering. Here’s where <code>useCallback</code> shines:</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useState</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useCallback </span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> Game</span><span style="color:#24292E;--shiki-dark:#9399B2">()</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#24292E;--shiki-dark:#9399B2"> [</span><span style="color:#005CC5;--shiki-dark:#CDD6F4">level</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> setLevel</span><span style="color:#24292E;--shiki-dark:#9399B2">]</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useState</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#005CC5;--shiki-dark:#FAB387">1</span><span style="color:#24292E;--shiki-dark:#CDD6F4">)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> levelUp</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useCallback</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#24292E;--shiki-dark:#9399B2">()</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">    setLevel</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(level </span><span style="color:#D73A49;--shiki-dark:#94E2D5">+</span><span style="color:#005CC5;--shiki-dark:#FAB387"> 1</span><span style="color:#24292E;--shiki-dark:#CDD6F4">)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">  },</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> [level])</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  return</span><span style="color:#24292E;--shiki-dark:#94E2D5"> &#x3C;</span><span style="color:#005CC5;--shiki-dark:#F5C2E7">Board</span><span style="color:#6F42C1;--shiki-dark:#F9E2AF"> level</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">level</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#6F42C1;--shiki-dark:#F9E2AF"> onLevelUp</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">levelUp</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#24292E;--shiki-dark:#94E2D5"> /></span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<p>With this change, a memoized <code>levelUp</code> function is passed to <code>Board</code> unless the <code>level</code> changes. The expensive board rendering process only happens when necessary, improving performance.</p>
<h3 id="an-e-commerce-filter---using-usememo">An E-Commerce Filter - Using useMemo</h3>
<p>Suppose you’re building an e-commerce app with a product listing page. There’s a filter feature that allows users to search for products by their names. Here’s a basic setup:</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useState </span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> ProductList</span><span style="color:#24292E;--shiki-dark:#9399B2">({</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> products</span><span style="color:#24292E;--shiki-dark:#9399B2"> })</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#24292E;--shiki-dark:#9399B2"> [</span><span style="color:#005CC5;--shiki-dark:#CDD6F4">filter</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> setFilter</span><span style="color:#24292E;--shiki-dark:#9399B2">]</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useState</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#032F62;--shiki-dark:#A6E3A1">''</span><span style="color:#24292E;--shiki-dark:#CDD6F4">)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> filteredProducts</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> products</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">filter</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic">product</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">    product</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#24292E;--shiki-dark:#CDD6F4">name</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">toLowerCase</span><span style="color:#24292E;--shiki-dark:#CDD6F4">()</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">includes</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(filter</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">toLowerCase</span><span style="color:#24292E;--shiki-dark:#CDD6F4">())</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">  )</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  return</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> (</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">    &#x3C;></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">      &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">input</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-dark:#F9E2AF">        type</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#032F62;--shiki-dark:#A6E3A1">"text"</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-dark:#F9E2AF">        value</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">filter</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-dark:#F9E2AF">        onChange</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic">e</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> setFilter</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(e</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#24292E;--shiki-dark:#CDD6F4">target</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#24292E;--shiki-dark:#CDD6F4">value)</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">      /></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">      &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">ul</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">        {</span><span style="color:#24292E;--shiki-dark:#CDD6F4">filteredProducts</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">map</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic">product</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#CDD6F4"> (</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">          &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">li</span><span style="color:#6F42C1;--shiki-dark:#F9E2AF"> key</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">product</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#24292E;--shiki-dark:#CDD6F4">id</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">product</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#24292E;--shiki-dark:#CDD6F4">name</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#24292E;--shiki-dark:#94E2D5">&#x3C;/</span><span style="color:#22863A;--shiki-dark:#89B4FA">li</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">        ))</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">      &#x3C;/</span><span style="color:#22863A;--shiki-dark:#89B4FA">ul</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">    &#x3C;/></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">  )</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<p>The issue is, the <code>filter</code> function runs each time <code>ProductList</code> renders. If you have thousands of products, this could slow down your app significantly. The <code>useMemo</code> hook can solve this problem:</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useState</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useMemo </span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> ProductList</span><span style="color:#24292E;--shiki-dark:#9399B2">({</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> products</span><span style="color:#24292E;--shiki-dark:#9399B2"> })</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#24292E;--shiki-dark:#9399B2"> [</span><span style="color:#005CC5;--shiki-dark:#CDD6F4">filter</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> setFilter</span><span style="color:#24292E;--shiki-dark:#9399B2">]</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useState</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#032F62;--shiki-dark:#A6E3A1">''</span><span style="color:#24292E;--shiki-dark:#CDD6F4">)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> filteredProducts</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useMemo</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#24292E;--shiki-dark:#9399B2">()</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">    products</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">filter</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic">product</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">      product</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#24292E;--shiki-dark:#CDD6F4">name</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">toLowerCase</span><span style="color:#24292E;--shiki-dark:#CDD6F4">()</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">includes</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(filter</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">toLowerCase</span><span style="color:#24292E;--shiki-dark:#CDD6F4">())</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">    )</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> [products</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> filter])</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  return</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> (</span></span>
<span class="line"><span style="color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#9399B2;--shiki-dark-font-style:italic">    // ...</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">  )</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<p>Now, the expensive filter function only runs when <code>products</code> or <code>filter</code> changes, leading to much better performance for your product list.</p>
<h2 id="when-not-to-use-usecallback-and-usememo">When Not to Use useCallback and useMemo</h2>
<p>While <code>useCallback</code> and <code>useMemo</code> can provide performance boosts in specific scenarios, they should not be used everywhere. Here’s why.</p>
<h3 id="overuse-of-usecallback">Overuse of useCallback</h3>
<p>Using <code>useCallback</code> unnecessarily can lead to more harm than good. It creates an overhead of maintaining the memoized version of the function, which can be more expensive than the function invocation itself. Let’s consider an example:</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useState</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useCallback </span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> Greeting</span><span style="color:#24292E;--shiki-dark:#9399B2">()</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#24292E;--shiki-dark:#9399B2"> [</span><span style="color:#005CC5;--shiki-dark:#CDD6F4">name</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> setName</span><span style="color:#24292E;--shiki-dark:#9399B2">]</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useState</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#032F62;--shiki-dark:#A6E3A1">''</span><span style="color:#24292E;--shiki-dark:#CDD6F4">)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> updateName</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useCallback</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#24292E;--shiki-dark:#9399B2">(</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic">event</span><span style="color:#24292E;--shiki-dark:#9399B2">)</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">    setName</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(event</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#24292E;--shiki-dark:#CDD6F4">target</span><span style="color:#24292E;--shiki-dark:#94E2D5">.</span><span style="color:#24292E;--shiki-dark:#CDD6F4">value)</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">  },</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> [])</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  return</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> (</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">    &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">input</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-dark:#F9E2AF">      type</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#032F62;--shiki-dark:#A6E3A1">"text"</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-dark:#F9E2AF">      value</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">name</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-dark:#F9E2AF">      onChange</span><span style="color:#D73A49;--shiki-dark:#94E2D5">=</span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">updateName</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">    /></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">  )</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<p>In this example, <code>useCallback</code> is not needed, because the <code>updateName</code> function is not computationally expensive or passed as a prop causing unnecessary re-renders. Removing <code>useCallback</code> from this code simplifies it without any performance downside.</p>
<h3 id="misuse-of-usememo">Misuse of useMemo</h3>
<p><code>useMemo</code> can also be overused or misused. If the calculation isn’t computationally expensive, then <code>useMemo</code> might bring more overhead than benefits. For example:</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> useMemo </span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> TotalPrice</span><span style="color:#24292E;--shiki-dark:#9399B2">({</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> quantity</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> price</span><span style="color:#24292E;--shiki-dark:#9399B2"> })</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> totalPrice</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> useMemo</span><span style="color:#24292E;--shiki-dark:#CDD6F4">(</span><span style="color:#24292E;--shiki-dark:#9399B2">()</span><span style="color:#D73A49;--shiki-dark:#CBA6F7"> =></span><span style="color:#24292E;--shiki-dark:#CDD6F4"> quantity </span><span style="color:#D73A49;--shiki-dark:#94E2D5">*</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> price</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> [quantity</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> price])</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  return</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> (</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">    &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">h2</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span><span style="color:#24292E;--shiki-dark:#CDD6F4">Total Price: </span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">totalPrice</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#24292E;--shiki-dark:#94E2D5">&#x3C;/</span><span style="color:#22863A;--shiki-dark:#89B4FA">h2</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">  )</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<p>In this case, <code>useMemo</code> is unnecessary since the multiplication operation isn’t expensive. It would be better to simply calculate <code>totalPrice</code> without memoization:</p>
<pre tabindex="0" class="astro-code astro-code-themes github-light catppuccin-mocha" style="background-color:#fff;--shiki-dark-bg:#1e1e2e;color:#24292e;--shiki-dark:#cdd6f4; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">import</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> React </span><span style="color:#D73A49;--shiki-dark:#CBA6F7">from</span><span style="color:#032F62;--shiki-dark:#A6E3A1"> 'react'</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">function</span><span style="color:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> TotalPrice</span><span style="color:#24292E;--shiki-dark:#9399B2">({</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> quantity</span><span style="color:#24292E;--shiki-dark:#9399B2">,</span><span style="color:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> price</span><span style="color:#24292E;--shiki-dark:#9399B2"> })</span><span style="color:#24292E;--shiki-dark:#9399B2"> {</span></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  const</span><span style="color:#005CC5;--shiki-dark:#CDD6F4"> totalPrice</span><span style="color:#D73A49;--shiki-dark:#94E2D5"> =</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> quantity </span><span style="color:#D73A49;--shiki-dark:#94E2D5">*</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> price</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D73A49;--shiki-dark:#CBA6F7">  return</span><span style="color:#24292E;--shiki-dark:#CDD6F4"> (</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#94E2D5">    &#x3C;</span><span style="color:#22863A;--shiki-dark:#89B4FA">h2</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span><span style="color:#24292E;--shiki-dark:#CDD6F4">Total Price: </span><span style="color:#24292E;--shiki-dark:#9399B2">{</span><span style="color:#24292E;--shiki-dark:#CDD6F4">totalPrice</span><span style="color:#24292E;--shiki-dark:#9399B2">}</span><span style="color:#24292E;--shiki-dark:#94E2D5">&#x3C;/</span><span style="color:#22863A;--shiki-dark:#89B4FA">h2</span><span style="color:#24292E;--shiki-dark:#94E2D5">></span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#CDD6F4">  )</span><span style="color:#24292E;--shiki-dark:#9399B2">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#9399B2">}</span></span>
<span class="line"></span></code></pre>
<h2 id="conclusion">Conclusion</h2>
<p><code>useCallback</code> and <code>useMemo</code> are powerful tools in the React developer’s toolkit. They are designed to help optimize React apps by preventing unnecessary renders and computations.</p>
<p>However, like many powerful tools, they can lead to issues when used inappropriately or excessively. By understanding the use cases for these hooks and using them judiciously, we can create more performant and maintainable React applications.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>react.js</category>
      <category>coding</category>
      <category>hooks</category>
    </item>
    <item>
      <title>Summer 2023</title>
      <link>https://valentinacalabrese.com/blog/summer-2023</link>
      <guid>https://valentinacalabrese.com/blog/summer-2023</guid>
      <pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate>
      <description><![CDATA[Hey there! 👋🏻 It’s been quite a long time since my last post and I actually have some news about OMSCS and life in general 🗞️ This summer I will be taking 2…]]></description>
      <content:encoded><![CDATA[<p>Hey there! 👋🏻</p>
<p>It’s been quite a long time since my last post and I actually have some news about OMSCS and life in general 🗞️</p>
<p>This summer I will be taking <strong>2 classes</strong> at the same time for the first time (I’ve typically taken just 1 at a time due to my full-time job) because I really want to speed up the whole process so that I can graduate sooner 🧑🏻‍🎓</p>
<p>Another cool thing that recently happened is that I was able to switch my specialization and move from the Interactive Intelligence track to the Human-Computer interaction one <em>(which has always been the most interesting one to me anyway)</em> because Georgia Tech decided to open this track for the OMSCS program too! 🥳</p>
<p>This, in turn, has enabled me to take advantage of the classes I had already taken which always had more leaning toward the HCI side of things so, to sum it all up, I will likely be able to graduate in Fall 2023! 🎉</p>
<p>I’m quite excited about this (and nervous at the same time because these upcoming months will be very intense in terms of work-life balance, to say the least) but at least once it’s all over I will be finally done with the program and ready to start a new adventure! 😎</p>
<p>I need to apply for graduation before <strong>June 1st</strong> so this makes it all the more official and it gives me such a sense of accomplishment to know that I am so close to the finish line. I am also looking forward to the new opportunities that will come my way once I have completed this program.</p>
<p>Here’s to a productive and successful summer! 🌞📚</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>summer</category>
      <category>georgia tech</category>
      <category>omscs</category>
      <category>thoughts</category>
    </item>
    <item>
      <title>Intro to Cognitive Science</title>
      <link>https://valentinacalabrese.com/blog/spring-2023</link>
      <guid>https://valentinacalabrese.com/blog/spring-2023</guid>
      <pubDate>Fri, 20 Jan 2023 00:00:00 GMT</pubDate>
      <description><![CDATA[Hello everyone! 👋🏻 I am excited to share that this semester, I will be taking the Intro to Cognitive Science class as part of my MSc in Computer Science…]]></description>
      <content:encoded><![CDATA[<p>Hello everyone! 👋🏻</p>
<p>I am excited to share that this semester, I will be taking the <a href="https://omscs.gatech.edu/cs-6795-introduction-cognitive-science">Intro to Cognitive Science</a> class as part of my MSc in Computer Science program at Georgia Tech. As someone who is deeply interested in human psychology and the power of the mind, I believe that understanding cognitive science is crucial in order to fully understand the implications of Artificial Intelligence.</p>
<p>Cognitive science is an interdisciplinary field that combines insights from psychology, neuroscience, linguistics, philosophy, and computer science to study the mind and how it processes information. The field is concerned with how we perceive, think, and remember, and how these processes shape our experiences and behaviors.</p>
<p>One of the most exciting things about cognitive science is that it provides a framework for understanding how our minds work, which can be applied to a wide range of fields. As a front-end engineer, for example, understanding cognitive science can help me design more user-friendly interfaces that are better suited to the way our brains process information. In the context of AI, cognitive science can be used to develop more sophisticated AI systems that can better mimic human thought processes and decision-making.</p>
<p>In this class, I am learning about the different theories of cognitive science and how they are used to understand different aspects of the mind. I am also learning about the different methods and techniques used to study the mind, such as experiments, brain imaging, and computational models.</p>
<p>One of the most interesting topics we have covered so far is the study of perception. The way we perceive the world around us is not a direct representation of reality, but rather a construct of our brain. Our brain takes in information from our senses and then processes it to form a coherent perception of the world. This process is not always accurate, as our brain can sometimes make mistakes, such as optical illusions.</p>
<p>Another interesting topic is the study of memory. Memory is a complex process that involves encoding, storage, and retrieval. We have different types of memories, such as short-term and long-term memories, and different processes for each one. Understanding how memory works can help us to better design systems that can store and retrieve information, such as search engines and databases.</p>
<p>Overall, I am really enjoying this class and I am excited to see how the insights from cognitive science can be applied to my work as a front-end engineer and my interest in AI so I am looking forward to continue my studies in this field.</p>
<p>Thank you for reading, and stay tuned for more! ✨</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>omscs</category>
      <category>spring</category>
      <category>2023</category>
      <category>hi</category>
    </item>
    <item>
      <title>Almost time to wrap up</title>
      <link>https://valentinacalabrese.com/blog/wrapping-up-2022</link>
      <guid>https://valentinacalabrese.com/blog/wrapping-up-2022</guid>
      <pubDate>Wed, 28 Dec 2022 00:00:00 GMT</pubDate>
      <description><![CDATA[It’s crazy to think that 2022 is almost over. This year has been particularly eventful for me not only because I switched jobs but also because I continued to…]]></description>
      <content:encoded><![CDATA[<p>It’s crazy to think that 2022 is almost over.</p>
<p>This year has been particularly eventful for me not only because I switched jobs but also because I continued to commit to the OMSCS program <em>(I’ve recently completed my 5th class and so I’m now halfway through the program)</em> and I was able to experience and reflect on a bunch of things.</p>
<p>These post-pandemic years still hit quite differently, as it feels like there’s so much still hanging in the air (metaphorically but also figuratively speaking 😬) and the dooming sensation of something catastrophic always lurking in the background is always one step away.</p>
<p>Anyhow, what I think is crucial in these times of uncertainty is to not lose sight of our inner eye, the often forgotten consciusness that we constantly try to numb with constant stimuli coming from our addicted and dopamine-seeking brains.</p>
<p>The remedy is to look inward. To pause. To reflect.</p>
<p>Sometimes taking a break is exactly what you need, even if you reckon that your pace is not straining you to the point where you feel like you’re on the verge of burnout.</p>
<p>But taking that moment to evaluate with clarity where you stand and what’s motivating <em>(or not motivating)</em> you at a certain point is crucial to assess the path you need to follow.</p>
<p>I’ve recently finished a rather enlightening <a href="https://www.amazon.it/Pathless-Path-Imagining-Story-Work/dp/B09QF6Q421">book</a> by Paul Millerd which is entitled “The Pathless Path” and it really made me look at things from a different perspective.</p>
<p>He talks about the fact that the modern idea of a job is just a recent construct that emerged as a result of the Industrial Revolution and that, prior to that, the concept of individuality was not under attack in the way that it is right now.</p>
<p>So much of our identities is attached to our professions, and if those professions all have to stay within the limits of very strict and immutable paths there is not much room for creative endeavors left.</p>
<p><strong>Creativity</strong> is such a core part of what makes us human.</p>
<p>And living in a world where there’s a perpetual association of creativity with uncertainty <em>(and unemployment)</em> makes pursuing creative endeavors much harder especially when we’re being told that a cushion 9-5 job is the most desirable (and socially acceptable) destiny/outcome in our lives.</p>
<p>I really want to explore creativity a lot more in 2023, but I need to figure out a viable way to do so.</p>
<p>I don’t want to overthink it too much though, as it would defeat the whole purpose of this resolution.</p>
<p>I wish creativity would flow naturally as a state of being, but I feel like much of what we absord externally is somehow orchestrated by so many forces that we don’t have the power over, which makes it hard to be conscious observers of reality.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>reflection</category>
      <category>2022</category>
    </item>
    <item>
      <title>Long time no see</title>
      <link>https://valentinacalabrese.com/blog/long-time-no-see</link>
      <guid>https://valentinacalabrese.com/blog/long-time-no-see</guid>
      <pubDate>Sat, 22 Oct 2022 00:00:00 GMT</pubDate>
      <description><![CDATA[It’s been quite a long time since my last post, and so many things have happened since then. I have switched jobs 💻 (now I work as a Front-end Engineer for…]]></description>
      <content:encoded><![CDATA[<p>It’s been quite a long time since my last post, and so many things have happened since then.</p>
<p>I have switched jobs 💻 (now I work as a Front-end Engineer for <a href="http://remote.com/">Remote.com</a>), completed another OMSCS class during the summer (i.e. <a href="https://omscs.gatech.edu/cs-6603-ai-ethics-and-society">AI, Ethics, &#x26; Society</a>), and started a new class in <a href="https://omscs.gatech.edu/cs-6300-software-development-process">Software Development Processes</a> in August which I am still attending to this day (it’s going to end in early December).</p>
<p>Also, I have <em>completely</em> re-designed and updated this website to migrate it from <a href="http://gatsbyjs.org/">Gatsby.js</a> to <a href="http://nextjs.org/">Next.js</a> in order to remove some bloat (Gatsby.js comes with SO many dependencies 🙀) and clean it up a bit since it was about time to do that 🤓.</p>
<p>This website is still a work in progress though but I have to say that I am pretty happy of how it turned out so far because I wanted to have a way to be able to update my blog super <em>quickly</em> and effectively, and this has been possible thanks to the amazing <a href="https://developers.notion.com/"><strong>Notion API</strong></a> which enables me to create new posts using a dedicated Notion DB and to publish them <em><strong>automagically 🪄</strong></em> to this website right away.</p>
<p>Hope y’all enjoy this new design ✨</p>
<p>Cheers 👋🏻</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>remote</category>
      <category>hi</category>
      <category>updates</category>
    </item>
    <item>
      <title>End of year 2021</title>
      <link>https://valentinacalabrese.com/blog/end-of-year-2021-edition</link>
      <guid>https://valentinacalabrese.com/blog/end-of-year-2021-edition</guid>
      <pubDate>Fri, 31 Dec 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[It's been quite a long time since my previous post, and I figured it was about time to come back with a few updates as I had promised! So a few weeks ago I…]]></description>
      <content:encoded><![CDATA[<p>It’s been quite a long time since my previous post, and I figured it was about time to come back with a few updates as I had promised!</p>
<p>So a few weeks ago I finished my Cybersecurity class at Georgia Tech and I gotta say that it was indeed a really nice chance for me to brush up on my C programming skills and put on a hacker hat!</p>
<p>The projects were engaging as they covered many different aspects of cybersecurity (they also came with very detailed prompts), ranging from very low-level stuff during the first part of the course (we had to hack our way into a shell 🤓) to then touch on web security topics (i.e. XSS, CSRF, etc.)</p>
<p>Overall, I would say I learn quite a bunch of useful things about cybersecurity as this class gave me more perspective and various tools that I can now draw from when thinking about the potential threats &#x26; attacks in real world scenarios.</p>
<p>So I’d definitely recommend taking <a href="https://omscs.gatech.edu/cs-6035-introduction-to-information-security">this class</a> if you’re new to the realm of cybersecurity and you wanna have a chance to challenge yourself by completing some interesting projects about cryptography &#x26; web security.</p>
<p>Needless to say that these past few months have been hectic to say the least, and that it was quite challenging to balance my full-time job as a Front-end Engineer with the workload coming from the OMSCS program (as the homework was usually time-consuming).</p>
<p>But I pushed through till the very end and now I am pretty satisfied with the way that things turned out eventually since I am continuously trying to expand my knowledge and skills as a Software Engineer and being able to discover so many different areas of Computer Science is something inspiring and motivating.</p>
<p>So crazy to think that another year is almost over though! 🤯</p>
<p>I truly hope that 2022 can be the start of new exciting beginnings for everyone.</p>
<p>Anyhow, in the meantime…Stay tuned, and keep on coding my friends!</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>2021</category>
      <category>end</category>
      <category>year</category>
      <category>thoughts</category>
    </item>
    <item>
      <title>Fall 2021 Updates</title>
      <link>https://valentinacalabrese.com/blog/fall-2021-updates</link>
      <guid>https://valentinacalabrese.com/blog/fall-2021-updates</guid>
      <pubDate>Sun, 05 Sep 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[Hey there, figured it was about time to come back here with a few quick updates. 📰 In my previous blog post, I had mentioned that I was planning to take the…]]></description>
      <content:encoded><![CDATA[<p>Hey there, figured it was about time to come back here with a few quick updates. 📰</p>
<p>In my previous blog post, I had mentioned that I was planning to take the ‘AI, Ethics &#x26; Society’ class for my Fall 2021 semester at Georgia Tech (OMSCS program).</p>
<p>However, due to how the <em>priority system</em> for classes works for ‘new’ students I wan’t able to reserve a spot, and that’s why I had to pick another class which (as this blog post title already suggests) is related to <strong>Cybersecurity</strong> <em>(Intro to Info Security, a.k.a. IIS)</em>.</p>
<p>I gotta say that I am quite excited about this nonetheless, since I had never had a chance to dive into cybersecurity as a CS field during my undergrad, so this is a good chance to brush up on my C programming skills and put on a hacker hat! 🤓</p>
<p>Understanding al least the basic of <a href="https://omscs.gatech.edu/cs-6035-introduction-to-information-security">cybersecurity</a> is something incredibly valuable nowadays, and hopefully this class will make me more aware about some of the various types of cyberattacks and how they are actually carried out in different scenarios.</p>
<p>I will make sure to do a sort of course review at the end of the semester, so that it might turn out to be useful for someone who’s considering attending this class during upcoming semesters.</p>
<p>In the meantime, stay tuned &#x26; keep on coding! 📻</p>
<p>✨</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>updates</category>
      <category>omscs</category>
      <category>georgia tech</category>
    </item>
    <item>
      <title>Design Principles</title>
      <link>https://valentinacalabrese.com/blog/design-principles-and-why-they-matter-a-lot</link>
      <guid>https://valentinacalabrese.com/blog/design-principles-and-why-they-matter-a-lot</guid>
      <pubDate>Wed, 02 Jun 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[Design Principles are one of those key ingredients that shape the actual perceived usability & vision of a certain product under the hood, and that at a first…]]></description>
      <content:encoded><![CDATA[<p>Design Principles are one of those key ingredients that shape the actual perceived usability &#x26; vision of a certain product under the hood, and that at a first glance could almost appear as the output of a bunch of meaningless marketing jargon but whose real purpose goes so far beyond that.</p>
<p>I was initially able to reflect on the understated importance of Design Principles during my<a href="https://mailchimp.com/culture/what-sets-our-internship-program-apart/"> internship with Mailchimp</a> in Atlanta about two years ago, which marked a significant point in my career as a Front-End Engineer.</p>
<p>As a matter of fact, being able to see how such an established company thinks about its product &#x26; the Design aspect connect to it is absolutely fascinating, and I gotta say that I truly learned a lot from that experience.</p>
<ul>
<li><strong>Design Principles</strong> encompass the whole philosophy that defines &#x26; surrounds a certain product, they act as a framework for decision making, they become collaborative tools to bridge the communication gaps with other teams &#x26; stakeholders, and ultimately shape the whole look &#x26; feel of the product with their values.</li>
</ul>
<p>They also help to establish a common vocabulary across different teams/squads, which can serve as a helpful tool during internal product meetings.</p>
<p><strong>A great example of Design Principles</strong></p>
<p>Let’s take a nice example of great design principles and analyze them, so to better understand their intrinsic purpose and value.</p>
<p><a href="http://spotify.com/">Spotify</a> is one of those companies that deeply care about building amazing UX for their end-users, and their <a href="https://spotify.design/article/introducing-spotifys-new-design-principles">guiding principles </a>are:</p>
<ul>
<li>Content First</li>
<li>Be Alive</li>
<li>Get Familiar</li>
<li>Do Less</li>
<li>Stay Authentic</li>
<li>Lagom</li>
</ul>
<p>These principles are so specific and precise in their intent, and they clearly communicate what Spotify values in a User Experience.</p>
<p>They tell a lot about the way Spotify thinks about product, how they want to present content, personalization, not over-engineering and being very intentional about what they’re putting forward.</p>
<p>The last principle <strong>“Lagom”</strong> is actually a cool Swedish word for “just enough”, which is like a common way of life to indicate the need for the perfect balance when it comes to things.</p>
<p>If we were to point out what makes for great Design Principles we could confidently borrow Alla Kholmatova’s principles as an interesting starting point <em>(they’re included in</em> <a href="https://www.amazon.com/Design-Systems-practical-creating-languages/dp/3945749581"><em>her book</em></a> <em>“Design Systems. A Practical Guide To Creating Design Languages for Digital Products”).</em></p>
<p><strong>Great Design Principles</strong></p>
<ul>
<li>They’re specific.</li>
<li>They’re actionable.</li>
<li>They’re impressionable.</li>
<li>They have a point of view.</li>
<li>They’re living.</li>
</ul>
<p><a href="https://www.amazon.com/Design-Systems-practical-creating-languages/dp/3945749581">Specificity</a> is probably the most important aspect to keep in mind among those 5 principles when it comes to conceptualizing new Design Principles, as having a clear picture in your mind about what the brand wants to convey to its end-users and preserving the unicity of the core values is vital.</p>
<p><strong>Actionable</strong> refers to the fact that new Design Principles need to be concrete and practical in their intent so that you can effectively act upon them to make a real impact.</p>
<p><strong>Impressionable</strong> because a design principle needs to have a soul, a well-defined motif that gets stuck in your head whenever you think about it.</p>
<p><strong>They have a point of view</strong> because of course they need to be opinionated somehow, otherwise they wouldn’t be able to properly reflect the brand values and would defeat their own effective purpose.</p>
<p><strong>They’re living</strong> because they need to be flexible enough in order to accommodate any new tension points and discoveries related to the brand. They have the capacity to evolve over time and renew themselves.</p>
<p>What about <em><strong>you</strong></em>?</p>
<p>Have you ever taken part in the brainstorming process for new Design Principles in your company?</p>
<p>How did you decide what was important in shaping those principles?</p>
<p>🖖</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>design</category>
      <category>principles</category>
      <category>ux</category>
      <category>ui</category>
    </item>
    <item>
      <title>4 Different Ways to Reverse a String in Javascript</title>
      <link>https://valentinacalabrese.com/blog/4-ways-to-reverse-a-string-in-javascript</link>
      <guid>https://valentinacalabrese.com/blog/4-ways-to-reverse-a-string-in-javascript</guid>
      <pubDate>Tue, 01 Jun 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[Reversing a string is perhaps one of the most common interview questions one of those which inevitably we, as Software Developers, encounter during our…]]></description>
      <content:encoded><![CDATA[<p>Reversing a string is perhaps one of the most common interview questions one of those which inevitably we, as Software Developers, encounter during our journeys.</p>
<p>When it comes to JavaScript and its many quirkinesses, one might feel overwhelmed by the many possible ways to go about tackling this particular problem, and here I would like to show you a few viable approaches.</p>
<h2 id="1-the-quick--dirty-way-using-built-in-methods">1. The quick &#x26; dirty way using built-in methods</h2>
<p>This is probably the most common and dirty way to approach this problem with JavaScript…but it does the job!</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/_astro/2xqqmhe5yk14cjv54beg_26khMs.webp?dpl=6ad3bc51943b9254ae3fc9e4" alt="2xqqmhe5yk14cjv54beg.png"></p>
<p>Let’s briefly recap how this approach actually works.</p>
<ul>
<li>The <code>split()</code> method splits our String object, so that every single character in the original String array is now separated in its own single-character substring.</li>
<li>The <code>reverse()</code> method comes then into play and does the main job: it simply reverses the elements contained in the originally array so that what originally was the last character in the -String array, is now the first element (in our case it’s a “.” , since it’s the character that our variable “stringToReverse” was ending on).</li>
<li>The <code>join()</code> method finally rejoins all the single characters previously separated by the <code>split()</code> method to form and recompose our reversed string.</li>
</ul>
<p>Et voilà! 😏</p>
<ul>
<li>Quick side note : This approach should preferably be used if your interviewer specifically says that you are allowed to use built-in methods, otherwise you should go for the next approaches I am going to show you.</li>
</ul>
<h2 id="2-the-old-fashioned-way-the-for-loop">2. The Old Fashioned Way: the for loop</h2>
<p>If you wanna show your interviewer that you know how to solve this problem without relying on the JS built-in methods, just use the for loop.</p>
<p>But let’s just get a bit fancier and use the ES6 syntax, shall we?</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/_astro/d41t3jsuzpsw2o4rkz7o_27eCvX.webp?dpl=6ad3bc51943b9254ae3fc9e4" alt="d41t3jsuzpsw2o4rkz7o.png"></p>
<p>The new <code>for loop</code> syntax introduced by ES6 is very handy and it drastically reduces the chance of making mistakes while typing code for the loop.
Also, it is much cleaner and nicer to look at 👌 .</p>
<h2 id="3-the-concise-and-even-more-es6-way-of-doing-things-with-the-spread-syntax">3. The Concise and even more “ES6” way of doing things with the Spread Syntax</h2>
<p>With ES6 we have a new way of splitting our String into an array, thanks to the so-called spread operator <code>[…]</code>.</p>
<p>This approach is almost identical to the first approach I showed (except for the <code>[…]</code> operator of course 😅 ) and here below you can have a look at it.</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/_astro/gwvxwg0ur663xqp8fqs6_ZAQE0c.webp?dpl=6ad3bc51943b9254ae3fc9e4" alt="gwvxwg0ur663xqp8fqs6.png"></p>
<p>Pretty neat, huh? 😎</p>
<p>Passing the “stringToReverse” as a parameter of the spread operator allows us to “spread” the single character values contained in our original array to get the same result as we did using the <code>split()</code> function, so that we can later reverse the all the single characters one by one as we did before with the JS built-in method <code>reverse()</code> and then finish off once more with the <code>join()</code> method.</p>
<h2 id="4-last-but-not-leastrecursion">4. Last But Not Least….Recursion!</h2>
<p>The last method I would like to show you is the recursive approach to this problem.</p>
<p>In this case we want to set up our function so that it recursively calls itself till it hits our base case (i.e. an empty string).</p>
<p>We simply cut the first character of our string object away with the <code>substr()</code> method, and add it at the end of the string recursively till there are no more characters left to add.</p>
<p>We can even do this with a ternary operator to be more concise and clean with our JS syntax.</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/_astro/1_a8iav3lY5yRhakS6uyuuBw_ZEmSJY.webp?dpl=6ad3bc51943b9254ae3fc9e4" alt="1*a8iav3lY5yRhakS6uyuuBw.png"></p>
<p>And that was the last example on how to reverse a string with JavaScript! 🎉</p>
<p>I truly hope you enjoyed this tutorial and please let me know your thoughts and solutions too!</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>javascript</category>
      <category>tutorial</category>
      <category>algorithms</category>
      <category>string</category>
    </item>
    <item>
      <title>Summer Break</title>
      <link>https://valentinacalabrese.com/blog/taking-a-summer-break</link>
      <guid>https://valentinacalabrese.com/blog/taking-a-summer-break</guid>
      <pubDate>Sat, 22 May 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[Hey there, here I am with a quick update. 📰 I officially finished my Spring 2021 semester at Georgia Tech with my class in Human Computer Interaction, and I…]]></description>
      <content:encoded><![CDATA[<p>Hey there, here I am with a quick update. 📰</p>
<p>I officially finished my Spring 2021 semester at Georgia Tech with my class in Human Computer Interaction, and I gotta confirm that overall it’s been an enjoyable experience that allowed me to further expand my knowledge in the UX field and gave me such a broader perspective on things.</p>
<p>Although the time commitment was significant because of the amount of weekly writing/reading involved, the fact that I worked remotely for those past few months due to the COVID restrictions in Italy helped my manage the workload much more efficiently, and I was able to carry on without excessive efforts/sacrifices.</p>
<p>I am taking the summer off for now, though, since I really feel like it’s time for a short “break” to pause and unwind for a bit in order to (hopefully) start with a new energy for the Fall 2021 term.</p>
<p>I think I will probably choose the <a href="https://omscs.gatech.edu/cs-6603-ai-ethics-and-society">AI, Ethics, &#x26; Society class</a> since I find the ethics implications of AI to be a profoundly interesting topic whose references we’re constantly being bombarded with in our everyday lives.</p>
<p>Stay tuned for more updates, and cheers! 👋</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>may</category>
      <category>2021</category>
      <category>omscs</category>
      <category>summer</category>
    </item>
    <item>
      <title>A Day in the Life of a Front-End Engineer </title>
      <link>https://valentinacalabrese.com/blog/day-in-the-life</link>
      <guid>https://valentinacalabrese.com/blog/day-in-the-life</guid>
      <pubDate>Thu, 01 Apr 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[Original article published on Cloud Academy. It’s a typical Monday morning, and I am about to get off the TILO train that takes me to Cloud Academy’s offices…]]></description>
      <content:encoded><![CDATA[<h3 id="a-day-in-the-life-of-a-front-end-engineer-at-cloud-academy-when-theres-not-a-pandemic-devstories">A Day in the Life of a Front-End Engineer at Cloud Academy (When There’s Not a Pandemic) #DevStories</h3>
<p>Original article published on <a href="https://cloudacademy.com/blog/a-day-in-the-life-of-a-front-end-engineer-at-cloud-academy/">Cloud Academy</a>.</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/.netlify/images?url=https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1*TZlV6T0rMQhDPnQbpb3dZA.png&#x26;fm=webp&#x26;w=1200&#x26;q=75" alt="1*TZlV6T0rMQhDPnQbpb3dZA.png"></p>
<p>It’s a typical Monday morning, and I am about to get off the <a href="http://www.tilo.ch/en/">TILO</a> train that takes me to Cloud Academy’s offices in <a href="https://en.wikipedia.org/wiki/Mendrisio">Mendrisio</a> every morning.</p>
<p>It’s 8:36 a.m. sharp <em>(lovely how punctual Swiss trains are)</em>, and I am walking to the office to start a new day. 🥳</p>
<p>As I walk towards my desk to plug in my MacBook, I greet the other early morning coworkers who are already in the office and then make my way to our awesome espresso <strong>coffee</strong> machine to get my first caffeine fix of the day.</p>
<p>Now that the caffeine ☕️ is starting to do its magic, I proceed to open up the <a href="https://www.jetbrains.com/webstorm/">WebStorm IDE</a> to spin up my dev environment while I also take a quick look at my Google Calendar to get a feeling of what the day is gonna look like, and finally check the Jira board to see what the current progress of my tasks is.</p>
<h3 id="945-amtime-for-the-daily-stand-up">9.45 a.m. — Time for the daily stand-up!</h3>
<p>The engagement squad <em>(my current team</em> 😎_)_ is ready to report the various updates regarding what everybody has been up to since yesterday, and we have a 10/15-minute scrum meeting to discuss our tasks for the day and whether or not we have any particular blockers for the issues we’re currently working on.</p>
<h3 id="1000-amback-to-work️">10:00 a.m. — Back to work ⚙️</h3>
<p>Today I’m working on adding a custom <strong>functionality</strong> to a React Component that I am currently building <em>(i.e., the Card</em> Certification), which is related to our upcoming User Certifications project (<strong>edit:</strong> it’s now live! 🥳) that’s going to enable both enterprise customers and individual users to upload their custom certifications to CA’s platform.</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/.netlify/images?url=https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F0*OWEtW832TqRPkiAI.png&#x26;fm=webp&#x26;w=1200&#x26;q=75" alt="0*OWEtW832TqRPkiAI.png"></p>
<p>I am actually working on including the “add to LinkedIn” functionality so that when users click on the corresponding card button, it will be possible for them to be redirected to the related LinkedIn profile page with all of the main certification’s details already pre-filled.</p>
<p>Below is the actual code snippet with the main parameters that I am using to connect to LinkedIn’s <a href="https://addtoprofile.linkedin.com/">add to profile</a> endpoint so as to fill out the required fields.</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/.netlify/images?url=https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F0*g1AeTpWRn-HDpLGU.png&#x26;fm=webp&#x26;w=1200&#x26;q=75" alt="0*g1AeTpWRn-HDpLGU.png"></p>
<h3 id="100-pmtime-for-some-lunch">1:00 p.m. — Time for some lunch! 🥪</h3>
<p>I sit in our kitchen/lunch area and enjoy the quick lunch I brought from home while having a nice conversation with my peers.</p>
<p>Today is also a very special day because we’re celebrating the birthday of a CA employee, and this means only one thing….🥁 free brioches for everybody! 🥐</p>
<p>This is one of my favorite traditions here at Cloud Academy, as birthdays are always properly celebrated with the right level of sweetness ;)</p>
<h3 id="130-pmtime-to-play-table-tennis">1:30 p.m. — Time to play table tennis! 🏓</h3>
<p>After the lunch break, some of us generally gather and then split into small teams to play table tennis together. It’s such a nice way to recharge before going back to coding.</p>
<p>Today I feel quite energized <em>(might be the caffeine + brioche combo)</em>, and I actually win the match! 🙌🏻</p>
<h3 id="200-pmback-to-work-again">2:00 p.m. — Back to work again 💼</h3>
<p>Time to get back to coding. I am moving forward with the implementation of the “<em>add to LinkedIn</em> profile” functionality for the certifications, and I am testing out whether the actual flow of interaction works as expected and that all of the fields are correctly being filled out whenever a user clicks on the corresponding button with the goal of showcasing a new certification on LinkedIn.</p>
<h3 id="400-pmlets-push-some-code">4:00 p.m. — Let’s push some code! 🤓</h3>
<p>After having properly debugged and checked that everything works as it should, I proceed to open a pull request on<a href="https://bitbucket.org/"> Bitbucket</a> and pick two front-end colleagues as reviewers so that they can give me some feedback on my work.</p>
<p>Providing useful and actionable feedback is definitely one of the main key points to follow when it comes to reviewing pull requests, and we all strive to be as assertive as possible whenever we write comments on other pull requests so that we can all learn something in the process.</p>
<h3 id="500-pmpr-reviews-time">5:00 p.m. — PR reviews time 📝</h3>
<p>I am now reviewing a pull review on our Design System’s repo <em>(i.e.</em> <a href="https://bonsai.cloudacademy.com/"><em>Bonsai</em></a><em>)</em> for a new Component that is being created. I am curious to take a look at my colleague’s work, since I find it truly interesting to see how other developers tackle a certain problem from different viewpoints and to understand more about how I would have approached the same challenge.</p>
<p>It’s always quite interesting to analyze the pros and cons of certain types of potential solutions, and with Bonsai we are trying to stick to a reasonable balance between the need of meeting certain technical standards while remaining sufficiently close to the actual design requirements.</p>
<p>As an example, some of the guidelines that we are adhering to when it comes to designing new Bonsai Components are outlined in our <a href="https://bonsai.cloudacademy.com/?path=%2Fdocs%2Fdocumentation-getting-started-developer--page">docs page</a>, where we have created a specific definition to differentiate between “<strong>ready-to-use</strong>” components and what we have named “<strong>stylable</strong>” components.</p>
<p>Creating a new “ready-to-use” component <em>(we mostly use those)</em> means that its corresponding TypeScript interface will have its basic style and corresponding functionalities already defined, so that a Developer can quickly and easily use it as it is.</p>
<h3 id="600-pmwrappingup">6:00 p.m. — Wrapping up</h3>
<p>Another workday has come to an end, and it’s now time for me to hop on the train back to Italy 🇮🇹 and relax and unwind a bit.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>cloudacademy</category>
      <category>day in the life</category>
      <category>front-end</category>
    </item>
    <item>
      <title>2021 Updates</title>
      <link>https://valentinacalabrese.com/blog/updates-about-OMSCS-and-HCI</link>
      <guid>https://valentinacalabrese.com/blog/updates-about-OMSCS-and-HCI</guid>
      <pubDate>Mon, 29 Mar 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[Hey there, it's been a while since I haven't updated the blog, but here I am with a few updates. 📰 I started my first semester at Georgia Tech in January with…]]></description>
      <content:encoded><![CDATA[<p>Hey there, it’s been a while since I haven’t updated the blog, but here I am with a few updates. 📰</p>
<p>I started my first semester at Georgia Tech in January with a class in Human Computer Interaction, and I gotta say that so far I am truly enjoying the material and how the class is structured since it makes the remote learning experience much more enjoyable.</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/_astro/Untitled_7ps6F.webp?dpl=6ad3bc51943b9254ae3fc9e4" alt="Untitled.png"></p>
<p>There’s a <strong>lot</strong> of writing 📝 involved with this class as each single week we’re required to write an 8 pages paper related to the course content we’re learning, but I think that overall having to write this much was helpful for me in that it gave me structure and room to properly organize myself with my full-time job at Cloud Academy.</p>
<p>Having less time at hand paradoxically makes you value the time you have much more, and this helped me establish a good routine to take care of both HW and my daily work as a FE Engineer (also WFH is a boost in this scenario as there is no commute).</p>
<p>Anyhow, some of the main key <strong>takeaways</strong> from the HCI course are:</p>
<ul>
<li>Think about <strong>users</strong> first anytime you’re thinking about creating a new interface for a product.</li>
<li>Ask yourself he right <strong>questions</strong> early on, and <strong>iterate</strong> as much as possible to refine the feedback cycle and come up with creative alternative solutions.</li>
<li><a href="https://dl.acm.org/doi/10.1145/2470654.2466177"><strong>Brainstorming</strong></a> is important, and you have to take it as a creative exercise as inserting a “random” element can actually allow you to think outside the box and find new ways to tackle a certain problem.</li>
<li>Beware of <a href="https://xd.adobe.com/ideas/process/user-research/how-to-overcome-cognitive-bias-in-ux-research/"><strong>biases</strong></a>, as you will encounter so many of them along the way and the more you know about them the better you will be able to recognize them.</li>
<li>Get comfortable with the concepts of gulf of <a href="https://www.nngroup.com/articles/two-ux-gulfs-evaluation-execution/"><strong>execution and gulf of evaluation</strong></a> as they are vital points which will eventually determine the overall perceived usability of your interface/product.</li>
</ul>
<p>Hope you found these points somewhat helpful/insightful, and I will come back with more takeaways once the class is over in May so stay tuned for that! ✨</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>2021</category>
      <category>omscs</category>
      <category>updates</category>
    </item>
    <item>
      <title>Goodbye 2020</title>
      <link>https://valentinacalabrese.com/blog/goodbye-2020</link>
      <guid>https://valentinacalabrese.com/blog/goodbye-2020</guid>
      <pubDate>Thu, 31 Dec 2020 00:00:00 GMT</pubDate>
      <description><![CDATA[2020, what a year. I won't digress nor try to capture with vague and ephemeral words the global scenario that has turned so many lives upside down during these…]]></description>
      <content:encoded><![CDATA[<p><strong>2020</strong>, what a year.</p>
<p>I won’t digress nor try to capture with vague and ephemeral words the global scenario that has turned so many lives upside down during these past 12 months, because it’s been so intense and dramatic in many ways and enough words have already been spent on this.</p>
<p>I will just say that I truly hope that as many people as possible will be able to finally turn the page and to move on with a positive start of 2021.</p>
<p>This year has been incredibly intense for me too.</p>
<p>I <strong>graduated in March</strong> when the pandemic was hitting hard, and it was such a surreal experience to spend my graduation day at home in front of a webcam instead of celebrating it with my friends, but nonetheless I am happy that I was able to achieve this great goal of mine.</p>
<p>Soon after graduating I started my first official full-time job as a <strong>Front-end Software Engineer</strong> at Cloud Academy, and I gotta say it’s helping me a lot to become a much better Software Developer.</p>
<p>Being able to actively contribute to a <strong>Design System</strong> using the latest tools &#x26; frameworks is definitely a great chance for me to think about the product from the ground-up, and collaborating with Designers to establish visual patterns &#x26; rules is rewarding and interesting.</p>
<p>Also, I was officially accepted as a grad student for a <strong>M.S. in Computer Science</strong> at <strong>Georgia Tech</strong> and I will be starting in a week from now!</p>
<p>This is so exciting for me, but I hope I can find a good work/life balance because it’s gonna be pretty tough to combine two challenges of this magnitude.</p>
<p>I will also try to keep this blog more up-to-date, and my mission is also going to be to write a few technical blog posts on front-end related topics as well (or maybe som ML stuff?!).</p>
<p>Anyway, if you’ve read this far thank you my dear virtual friend and stay tuned for more!</p>
<ul>
<li><strong>2021 here we go!</strong></li>
</ul>
<p>╰(<em>°▽°</em>)╯</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>end</category>
      <category>year</category>
      <category>2020</category>
      <category>thoughts</category>
    </item>
    <item>
      <title>Goodbye 2019</title>
      <link>https://valentinacalabrese.com/blog/goodbye-2019</link>
      <guid>https://valentinacalabrese.com/blog/goodbye-2019</guid>
      <pubDate>Tue, 31 Dec 2019 00:00:00 GMT</pubDate>
      <description><![CDATA[What a year. 2019 has truly been such an eventful year for multiple reasons. It has allowed me to grow in ways I'd have never imagined, both as Developer and…]]></description>
      <content:encoded><![CDATA[<p>What a year.</p>
<p><strong>2019</strong> has truly been such an eventful year for multiple reasons.</p>
<p>It has allowed me to grow in ways I’d have never imagined, both as Developer and more in general as an aspiring human being 👽.</p>
<p>Having had a chance to visit the US again to spend three months as a UX Engineer at Mailchimp was an incredible opportunity, which I am so grateful for and that has broaden my perspective on so many topics (e.g the power of Accessibility, User-centered design, the importance of effective communication, the value of humility, the listen hard/change fast mentality) and the awesome people in my team all helped me visualize so vividly what can be achieved through hard-work ad dedication.</p>
<p>In 2020 I really wanna treasure and harness the power of the experiences I was able to live throughout this past year, to build new powerful resources and follow the path of creativity and personal development.</p>
<p>Setting very specific goals at this point could be rather counterproductive, so for now I am just gonna try to become a better version of myself and stick to this goal which is going to act as a daily reminder/ambition.</p>
<p>Also, if you’re reading this I just wanna say thank you (and Merry Christmas!)</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>end</category>
      <category>year</category>
      <category>2019</category>
      <category>thoughts</category>
    </item>
    <item>
      <title>Mailchimp Internship</title>
      <link>https://valentinacalabrese.com/blog/my-mailchimp-internship-in-atlanta</link>
      <guid>https://valentinacalabrese.com/blog/my-mailchimp-internship-in-atlanta</guid>
      <pubDate>Sun, 25 Aug 2019 00:00:00 GMT</pubDate>
      <description><![CDATA[There would be so many things and anecdotes to talk about which contributed to making my internship experience at Mailchimp truly unique. And a simple blog…]]></description>
      <content:encoded><![CDATA[<h2 id="12-incredible-weeks-as-a-ux-designer-intern">12 incredible Weeks as a UX Designer Intern</h2>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/_astro/mailchimp-internship-cover_aouzfl_Z1NxKQb.webp?dpl=6ad3bc51943b9254ae3fc9e4" alt="mailchimp-internship-cover_aouzfl.jpg"></p>
<p>There would be so many things and anecdotes to talk about which contributed to making my internship experience at Mailchimp truly unique.</p>
<p>And a simple blog post cannot capture all the magic concentrated in the span of 12 weeks, so I am just going to highlight a few key aspects that made this summer absolutely unforgettable.</p>
<p>Working with the Design System team as a UX Engineer has been such an exciting part of my journey to Atlanta, and it made me understand about how important it is to have a great sense of team work and cooperation when starting to conceptualize the building blocks of a whole new Design System.</p>
<p>As a matter of fact, having a clear sense of direction and a vision is not enough, as the mission of a Design System team is to standardize and make the visual elements of a User Experience fully accessible, well-documented and completely in-line with the company vision and strategy.</p>
<p>It is no easy task, believe me.</p>
<p>But that’s part and parcel of the fun of it.</p>
<p>Using the latest technologies and frameworks to bring to life the User Interface of a product is such a great and empowering feeling, and being able to actively contribute to the various discussions with the team and receiving feedback along the way, makes the whole process so much smoother and enjoyable.</p>
<p>I feel so lucky to have had this opportunity to work with such talented people, and every day felt like a whole new chapter to continue being inspired and motivated to see things grow and change.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>internship</category>
      <category>atlanta</category>
      <category>mailchimp</category>
    </item>
    <item>
      <title>A New Adventure</title>
      <link>https://valentinacalabrese.com/blog/a-new-adventure-in-the-us</link>
      <guid>https://valentinacalabrese.com/blog/a-new-adventure-in-the-us</guid>
      <pubDate>Tue, 16 Apr 2019 00:00:00 GMT</pubDate>
      <description><![CDATA[Hey there, if you're reading this, well I'm glad you landed on this page and I hope you're gonna enjoy the content ahead 😊. I haven't updated my blog in a…]]></description>
      <content:encoded><![CDATA[<p>Hey there, if you’re reading this, well I’m glad you landed on this page and I hope you’re gonna enjoy the content ahead 😊.</p>
<p>I haven’t updated my blog in a while but felt it was the right time to publish a new post, because there is some great upcoming news in the air…</p>
<p>I still can’t believe this is happening to me but recently I was accepted for another amazing internship program in Atlanta (GA), where I’m gonna work for the whole summer as a UX Engineer Intern with a wonderful Tech company whose mission is to empower small businesses so to make them grow and thrive in the most effective ways!</p>
<p>It’s a 12 weeks program, and my main tasks are gonna involve the collaboration with the Design System with the aim to improve internal tooling for the Design team, and to help define new patterns for the application.</p>
<p>I am gonna work directly with a team of engineers and designers to gain real-world experience as an engineer. It’s gonna be such an exciting and wonderful opportunity for me to gain real experience as a UX Engineer, and to cooperate with brilliant people towards the realization of a product whose main goal is to improve other people’s lives through their personal business vision. Wish me luck! 🍀</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>adventure</category>
      <category>mailchimp</category>
      <category>internship</category>
    </item>
    <item>
      <title>The Fox Internship</title>
      <link>https://valentinacalabrese.com/blog/the-fox-internship</link>
      <guid>https://valentinacalabrese.com/blog/the-fox-internship</guid>
      <pubDate>Tue, 01 Jan 2019 00:00:00 GMT</pubDate>
      <description><![CDATA[I'm gonna be working with The Fox Magazine as an Editorial Intern! The Fox Magazine is a premier lifestyle publication focusing on beginnings, creativity, and…]]></description>
      <content:encoded><![CDATA[<p>I’m gonna be working with The Fox Magazine as an Editorial Intern!</p>
<p>The Fox Magazine is a premier lifestyle publication focusing on beginnings, creativity, and risk.</p>
<p>Since March of 2016, The Fox Magazine explores an original, vivid, and timeless insight into the essence of photography, travel, food, fashion, music, and technology.</p>
<p>The mission is to be the leading resource of inspiration for individuals wanting to chase their dreams and seek a fulfilling lifestyle.</p>
<p>It’ gonna be such a great opportunity for me to challenge myself into pursuing something different from what I am normally used to doing (i.e. Front-End Web Development), and I am truly looking forward to cooperating with journalists, scholars, photographers, musicians, travelers, chefs, and even fashion designers to bring the Fox Magazine’s mission to life!</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>internship</category>
      <category>updates</category>
      <category>remote</category>
    </item>
    <item>
      <title>My Adobe internship</title>
      <link>https://valentinacalabrese.com/blog/my-adobe-internship</link>
      <guid>https://valentinacalabrese.com/blog/my-adobe-internship</guid>
      <pubDate>Sun, 11 Nov 2018 00:00:00 GMT</pubDate>
      <description><![CDATA[Hey there! It's been such a long time since my last blog post, so I felt like I had to make up for it and now here I am typing on the same old keyboard but…]]></description>
      <content:encoded><![CDATA[<p>Hey there!</p>
<p>It’s been such a long time since my last blog post, so I felt like I had to make up for it and now here I am typing on the same old keyboard but with so many new stories to tell!</p>
<p>Those past few months have been extremely hectic and intense, and the New York Internship with Adobe turned out to be such an incredible learning experience whose impact proved to be crucial from many standpoints, both professionally and humanly speaking.</p>
<p>I think overall I changed a lot, being on my own for three months in the big 🍏 has shaped my thoughts and ideals in ways I would have never imagined before and I feel blessed for having had this amazing opportunity.</p>
<p>I was able to work with an awesome team (thank you Smashers!) on many different projects, and was able to understand a lot more about Bēhance as a platform and about all the incredible efforts that are being put into such an ambitious product.</p>
<p>Working with such a huge codebase was kinda hard to get used to at the beginning, but everybody has been truly supportive and helpful towards me throughout this journey as a Front-End Dev Intern and so I could really enjoy the whole process (struggles included!).</p>
<p>I learnt about the importance of details, and how being precise and meticulous when it comes to working with a product that’s being used every day by millions of users can truly make a significant difference.</p>
<p>In addition to that, a genuine inclination towards team-work is undoubtedly the #1 skill to have, and cooperating with all the various teams proved to be truly vital not just in terms of time efficiency but because it is the key to success for every company that wants to last.</p>
<p>Having shared core values to abide by in a company means that the work can be carried out more effortlessly and smoothly, and that everybody is more likely to be on the same page and happy about the way things are handled in general.</p>
<p>So thank you again Adobe for giving me this chance to experience what it’s like to work for one of the top Software companies in the world, and to feel part of something bigger, to be an active team player whose small contribution can still have a tangible impact on the user experience of millions of people.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>adobe</category>
      <category>internship</category>
      <category>new york</category>
    </item>
    <item>
      <title>Mastering Resilience</title>
      <link>https://valentinacalabrese.com/blog/the-subtle-art-of-resilience</link>
      <guid>https://valentinacalabrese.com/blog/the-subtle-art-of-resilience</guid>
      <pubDate>Tue, 12 Jun 2018 00:00:00 GMT</pubDate>
      <description><![CDATA[Resilience. That's one interesting and nowadays perhaps too abused word which, nonetheless, represents such an important and universal concept. What is,…]]></description>
      <content:encoded><![CDATA[<p><em><strong>Resilience.</strong></em></p>
<p>That’s one interesting and nowadays perhaps too abused word which, nonetheless, represents such an important and universal concept.</p>
<p>What is, indeed, the essence of resilience?</p>
<p>How could we define this word without the risk of getting stuck and superficially trapped in the many possible definitions?</p>
<p>Well, Psychology Today defines resilience as:</p>
<p>“that ineffable quality that allows some people to be knocked down by life and come back stronger than ever. Rather than letting failure overcome them and drain their resolve, they find a way to rise from the ashes”.</p>
<p>And this at a first glance, looks like a simple yet acceptable definition.</p>
<p>But if we leave personal experience out of this equation “resilience” becomes just a mere word, and its profound meaning wouldn’t actually mean anything significant to us.</p>
<p>So that’s why I encourage you, if you are reading this article, to isolate some of your toughest memories, those events which had a huge impact on your behavior and that eventually shaped who you were and who you feel like you are now.</p>
<p>Go back to those moments and try to figure out whether you let yourself down because of them and passively surrendered to your fate, or whether you actively fought and tried to find a way out of that unbearable situation.</p>
<p>If you didn’t surrender to what life prospected and sought a true sense of purpose and willingness to move forward, then you definitely appear to be a goal-oriented, optimistic, motivated and strong individual who doesn’t easily give up when faced with a stressful or annoyingly unpleasant problem.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>resilience</category>
      <category>thoughts</category>
      <category>reflection</category>
    </item>
    <item>
      <title>A dream come true</title>
      <link>https://valentinacalabrese.com/blog/a-dream-come-true</link>
      <guid>https://valentinacalabrese.com/blog/a-dream-come-true</guid>
      <pubDate>Tue, 12 Jun 2018 00:00:00 GMT</pubDate>
      <description><![CDATA[I still can't believe what I am about to write, because if they had told me about it a couple of years ago I would have most certainly laughed in disbelief. So…]]></description>
      <content:encoded><![CDATA[<p>I still can’t believe what I am about to write, because if they had told me about it a couple of years ago I would have most certainly laughed in disbelief.</p>
<p>So here we go.</p>
<p>A lifetime dream. The perfect fairytale. My most common daydreaming scenario.</p>
<p>I am going to New York City. For real.</p>
<p>I’ve landed an internship as a Front-End Developer at Adobe, and I will be working with the Behance team to contribute in the creation and delivery of beautiful and highly usable interactions in their products.</p>
<p>It’s going to be a full-time internship from mid June till the end of August for a total of 12 weeks.</p>
<p>NYC has always been my dream city: ever since I was a little girl I used to virtually wander around the streets of New York using Google Maps, and hoping to one day be able to go there and experience what it feels like.</p>
<p>Being able to spend 3 months in NYC feels unreal: it’s the fulfillment not only of a lifetime goal, but a professional achievement since during these past few years I worked hard to gain knowledge and expertise in Web Development.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>dream</category>
      <category>internship</category>
      <category>new york</category>
    </item>
    <item>
      <title>Hello world</title>
      <link>https://valentinacalabrese.com/blog/welcome-to-my-portfolio-website</link>
      <guid>https://valentinacalabrese.com/blog/welcome-to-my-portfolio-website</guid>
      <pubDate>Thu, 05 Apr 2018 00:00:00 GMT</pubDate>
      <description><![CDATA[Hey there! ✨ This is my first post. Kinda thrilling, kinda weird. But it's the beginning of a new digital journey 🤓. And I'm happy you are actually reading…]]></description>
      <content:encoded><![CDATA[<p><strong>Hey</strong> <em>there</em><strong>!</strong> ✨</p>
<p><img loading="lazy" decoding="async" onerror="this.outerHTML='<span class=\'img-missing\'>Image unavailable</span>'" src="https://valentinacalabrese.com/_astro/hello-world_ZSYErH.webp?dpl=6ad3bc51943b9254ae3fc9e4" alt="hello-world.jpg"></p>
<p>This is my first post. Kinda thrilling, kinda weird.</p>
<p>But it’s the beginning of a new digital journey 🤓.</p>
<p>And I’m happy you are actually reading these lines right now, because they represent in a sense the overall work and effort that I put into these past few years as an aspiring Web Developer.</p>
<p>So that’s why I say Welcome! :)</p>
<p>Welcome to this virtual space, which I hope is going to give you an even more effective idea about my passion for Technology.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>hello world</category>
      <category>hi</category>
      <category>welcome</category>
    </item>
    <item>
      <title>NDC London 2018</title>
      <link>https://valentinacalabrese.com/blog/ndc-london-2018</link>
      <guid>https://valentinacalabrese.com/blog/ndc-london-2018</guid>
      <pubDate>Mon, 01 Jan 2018 00:00:00 GMT</pubDate>
      <description><![CDATA[I still can’t believe I am actually going to attend NDC London, it’s been such a pleasingly unexpected surprise from the very beginning when I first got the…]]></description>
      <content:encoded><![CDATA[<h2 id="day-1">Day 1</h2>
<p>I still can’t believe I am actually going to attend NDC London, it’s been such a pleasingly unexpected surprise from the very beginning when I first got the news that I was selected to receive the final prize.</p>
<p>And now that the day has finally come I am here in the busy Victoria Station, hurriedly walking towards the NDC venue which this year is the beautiful QEII Centre in the heart of Westminster.</p>
<p>Everything feels amazing, weird, and thrilling at the same time and I’m looking forward to discovering all about the latest tech gadgets and devices, as well as meeting cool people who are passionate about Technology as I am.</p>
<p>I’m truly excited about the upcoming React Workshop I am going to attend since it’s actually one of the Front-End technologies I’ve been enjoying working on the most during the past few months, and the opportunity to learn something more about it from Jake Ginnivan is great.</p>
<p>This React Workshop is actually going to last for 2 days (till January 16th), which means it’s going to be a complete and detailed full immersion into this powerful JS library with a clear focus on the best practices.</p>
<p>Here I am now staring in awe at the beautiful Westminster Abbey, which is just next to the NDC venue (i.e. the QEII Convention Centre).</p>
<p>The surroundings are so charming and beautiful that it almost doesn’t feel real to be in such a context for this event.</p>
<p>I then proceed and walk towards QEII to check in and head to the 4th floor, to the “Burns” room (N.d.A. each room takes its name from a famous British author) where the Workshop is going to take place.</p>
<p>Jake is a good teacher from the beginning: he is very professional and prepared and knows everything about the React JS environment and all the best practices to make code faster and more reliable.</p>
<p>He gives us a mission: our task is to recreate the NDC agenda webpage using React.</p>
<p>Luckily, though, he’s always there ready to help us when we face any problems in structuring our application and he assists us during the whole process by giving us examples and extra challenges to implementing inside the Web App.</p>
<blockquote>
<p>❝Any sufficiently advanced technology is equivalent to magic.</p>
</blockquote>
<p>Sir Arthur C. Clarke</p>
<h2 id="day-2">Day 2</h2>
<p>Today the pace gets increasingly faster and we continue our React Workshop journey by approaching new complex concepts and topics such as “Routing”, which is a practice whose aim is to better distribute the components’ logic inside Single Page Applications and we also dive into “Redux”, which is a tool whose purpose is to allow for more solid state management.</p>
<p>It’s definitely challenging to catch up with so many new inputs, but Jake is always there to explain and help us understand the nitty-gritty making the process enjoyable.</p>
<p>React is such a very powerful JS library with impressive potential, even though the learning curve is pretty steep for those who aren’t familiar with JavaScript and its syntax.</p>
<br>
<h2 id="day-3">Day 3</h2>
<p>Today is the first actual day of NDC and I am absolutely thrilled about all the upcoming talks and great people who are going to present their ideas regarding innovative topics in the realm of Technology.</p>
<p>37 is the number of different countries represented this year at NDC London.</p>
<p>The first speaker is <strong>Felienne</strong>, Assistant Professor at Delft University of Technology, who’s going to provide insights to answer the tough question:</p>
<p>What is programming anyway?</p>
<p>Her speech was truly inspirational and unconventional (she’s so funny and down-to-earth), and she talked about the ups and downs of her journey as a Ph.D. Candidate and the research she carried on regarding the conception of Spreadsheets as an actual programming tool, which even though turned out to be a failure <em>(since she realized she wasn’t genuinely interested in pursuing this kind of project)</em> was ultimately what led her to find her real passion.</p>
<p>Not only it was an engaging and motivational story, but it involved a good deal of food for thought since it aimed at re-thinking and re-shaping the functional aspect of programming with the purpose of reaching out to people who could feel intimidated by it if we were to stick to the narrow perspective of Software Development as a mere tool for an elite of gifted people.</p>
<p>That’s why Felienne made it her mission to overturn this cliché of programming as a branch of pure application of logic and technical rigidity to solve complex problems.</p>
<p>She is helping children all over the world to learn programming (using the MIT open source language Scratch) in a fun and intuitive way so that they can all begin to familiarize themselves with the tools in a more playful way but with an eye on the structure and reusability of the various programming blocks to optimize the simple logic behind them.</p>
<p>Felienne’s speech lightened up a whole new and refreshing perspective for me since I can really relate to the feeling of being overwhelmed and not feeling like programming is a good choice, (I’ve always struggled with Maths myself and never been really good at it) and the idea of re-defining this conception, and to realize that multiple types of intelligence can actually take advantage of programming in different ways was enlightening.</p>
<p>So thank you Felienne, it’s <strong>empowering</strong> to be able to finally break those barriers and know that it is possible to actively contribute to the Tech Industry in many ways without having to constrain ourselves into a specific role.</p>
<p>The day moves on pretty fast and since we only have a 20min time window between any two conferences, it’s vital to properly manage your time and find out which cool topics are the ones you’d like to hear more about…</p>
<p>The <strong>food</strong> is insanely <strong>delicious</strong> though, and with every break, we are welcomed with some tasty dishes and sweet treats (each day 6 different menu choices representing a different country are available)!</p>
<p>Later on, I then proceed to attend the next talks and listen to Brock Allen (.NET, Web Dev &#x26; Security Expert) and <strong>Dominick Baier</strong> (Identity &#x26; Access Control Consultant) speaking about Implementing <strong>Authorization in Web Applications &#x26; APIs</strong>.</p>
<p>They explore patterns, and anti-patterns and provide solutions to possible exploitable techniques on the topic of Authorization and get into the details with great precision.</p>
<p>So I am then surprised by the “Power of Composition” thanks to a great speech by <strong>Scott Walschin</strong>, who has just finished writing a new book about the elegance and practicality of Functional Programming using F#.</p>
<p>But the day is not over yet and in the afternoon I am able to explore the concept of “Immutability” applied to Programming thanks to <strong>Kevlin Henney</strong>, who delivers a great speech about how to <strong>reduce state mutability</strong> in code and why this is so important.</p>
<ul>
<li><strong>Jasmine Greenway</strong> is the next speaker and she talks about her experience as a teacher at La Guardia Community College (Queens, NYC) which involved teaching young students with no previous programming experience the basics of HTML5, CSS3, and JavaScript in order to build simple Applications.</li>
</ul>
<p>She brought up interesting examples from her personal experience (how she perceived herself as a student and how she consequently interacted with the people around her) and also explained how empathy and soft skills are vital aspects of any aspiring teacher.</p>
<p>But this evening NDC doesn’t simply end with the last conference because an amazing cruise on the River Thames has been organized, which involves both the NDC participants and all the speakers.</p>
<p>Now that I look back on it I realize it’s actually been one of the most incredible nights I’ve ever had: spending a few hours cruising on a boat on the Thames and being able to admire London during night-time with all of its vibrant lights and all of the modern and ancient buildings is the scenario for memorable moments.</p>
<p>On top of that, being able to connect with different people and hear about their stories and experiences in such a context revealed to be even more unique and was the perfect conclusion for a special day like this one.</p>
<h2 id="day-4">Day 4</h2>
<p>Today is the second official day of NDC London and many inspiring talks are scheduled for the day.</p>
<p>We start off with a very inspiring talk by <strong>Alex Ellis</strong> and <strong>Scott Hanselman</strong> who perform a live demonstration on stage about how to build a Raspberry Pi Kubernetes Cluster running .NET Core.</p>
<p>They provide a detailed explanation of how they managed to build such a sophisticated and fully functional real server using only a stack of six Raspberry Pis piled each on top of the other.</p>
<p>The whole audience is wildly entertained and engaged by the talk, since being able to admire the effort and sophistication put into the realization of such a piece of Technology with a budget of less than 300$ is undoubtedly phenomenal.</p>
<p>After the talk, everybody is eager to try and build their own Raspberry PI cluster server (myself included since I own one but never figured out how to effectively use it!), and we immediately start googling every resource related to this project and to Open Faas (Alex Ellis is its creator).</p>
<p>Open Faas is indeed a framework for building serverless functions on top of containers (its GitHub repo has 8394 stars), and during the speech, we were introduced to its various functionalities and to the whole environment needed to set it up.</p>
<p>Next up is <strong>Kesha Williams</strong>, Full-stack Software Developer and Inventor of SAM (a predictive policing machine learning algorithm inspired by Minority Report that predicts the likelihood of crime).</p>
<p>She introduces us to the project by explaining how Minority Report (her favorite movie ever) gave her the right inspiration and determination to create such a sophisticated product, which is capable of detecting the likelihood of crime using data imported from the Georgia Police Department.</p>
<p>With just a simple tweet SAM (n.d. A Suspicious Activity Monitoring) is able to predict whether the person captured by the image sent with the tweet is likely to be a potential criminal.</p>
<p>It uses AI to analyze the photo and processes it to find facial features which relate to suspicious traits in a target individual.</p>
<p>Needless to say that this proves to be a very inspiring talk, thanks to the in-depth explanation of the SAM case study and all the tools Kesha used to build it (it relies on AWS and uses Python for the algorithmic predictive model).</p>
<p>During the afternoon I was very curious to attend the talk “Hack Your Career” by <strong>Troy Hunt</strong>, who talked about his life experience as a Software Developer and about the choices he made that eventually led him to become a successful entrepreneur (he is a well-known for the popular tool “Have I been pawned?”, and for sharing his knowledge about Security both with his Pluralsight courses and blog posts).</p>
<p>He gave some clever insights about the best strategies to follow in order to have a successful and meaningful career (e.g. the importance of branding oneself, the creation of value, and leadership), one whose aim is to positively impact the world by sharing knowledge and being persistent to ambitious goals.</p>
<p>The afternoon proceeds as usual with a rapid pace and Machine Learning is the topic I am able to learn about thanks to Tess Ferrandez-Norlander, a brilliant developer from Microsoft who introduces the topic of ML and its incredible implications in today’s world.</p>
<p>The last speech of the day is given by <strong>Sam Aaron</strong>, the creator of <strong>Sonic Pi</strong>, which is a great coding-based Music software (written using Ruby) whose ease of use makes it accessible to anybody who is interested in building original music tracks even if they’re lacking programming skills.</p>
<p>He performs an amazingly entertaining live demonstration about how the software works, and how to mix the various sounds and effects in order to produce and compose a pleasing symphony.</p>
<p>One of the best aspects of this product is that it’s actually completely free (I downloaded it straight after the conference!)</p>
<p>This evening the <strong>NDC Party</strong> concludes such an intense day of technical presentations on a lively and sparkly note, which invades the whole QEII center making a wonderful atmosphere.</p>
<h2 id="day-5---the-last-day-of-ndc">Day 5 - The Last Day of NDC</h2>
<p>I can’t believe it’s already almost over.</p>
<p>Time went by so quickly that I just didn’t realize that today is the <strong>last day</strong> I’ll be spending here at the QEII center, in the heart of beautiful Westminster.</p>
<p>The atmosphere, the great people I’ve met, the speakers, the countless start-up stands, the delicious food, and the common passion for innovation and technology all make for a unique combination of elements.</p>
<p>A pure and vibrant interconnected space where everything seemed to be possible and indeed, it has been possible for me to experience all of this thanks to Keyzo’s <strong>NCW Competition</strong>.</p>
<p>During his talk named “Web Apps can’t really do that, can they?”, Steve Sanderson shows how he was able to create a fully functional environment that runs pure C# code directly in the browser with almost no lags nor latencies.</p>
<p>This incredible live demonstration leaves everybody in awe since no such thing ever seemed to be remotely possible due to the nature of C# as a language (and its intrinsic complexity), and the many quirks coming from the nature of JavaScript’s behavior in the browser (a language which splits Developers in a love/hate relationship).</p>
<p>It definitely looks like a very promising project which I hope is going to be further enhanced since it could potentially open up a whole new horizon for the world of Software Development.</p>
<p>But our final day at NDC isn’t over yet and so we move on with the first-afternoon talk which is a nice co-hosted Q&#x26;A session with Troy Hunt, Felienne, Jon Skeet, and Scott Hanselman who share their opinions and thoughts about many subjects related to the world of Technology in its many forms and answer questions from the crowd.</p>
<p>They’re all very down-to-earth and attuned to the audience and so they manage to give insightful and witty remarks concerning controversial topics which usually cause a lot of arguing in the Tech community (e.g. Ethics &#x26; Professionalism in Computer Science, how to handle behavioral and business problems and difficult situations).</p>
<p>Next up is a very original and inspiring talk (Mötley Crüe and Mödern JavaScript) by <strong>Eric Brandes</strong> who’s a JavaScript expert with very solid and wide knowledge about the JS environment and its latest trends and front-end libraries.</p>
<p>That’s why in his talk he explicitly addresses some of the most common <strong>misconceptions</strong> about JavaScript as a language and also unravels the truth about the countless new <strong>JS frameworks</strong> which have been popping up lately that in his view have only contributed to causing even more confusion in the whole Web Development scene.</p>
<p>To make his point even clearer he adopts some really cool metaphors inspired by images from famous Heavy Metal bands and showcases the actual “winners” and “losers” in the JS world in a funny and engaging way.</p>
<p>Last but not least is the talk by Marcin Moskala and Igor Wojda about <strong>Kotlin</strong>, a language that has lately been gaining so much popularity in the Programming world and which is considered the next Android language.</p>
<p>I was very curious to have an overview of the main features and the general syntax of Kotlin as a programming language, and I have to say that this talk exceeded my expectations in that it covered many more topics (some very advanced ones!) than I had imagined.</p>
<p>What a weird feeling now as I am walking away from Room 4, where the last talk has just taken place.</p>
<p>It is actually hard to finally say Goodbye and leave QEII after having spent some memorable days in such an amazing place.</p>
<p>As I walk past the door and go out of the building headed to St. James’ Park station, I can’t help but recollect all the fresh memories coming from these past few days and it’s wonderful to realize how they make into a perfect “collage” made of emotions, thoughts, images, considerations and inspirational words.</p>
<p>That’s the reason why I say <strong>thank you</strong>.</p>
<p>Thank you <strong>Keyzo</strong> for giving me this opportunity.</p>
<p>It’s been <strong>extraordinary</strong> and I will never forget how impactful this experience has been for me, and how it contributed to motivating me, even more, to pursue a career in the world of <strong>Technology</strong>.</p>]]></content:encoded>
      <dc:creator>Valentina Calabrese</dc:creator>
      <category>ndc</category>
      <category>conference</category>
      <category>london</category>
      <category>2018</category>
    </item>
  </channel>
</rss>