<?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>Valentina Calabrese's Blog</title>
    <link>https://valentinacalabrese.com</link>
    <description>Creative Software Engineer's thoughts and experiences</description>
    <atom:link href="https://valentinacalabrese.com/rss.xml" rel="self" type="application/rss+xml"/>
    <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 with 16 experienced developers working on...]]></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 week. If you haven’t heard of it, it’s an ope...]]></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[Hey there! ✨ It’s been such a long time since my last post here, that I figured it was honestly about time to come back with some pretty significant updates… So, I graduated. Like, actually graduated ...]]></description>
      <content:encoded><![CDATA[<p>Hey there! ✨</p>
<p>It’s been such a long time since my last post here, that I figured it was honestly about time to come back with some pretty significant updates…</p>
<p>So, I <a href="https://omscs.gatech.edu/">graduated</a>. Like, actually graduated 🤓.</p>
<p>I still kinda can’t believe I’m typing these words, but I officially finished my MSc in Computer Science at Georgia Tech this past December, and it still feels surreal to me when I say it out loud.</p>
<p>Looking back, I gotta say 2023 has been one of the most intense years of my life. I basically decided to just put my head down and finish my master’s while working full-time as a Front-End Engineer, and if you’ve ever tried to do both at once you know that it’s the kind of thing that sounds manageable on paper, and then slowly eats every single evening and weekend you have.</p>
<p>But somehow I made it through, and honestly that still feels a bit unreal.</p>
<p>The graduation ceremony was on December 16th and it was such an emotional day for me. Atlanta was beautifully crisp that morning, with an impossibly clear blue sky, and the campus was full of families and friends in caps and gowns, parents taking way too many pictures (mine very much included!), and everyone just bundled up and smiling. When I walked across the stage and heard my name, it felt almost unreal, like something I had daydreamed about so many times was finally just… happening 🥹.</p>
<p>The last few months before then were honestly pretty brutal though. I had to give it everything I had, and pretty much anything that wasn’t studying or coding kinda disappeared from my life for a while, this blog very much included. It wasn’t glamorous at all, just a lot of late nights and way too much caffeine and telling myself that it would all be worth it in the end.</p>
<p>And looking back now, I’m so grateful I pushed through.</p>
<p>So now we’re in 2024 and I finally feel like I have some space again, both mentally and in terms of actual hours in my day. I have all this energy that’s been bottled up for months and I really wanna channel it into something new. I’ve been thinking a lot about starting more personal projects on the side, building small things, experimenting, and maybe even shipping something that’s entirely mine for once.</p>
<p>Anyhow, more updates coming soon, I promise! This year I really wanna treasure all the knowledge and discipline I built up during my master’s, and turn it into something tangible and creative ✨.</p>
<p>Thank you for reading my dear virtual friend, and stay tuned for more! Cheers 👋</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 the introduction of Hooks in version 16.8...]]></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React, { useState, useEffect } </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> ChatRoom</span><span style="color:#E6EDF3">({ </span><span style="color:#FFA657">chatRoomId</span><span style="color:#E6EDF3"> }) {</span></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#E6EDF3"> [</span><span style="color:#79C0FF">messages</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">setMessages</span><span style="color:#E6EDF3">] </span><span style="color:#FF7B72">=</span><span style="color:#D2A8FF"> useState</span><span style="color:#E6EDF3">([]);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D2A8FF">  useEffect</span><span style="color:#E6EDF3">(() </span><span style="color:#FF7B72">=></span><span style="color:#E6EDF3"> {</span></span>
<span class="line"><span style="color:#FF7B72">    function</span><span style="color:#D2A8FF"> handleNewMessage</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">newMessage</span><span style="color:#E6EDF3">) {</span></span>
<span class="line"><span style="color:#D2A8FF">      setMessages</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">prevMessages</span><span style="color:#FF7B72"> =></span><span style="color:#E6EDF3"> [</span><span style="color:#FF7B72">...</span><span style="color:#E6EDF3">prevMessages, newMessage]);</span></span>
<span class="line"><span style="color:#E6EDF3">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D2A8FF">    subscribeToChatRoom</span><span style="color:#E6EDF3">(chatRoomId, handleNewMessage);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">    return</span><span style="color:#E6EDF3"> () </span><span style="color:#FF7B72">=></span><span style="color:#E6EDF3"> {</span></span>
<span class="line"><span style="color:#D2A8FF">      unsubscribeFromChatRoom</span><span style="color:#E6EDF3">(chatRoomId, handleNewMessage);</span></span>
<span class="line"><span style="color:#E6EDF3">    };</span></span>
<span class="line"><span style="color:#E6EDF3">  }, [chatRoomId]);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#8B949E">  // ...</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React, { useEffect } </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> ProductPage</span><span style="color:#E6EDF3">({ </span><span style="color:#FFA657">productId</span><span style="color:#E6EDF3"> }) {</span></span>
<span class="line"><span style="color:#D2A8FF">  useEffect</span><span style="color:#E6EDF3">(() </span><span style="color:#FF7B72">=></span><span style="color:#E6EDF3"> {</span></span>
<span class="line"><span style="color:#FF7B72">    const</span><span style="color:#79C0FF"> startTime</span><span style="color:#FF7B72"> =</span><span style="color:#E6EDF3"> Date.</span><span style="color:#D2A8FF">now</span><span style="color:#E6EDF3">();</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">    return</span><span style="color:#E6EDF3"> () </span><span style="color:#FF7B72">=></span><span style="color:#E6EDF3"> {</span></span>
<span class="line"><span style="color:#FF7B72">      const</span><span style="color:#79C0FF"> endTime</span><span style="color:#FF7B72"> =</span><span style="color:#E6EDF3"> Date.</span><span style="color:#D2A8FF">now</span><span style="color:#E6EDF3">();</span></span>
<span class="line"><span style="color:#FF7B72">      const</span><span style="color:#79C0FF"> duration</span><span style="color:#FF7B72"> =</span><span style="color:#E6EDF3"> endTime </span><span style="color:#FF7B72">-</span><span style="color:#E6EDF3"> startTime;</span></span>
<span class="line"><span style="color:#D2A8FF">      trackUserBehavior</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">'productPageViewDuration'</span><span style="color:#E6EDF3">, duration);</span></span>
<span class="line"><span style="color:#E6EDF3">    };</span></span>
<span class="line"><span style="color:#E6EDF3">  }, [productId]);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#8B949E">  // ...</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 game-changer, enabling developers to work with st...]]></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React, { useState, useCallback } </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> Game</span><span style="color:#E6EDF3">() {</span></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#E6EDF3"> [</span><span style="color:#79C0FF">level</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">setLevel</span><span style="color:#E6EDF3">] </span><span style="color:#FF7B72">=</span><span style="color:#D2A8FF"> useState</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">1</span><span style="color:#E6EDF3">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#D2A8FF"> levelUp</span><span style="color:#FF7B72"> =</span><span style="color:#E6EDF3"> () </span><span style="color:#FF7B72">=></span><span style="color:#E6EDF3"> {</span></span>
<span class="line"><span style="color:#D2A8FF">    setLevel</span><span style="color:#E6EDF3">(level </span><span style="color:#FF7B72">+</span><span style="color:#79C0FF"> 1</span><span style="color:#E6EDF3">);</span></span>
<span class="line"><span style="color:#E6EDF3">  };</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  return</span><span style="color:#E6EDF3"> &#x3C;</span><span style="color:#7EE787">Board</span><span style="color:#79C0FF"> level</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">level</span><span style="color:#FF7B72">}</span><span style="color:#79C0FF"> onLevelUp</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">levelUp</span><span style="color:#FF7B72">}</span><span style="color:#E6EDF3"> />;</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> Board</span><span style="color:#E6EDF3">({ </span><span style="color:#FFA657">level</span><span style="color:#E6EDF3">, </span><span style="color:#FFA657">onLevelUp</span><span style="color:#E6EDF3"> }) {</span></span>
<span class="line"><span style="color:#8B949E">  // A heavy computation function that renders the game board</span></span>
<span class="line"><span style="color:#D2A8FF">  renderBoard</span><span style="color:#E6EDF3">(level);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  return</span><span style="color:#E6EDF3"> (</span></span>
<span class="line"><span style="color:#E6EDF3">    &#x3C;</span><span style="color:#7EE787">div</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#E6EDF3">      &#x3C;</span><span style="color:#7EE787">h2</span><span style="color:#E6EDF3">>Current Level: </span><span style="color:#FF7B72">{</span><span style="color:#E6EDF3">level</span><span style="color:#FF7B72">}</span><span style="color:#E6EDF3">&#x3C;/</span><span style="color:#7EE787">h2</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#E6EDF3">      &#x3C;</span><span style="color:#7EE787">button</span><span style="color:#79C0FF"> onClick</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">onLevelUp</span><span style="color:#FF7B72">}</span><span style="color:#E6EDF3">>Collect a gem&#x3C;/</span><span style="color:#7EE787">button</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#E6EDF3">    &#x3C;/</span><span style="color:#7EE787">div</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#E6EDF3">  );</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React, { useState, useCallback } </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> Game</span><span style="color:#E6EDF3">() {</span></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#E6EDF3"> [</span><span style="color:#79C0FF">level</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">setLevel</span><span style="color:#E6EDF3">] </span><span style="color:#FF7B72">=</span><span style="color:#D2A8FF"> useState</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">1</span><span style="color:#E6EDF3">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#79C0FF"> levelUp</span><span style="color:#FF7B72"> =</span><span style="color:#D2A8FF"> useCallback</span><span style="color:#E6EDF3">(() </span><span style="color:#FF7B72">=></span><span style="color:#E6EDF3"> {</span></span>
<span class="line"><span style="color:#D2A8FF">    setLevel</span><span style="color:#E6EDF3">(level </span><span style="color:#FF7B72">+</span><span style="color:#79C0FF"> 1</span><span style="color:#E6EDF3">);</span></span>
<span class="line"><span style="color:#E6EDF3">  }, [level]);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  return</span><span style="color:#E6EDF3"> &#x3C;</span><span style="color:#7EE787">Board</span><span style="color:#79C0FF"> level</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">level</span><span style="color:#FF7B72">}</span><span style="color:#79C0FF"> onLevelUp</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">levelUp</span><span style="color:#FF7B72">}</span><span style="color:#E6EDF3"> />;</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React, { useState } </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> ProductList</span><span style="color:#E6EDF3">({ </span><span style="color:#FFA657">products</span><span style="color:#E6EDF3"> }) {</span></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#E6EDF3"> [</span><span style="color:#79C0FF">filter</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">setFilter</span><span style="color:#E6EDF3">] </span><span style="color:#FF7B72">=</span><span style="color:#D2A8FF"> useState</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">''</span><span style="color:#E6EDF3">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#79C0FF"> filteredProducts</span><span style="color:#FF7B72"> =</span><span style="color:#E6EDF3"> products.</span><span style="color:#D2A8FF">filter</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">product</span><span style="color:#FF7B72"> =></span></span>
<span class="line"><span style="color:#E6EDF3">    product.name.</span><span style="color:#D2A8FF">toLowerCase</span><span style="color:#E6EDF3">().</span><span style="color:#D2A8FF">includes</span><span style="color:#E6EDF3">(filter.</span><span style="color:#D2A8FF">toLowerCase</span><span style="color:#E6EDF3">())</span></span>
<span class="line"><span style="color:#E6EDF3">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  return</span><span style="color:#E6EDF3"> (</span></span>
<span class="line"><span style="color:#E6EDF3">    &#x3C;></span></span>
<span class="line"><span style="color:#E6EDF3">      &#x3C;</span><span style="color:#7EE787">input</span></span>
<span class="line"><span style="color:#79C0FF">        type</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">"text"</span></span>
<span class="line"><span style="color:#79C0FF">        value</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">filter</span><span style="color:#FF7B72">}</span></span>
<span class="line"><span style="color:#79C0FF">        onChange</span><span style="color:#FF7B72">={</span><span style="color:#FFA657">e</span><span style="color:#FF7B72"> =></span><span style="color:#D2A8FF"> setFilter</span><span style="color:#E6EDF3">(e.target.value)</span><span style="color:#FF7B72">}</span></span>
<span class="line"><span style="color:#E6EDF3">      /></span></span>
<span class="line"><span style="color:#E6EDF3">      &#x3C;</span><span style="color:#7EE787">ul</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#FF7B72">        {</span><span style="color:#E6EDF3">filteredProducts.</span><span style="color:#D2A8FF">map</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">product</span><span style="color:#FF7B72"> =></span><span style="color:#E6EDF3"> (</span></span>
<span class="line"><span style="color:#E6EDF3">          &#x3C;</span><span style="color:#7EE787">li</span><span style="color:#79C0FF"> key</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">product.id</span><span style="color:#FF7B72">}</span><span style="color:#E6EDF3">></span><span style="color:#FF7B72">{</span><span style="color:#E6EDF3">product.name</span><span style="color:#FF7B72">}</span><span style="color:#E6EDF3">&#x3C;/</span><span style="color:#7EE787">li</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#E6EDF3">        ))</span><span style="color:#FF7B72">}</span></span>
<span class="line"><span style="color:#E6EDF3">      &#x3C;/</span><span style="color:#7EE787">ul</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#E6EDF3">    &#x3C;/></span></span>
<span class="line"><span style="color:#E6EDF3">  );</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React, { useState, useMemo } </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> ProductList</span><span style="color:#E6EDF3">({ </span><span style="color:#FFA657">products</span><span style="color:#E6EDF3"> }) {</span></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#E6EDF3"> [</span><span style="color:#79C0FF">filter</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">setFilter</span><span style="color:#E6EDF3">] </span><span style="color:#FF7B72">=</span><span style="color:#D2A8FF"> useState</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">''</span><span style="color:#E6EDF3">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#79C0FF"> filteredProducts</span><span style="color:#FF7B72"> =</span><span style="color:#D2A8FF"> useMemo</span><span style="color:#E6EDF3">(() </span><span style="color:#FF7B72">=></span></span>
<span class="line"><span style="color:#E6EDF3">    products.</span><span style="color:#D2A8FF">filter</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">product</span><span style="color:#FF7B72"> =></span></span>
<span class="line"><span style="color:#E6EDF3">      product.name.</span><span style="color:#D2A8FF">toLowerCase</span><span style="color:#E6EDF3">().</span><span style="color:#D2A8FF">includes</span><span style="color:#E6EDF3">(filter.</span><span style="color:#D2A8FF">toLowerCase</span><span style="color:#E6EDF3">())</span></span>
<span class="line"><span style="color:#E6EDF3">    ), [products, filter]);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  return</span><span style="color:#E6EDF3"> (</span></span>
<span class="line"><span style="color:#8B949E">    // ...</span></span>
<span class="line"><span style="color:#E6EDF3">  );</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React, { useState, useCallback } </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> Greeting</span><span style="color:#E6EDF3">() {</span></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#E6EDF3"> [</span><span style="color:#79C0FF">name</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">setName</span><span style="color:#E6EDF3">] </span><span style="color:#FF7B72">=</span><span style="color:#D2A8FF"> useState</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">''</span><span style="color:#E6EDF3">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#79C0FF"> updateName</span><span style="color:#FF7B72"> =</span><span style="color:#D2A8FF"> useCallback</span><span style="color:#E6EDF3">((</span><span style="color:#FFA657">event</span><span style="color:#E6EDF3">) </span><span style="color:#FF7B72">=></span><span style="color:#E6EDF3"> {</span></span>
<span class="line"><span style="color:#D2A8FF">    setName</span><span style="color:#E6EDF3">(event.target.value);</span></span>
<span class="line"><span style="color:#E6EDF3">  }, []);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  return</span><span style="color:#E6EDF3"> (</span></span>
<span class="line"><span style="color:#E6EDF3">    &#x3C;</span><span style="color:#7EE787">input</span></span>
<span class="line"><span style="color:#79C0FF">      type</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">"text"</span></span>
<span class="line"><span style="color:#79C0FF">      value</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">name</span><span style="color:#FF7B72">}</span></span>
<span class="line"><span style="color:#79C0FF">      onChange</span><span style="color:#FF7B72">={</span><span style="color:#E6EDF3">updateName</span><span style="color:#FF7B72">}</span></span>
<span class="line"><span style="color:#E6EDF3">    /></span></span>
<span class="line"><span style="color:#E6EDF3">  );</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React, { useMemo } </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> TotalPrice</span><span style="color:#E6EDF3">({ </span><span style="color:#FFA657">quantity</span><span style="color:#E6EDF3">, </span><span style="color:#FFA657">price</span><span style="color:#E6EDF3"> }) {</span></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#79C0FF"> totalPrice</span><span style="color:#FF7B72"> =</span><span style="color:#D2A8FF"> useMemo</span><span style="color:#E6EDF3">(() </span><span style="color:#FF7B72">=></span><span style="color:#E6EDF3"> quantity </span><span style="color:#FF7B72">*</span><span style="color:#E6EDF3"> price, [quantity, price]);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  return</span><span style="color:#E6EDF3"> (</span></span>
<span class="line"><span style="color:#E6EDF3">    &#x3C;</span><span style="color:#7EE787">h2</span><span style="color:#E6EDF3">>Total Price: </span><span style="color:#FF7B72">{</span><span style="color:#E6EDF3">totalPrice</span><span style="color:#FF7B72">}</span><span style="color:#E6EDF3">&#x3C;/</span><span style="color:#7EE787">h2</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#E6EDF3">  );</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> React </span><span style="color:#FF7B72">from</span><span style="color:#A5D6FF"> 'react'</span><span style="color:#E6EDF3">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> TotalPrice</span><span style="color:#E6EDF3">({ </span><span style="color:#FFA657">quantity</span><span style="color:#E6EDF3">, </span><span style="color:#FFA657">price</span><span style="color:#E6EDF3"> }) {</span></span>
<span class="line"><span style="color:#FF7B72">  const</span><span style="color:#79C0FF"> totalPrice</span><span style="color:#FF7B72"> =</span><span style="color:#E6EDF3"> quantity </span><span style="color:#FF7B72">*</span><span style="color:#E6EDF3"> price;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FF7B72">  return</span><span style="color:#E6EDF3"> (</span></span>
<span class="line"><span style="color:#E6EDF3">    &#x3C;</span><span style="color:#7EE787">h2</span><span style="color:#E6EDF3">>Total Price: </span><span style="color:#FF7B72">{</span><span style="color:#E6EDF3">totalPrice</span><span style="color:#FF7B72">}</span><span style="color:#E6EDF3">&#x3C;/</span><span style="color:#7EE787">h2</span><span style="color:#E6EDF3">></span></span>
<span class="line"><span style="color:#E6EDF3">  );</span></span>
<span class="line"><span style="color:#E6EDF3">}</span></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 classes at the same time for the first t...]]></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 program at Georgia Tech. As someone who is de...]]></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 commit to the OMSCS program (I’ve recentl...]]></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 Revolutio 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 Remote.com), completed another OMSCS class ...]]></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 finished my Cybersecurity class at Georgia T...]]></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 ‘AI, Ethics &#x26; Society’ class for my F...]]></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 &#x26; vision of a certain product under the hood, and that at a first glance could almost appear as the ou...]]></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 journeys. When it comes to JavaScript and its ma...]]></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 src="/.netlify/images?url=https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2xqqmhe5yk14cjv54beg.png&#x26;fm=webp&#x26;w=1200&#x26;q=75" 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 src="/.netlify/images?url=https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd41t3jsuzpsw2o4rkz7o.png&#x26;fm=webp&#x26;w=1200&#x26;q=75" 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 src="/.netlify/images?url=https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgwvxwg0ur663xqp8fqs6.png&#x26;fm=webp&#x26;w=1200&#x26;q=75" 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 src="/.netlify/images?url=https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F1*a8iav3lY5yRhakS6uyuuBw.png&#x26;fm=webp&#x26;w=1200&#x26;q=75" 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 gotta confirm that overall it’s been an en...]]></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[A Day in the Life of a Front-End Engineer at Cloud Academy (When There’s Not a Pandemic) #DevStories Original article published on Cloud Academy. It’s a typical Monday morning, and I am about to get o...]]></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 src="/.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 src="/.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 src="/.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 a class in Human Computer Interaction, a...]]></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 src="/.netlify/images?url=https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Ff9d0cd75-44fd-40eb-a516-db67f20403a9%2F928f5d63-f826-491f-a9f0-e0c6260a6437%2FUntitled.png%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3DASIAZI2LB466XWL3XBMN%252F20260531%252Fus-west-2%252Fs3%252Faws4_request%26X-Amz-Date%3D20260531T135818Z%26X-Amz-Expires%3D3600%26X-Amz-Security-Token%3DIQoJb3JpZ2luX2VjECoaCXVzLXdlc3QtMiJIMEYCIQCErR4Bk9Px2WgGbIHjFlJL4Iy3YCE6jF67FU7KjhSyEQIhAMnxI7ehRbPRs4sr%252Fy5yfSB8ofvraQZXFnJt8SViVmiNKogECPP%252F%252F%252F%252F%252F%252F%252F%252F%252F%252FwEQABoMNjM3NDIzMTgzODA1IgyywFfjRZgWD%252BG%252BI9wq3ANtJGwLeJYOewBH5s%252Fxg377KrKA6cPy0i8dE1cxeRiAYSypPkGgrfLwMLc7X82YPHG052gO16Y4wuolQOYxy%252BF%252BSrrQL6mJJApsnxyTq0Pq6OndvOL7a3qkt3KrldH%252BJprYNEGtFbaKNtIjm%252Bmc3vu4%252FODF5qVmbNaOrJ9oZOa%252Ft0YcJFSsBfCkgq0DimQMd2FvOhU%252BxYBwfZNrlYVPmYjCr92PAounyu%252FSncSb6KQ6RdHVugjfIe%252B2whkgu%252BJd1KAgWj0zbhL0gOMfjZ2%252BUCoS7Gu4fdzAG8sZkSNiZjMi%252BA3UXNBAO%252FYmaxVr9abh%252FHf1B2pjc7WkTDtz7ltSgBbrhfhHm%252B0SqQRO2Bg9E%252B5l%252F%252FdF7jY6gDaxHxwzdIEYV9Cf2KwrAlucrBjcByW2mgtcf0116SxRKX4SFOgUqbCcfl1%252BpvfdJqqqTqaQf3rDnb2YkugA5tQe6y785ImonHprD9QEkjaThLrlC30he6%252FdTAWoRFez7U%252Bu8NQbcLX%252BkvAKMtjRLnw46tHyVERve0k2c8PrjNC7I3nXmjB4rOiH8ybNj606QlkPk9sie5zuRc426Zz3mW5rpHGH5ubRnvqbxYOAl7hUMMQw0VAIuZ3jlCBk3rq7vkV6L%252Bw0kjDYjPDQBjqkATZ3g3mtsjRGRmclRml8Z5ChvMZE%252F2avk4HVP%252FcT%252Fw6%252FNU7vWEIuXc7ler0Rwff%252FFKAEv%252F%252BIrO7nPHasSh6ZX%252F2FM3MhXF%252F8SWS5TqxlOsrJBYKxJxTehJg3xiRoYWToNZ2sc56rluBww%252FqYohvVmNlKRLxEWd9y6vDP7KiDos4EutaPlhLkjqxsrHvefAOar7rp6Zg4iEq0a%252BA65VNGbWSEFGw8%26X-Amz-Signature%3D5b51fa5447f877154b11609c8c19dcf10c4e64a1becd7a9456b1d1ecb60ce3ac%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject&#x26;fm=webp&#x26;w=1200&#x26;q=75" 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 past 12 months, because it’s been so int...]]></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 more in general as an aspiring human being...]]></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[12 incredible Weeks as a UX Designer Intern 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 src="/.netlify/images?url=https%3A%2F%2Fres.cloudinary.com%2Fvale-flyleaf%2Fimage%2Fupload%2Fv1652010412%2FBlog%2Fmailchimp-internship-cover_aouzfl.jpg&#x26;fm=webp&#x26;w=1200&#x26;q=75" 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 while but felt it was the right time to publ...]]></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 risk. Since March of 2016, The Fox Magazi...]]></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 with so many new stories to tell! Those past...]]></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, indeed, the essence of resilience? How could we...]]></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 here we go. A lifetime dream. The perfec...]]></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 these lines right now, because they represe...]]></description>
      <content:encoded><![CDATA[<p><strong>Hey</strong> <em>there</em><strong>!</strong> ✨</p>
<p><img src="/.netlify/images?url=https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Ff9d0cd75-44fd-40eb-a516-db67f20403a9%2F72497e9c-2ba2-4209-acfd-ad6e5a1b374c%2Fhello-world.jpg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3DASIAZI2LB466T33JSJEX%252F20260531%252Fus-west-2%252Fs3%252Faws4_request%26X-Amz-Date%3D20260531T135818Z%26X-Amz-Expires%3D3600%26X-Amz-Security-Token%3DIQoJb3JpZ2luX2VjECoaCXVzLXdlc3QtMiJHMEUCIGkejb5uLpKIg59GzobRqrHUlAjmP5%252FiRC6nobOHswwdAiEA3sYy3nlcDnmNQvLSURyoy6toCGDCSXAt24LEuwmSlEQqiAQI8%252F%252F%252F%252F%252F%252F%252F%252F%252F%252F%252FARAAGgw2Mzc0MjMxODM4MDUiDKVkaS2nDCZCAjp3PyrcAwRCh8IXLzaHDsk%252F26T5rMzbAQyCl6Z%252BQ%252F56Gl5kov%252B0WHRlCUm2HE2YvRDjktjs7bTwLIPEtuNvh5Y5arP4Y13N9O5mMtHv2UdJ3URvMtVU5Et04tsiqNcCX75PgqW9Vta%252FgecvBusGUIMfdXYWzaj3%252BpuHJll71OQYlms%252B02Q2IqTfpSyAeKAV32VYiQrFh7g%252Fgqpm6yhingQri2OGhEiTjTB4%252FPmxf%252BTBUl5V8fnkbVhI%252BWyil2Mem27Z%252F3ruVJ2GMh6HcPyuoltxKYRqR0wyrKKvzM8URipCQQ91br%252FXICQ9ZHtu4LH9%252Fot9ZBliwNMMmh5yT11jio%252FGTAnx1T7FykhX6%252FPQ%252BQ3cKsr4AyecF4vGPCIxeIfkkylXqnH5SdYDluLrVE9NpM8Z6iU%252FWtW50KRETveWdl%252BVcP53CNNCx6eURXdSCCtLhN3V%252FCQmrdsY6NCUhFRaCWv2RhYKZdUFfKk7X2G1myEYSwqF1750WLeNizf6ncnSKJ9kMh1b41ReykjNT6SbtvtUzFgCgo%252Fd3dgrzCZGjDaLKXMEfBpCqSdnPL0sj2z0jS3ScX4bGA%252BlfitcbO4r%252FhBNevHF5d48uROCnUPjFcM%252BO%252FPlYzYHjGNFTiWtwMLzwvPuMNSL8NAGOqUBUbwKmVi2OF%252Bc2A0FVFbVM9kdDlmHV4L08zezpoirPk7T8dPulNHU35EHrQTgQKXbobqhWldJJwiTFfqRVExpJdn5VRYVWSLB3Y3gflUVHgT4FpYKftwCg%252FaiOKBrBnjeRn5uXGGcuxSpmbc5Hl8dGxNoNjAnIoWNDYhDlHsAp%252B3HwXlVHTdMffP67PyfaXOrMkQ2g5DfY8lKzBRXuuaHfMAI94n7%26X-Amz-Signature%3D5c5c32e3d2f0a9cb0e2dd3978ee972bba7b493cbe1dbd56de545c264e5461046%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject&#x26;fm=webp&#x26;w=1200&#x26;q=75" 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[Day 1 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 t...]]></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>