<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://andreipfeiffer.dev</id>
    <title>Andrei Pfeiffer, personal blog</title>
    <updated>2026-01-25T13:53:34.122Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <author>
        <name>Andrei Pfeiffer</name>
        <email>andrei@upsidedown.ro</email>
        <uri>https://twitter.com/pfeiffer_andrei</uri>
    </author>
    <link rel="alternate" href="https://andreipfeiffer.dev"/>
    <link rel="self" href="https://andreipfeiffer.dev/rss/atom.xml"/>
    <subtitle>This blog if focused on technical content related to Front-End technologies and UI development.</subtitle>
    <logo>https://andreipfeiffer.dev/images/logo_black.svg</logo>
    <icon>https://andreipfeiffer.dev/favicon-32x32.png</icon>
    <rights>All rights reserved 2020-2026, Andrei Pfeiffer</rights>
    <entry>
        <title type="html"><![CDATA[Will LLMs evolve with programming languages?]]></title>
        <id>https://andreipfeiffer.dev/blog/2026/llms-and-programming-languages-evolution</id>
        <link href="https://andreipfeiffer.dev/blog/2026/llms-and-programming-languages-evolution"/>
        <updated>2026-01-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Will LLMs learn new language syntax and new standard features, considering that most developers don't manually write code anymore and accept LLM output with the existing training data?]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The complete map of project anatomies]]></title>
        <id>https://andreipfeiffer.dev/blog/2026/project-anatomies</id>
        <link href="https://andreipfeiffer.dev/blog/2026/project-anatomies"/>
        <updated>2026-01-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this blog post we'll analyse hospitals distribution at different scales and see that software projects follow a similar evolution regarding their files and folders anatomy.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist:Part 1: Project setup]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part1-project-setup</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part1-project-setup"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist:Part 2: Coding guidelines]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part2-coding-guidelines</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part2-coding-guidelines"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist:Part 3: Development workflows]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part3-development-workflows</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part3-development-workflows"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist:Part 4: Product requirements]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part4-product-requirements</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part4-product-requirements"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist:Part 5: UI Components library]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part5-ui-components-library</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part5-ui-components-library"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist:Part 6: Data structures]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part6-data-structures</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part6-data-structures"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist:Part 7: Technical decisions]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part7-technical-decisions</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part7-technical-decisions"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The code etymologist:Closing thoughts]]></title>
        <id>https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part8-closing-thoughts</id>
        <link href="https://andreipfeiffer.dev/blog/2025/the-code-etymologist/part8-closing-thoughts"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The code etymologist is a multi-part series that covers typical software knowledge that deserves to be documented and shared within development teams, such as: project setup, coding guidelines, development workflows, product requirements, UI components library, data structures, and technical decisions.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Nullable type narrowing in tests]]></title>
        <id>https://andreipfeiffer.dev/blog/2024/nullable-type-narrowing-in-tests</id>
        <link href="https://andreipfeiffer.dev/blog/2024/nullable-type-narrowing-in-tests"/>
        <updated>2024-08-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Non-trivial integration tests in TypeScript projects might require us to use functions that return Nullable types, especially when asserting side effects. This might force us to use less that ideal solutions such as type assertions or type-check ignoring comments. However, there is much better and elegant solution which we'll explore in detail.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Partial matching test assertions]]></title>
        <id>https://andreipfeiffer.dev/blog/2024/partial-test-assertions</id>
        <link href="https://andreipfeiffer.dev/blog/2024/partial-test-assertions"/>
        <updated>2024-08-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This blog post explores two different approaches to describe partial test assertions: omitting insignificant data and picking only relevant data. Both approaches are useful, but they address different scenarios.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Hash Maps in TypeScript]]></title>
        <id>https://andreipfeiffer.dev/blog/2023/typescript-hashmaps</id>
        <link href="https://andreipfeiffer.dev/blog/2023/typescript-hashmaps"/>
        <updated>2023-11-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this post, we'll explore two different methods to implement Hash Maps with optional items in TypeScript and analyze the member access type safety.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[A decade of testing]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/a-decade-of-testing</id>
        <link href="https://andreipfeiffer.dev/blog/2022/a-decade-of-testing"/>
        <updated>2022-12-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This post describes all the tools and practices I currently use to cover automated functional testing for an entire web application: unit and integration testing, end-to-end system testing, and isolated UI components testing.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Reasons for writing tests]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/reasons-for-writing-tests</id>
        <link href="https://andreipfeiffer.dev/blog/2022/reasons-for-writing-tests"/>
        <updated>2022-10-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Since I'm a big fan of automated testing, I'll describe my personal reasons for writing tests, which took shape during the last decade, writing all kinds of tests with the majority of available frameworks and tools within the JavaScript ecosystem.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Excuses for not writing tests]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/excuses-for-not-writing-tests</id>
        <link href="https://andreipfeiffer.dev/blog/2022/excuses-for-not-writing-tests"/>
        <updated>2022-10-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this post I'll describe the most popular excuses I've heard so far when asking others about the lack of automated tests in their code. As we'll see, most of them are fallacies or unfounded arguments.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fixing long npm installs:Case study]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/fixing-long-npm-installs</id>
        <link href="https://andreipfeiffer.dev/blog/2022/fixing-long-npm-installs"/>
        <updated>2022-07-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this case study, we'll analyze how to detect npm packages with long instalation times, use different techniques for debugging the cause of the problem, and optimize once we understand the issue.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Epilogue]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part9-epilogue</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part9-epilogue"/>
        <updated>2022-06-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Before we conclude this chronicle, let's take a step back, reflect on the journey we had, and synthesize our options to address scalable CSS.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Part 8: Type-safe CSS]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part8-type-safe-css</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part8-type-safe-css"/>
        <updated>2022-06-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Adding TypeScript on top of CSS-in-JS enables safe refactoring and typed interfaces when authoring UI components. Therefore, CSS-in-TypeScript provides the missing puzzle piece when aiming to achieve complete type-safe code.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Part 7: CSS-in-JS]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part7-css-in-js</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part7-css-in-js"/>
        <updated>2022-05-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Moving style definitions to JavaScript files is a novel approach to CSS, resulting in countless benefits, such as explicit dependencies, shared variables, not to mention all the features of styles encapsulation, CSS preprocessors, Atomic CSS, and so much more.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[CSS-in-JS misconceptions]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/css-in-js-misconceptions</id>
        <link href="https://andreipfeiffer.dev/blog/2022/css-in-js-misconceptions"/>
        <updated>2022-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Despite its versatility and potential, CSS-in-JS received a significant kickback from the community. We'll analyze the most recurring misconceptions, shedding some light regarding what CSS-in-JS is, but more importantly, what CSS-in-JS is not.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Part 6: Atomic CSS]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part6-atomic-css</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part6-atomic-css"/>
        <updated>2022-05-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atomic CSS contradicts and breaks all the principles of Semantic CSS. This mindset gave birth to a new generation of frameworks based solely on single-purpose utility classes.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Part 4: Methodologies and Semantics]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part4-methologies-and-semantics</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part4-methologies-and-semantics"/>
        <updated>2022-03-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Most CSS methodologies and architectures are built on top of many good practices that we've previously covered, providing a structured and cohesive set of principles and rules. In this chapter we'll focus on Semantic CSS, encouraged by the HTML5 specification, which most CSS methodologies and frameworks embrace.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Part 3: CSS Processors]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part3-css-processors</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part3-css-processors"/>
        <updated>2022-02-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[There are two types of tools regarding CSS processing that we'll analyze. Preprocessors introduce support for contextual styles, removing most source code duplication. Postprocessors optimize the final CSS output, while also paving the way for future tools that we'll touch upon in later chapters.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Part 2: Good practices]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part2-good-practices</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part2-good-practices"/>
        <updated>2022-02-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Avoiding naming collisions or specificity wars is not a trivial task. Therefore, let's explore in detail several fundamental practices that reached consensus within the development community when talking about scalable and maintainable CSS.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Part 1: CSS scalability issues]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part1-scalability-issues</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part1-scalability-issues"/>
        <updated>2022-02-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Before discussing the solutions to CSS scalability issues, we must understand what these concerns are in the first place. Thus, let's take a look at some of the most concerning problems when talking about long-term CSS maintainability.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution"/>
        <updated>2022-01-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The evolution of scalable CSS is a multi-part chronicle, intended to document the progress of tools and practices that enable us to write maintainable CSS at scale. It covers CSS scalability issues, CSS processors, essential good practices, methodologies, semantic and atomic CSS, styles encapsulation, CSS-in-JS, and type-safe CSS with Typescript.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Isolated Components Driven Development]]></title>
        <id>https://andreipfeiffer.dev/blog/2021/isolated-components-driven-development</id>
        <link href="https://andreipfeiffer.dev/blog/2021/isolated-components-driven-development"/>
        <updated>2021-10-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In unit tests, we execute code in isolation, outside the application. The same approach could be applied to UI components, proving to be a very convenient method during development and debugging. As a bonus, this technique also provides documentation, valuable to all team members working on the project.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The anatomy of React component files]]></title>
        <id>https://andreipfeiffer.dev/blog/2021/react-components-anatomy</id>
        <link href="https://andreipfeiffer.dev/blog/2021/react-components-anatomy"/>
        <updated>2021-09-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This article describes in detail my personal and current approach to defining React component files and the rationale for each decision. It covers function components syntax with TypeScript.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[CSS-in-JS styles output methods]]></title>
        <id>https://andreipfeiffer.dev/blog/2021/css-in-js-styles-output</id>
        <link href="https://andreipfeiffer.dev/blog/2021/css-in-js-styles-output"/>
        <updated>2021-09-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[There are two mutually exclusive methods that CSS-in-JS libraries use to generate and ship styles to the browser: Runtime Stylesheets and Static CSS Extraction. Both methods have benefits and downsides, so let’s analyze them in detail.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developing UIs connected to web APIs]]></title>
        <id>https://andreipfeiffer.dev/blog/2021/developing-uis-connected-to-web-apis</id>
        <link href="https://andreipfeiffer.dev/blog/2021/developing-uis-connected-to-web-apis"/>
        <updated>2021-08-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[As UI developers, we have multiple methods we could use to connect to web APIs during development. We'll explore 3 different approaches, analyzing their strong points and limitations.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Validating our understanding]]></title>
        <id>https://andreipfeiffer.dev/blog/2021/validating-our-understanding</id>
        <link href="https://andreipfeiffer.dev/blog/2021/validating-our-understanding"/>
        <updated>2021-07-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[There is no absolute measurement tool to determine our level of understanding of a particular concept. But there are specific heuristics that we can use to evaluate ourselves.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Complementary learning]]></title>
        <id>https://andreipfeiffer.dev/blog/2021/complementary-learning</id>
        <link href="https://andreipfeiffer.dev/blog/2021/complementary-learning"/>
        <updated>2021-07-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We took some courses, attended a few workshops, read a ton of articles, and probably one or two books too. We have even worked on a couple of personal projects. Ok, what's next?]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Distinguishing between pages and components in Next.js]]></title>
        <id>https://andreipfeiffer.dev/blog/2021/distinguishing-between-pages-and-components-in-next-js</id>
        <link href="https://andreipfeiffer.dev/blog/2021/distinguishing-between-pages-and-components-in-next-js"/>
        <updated>2021-06-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In Next.js we can customize what file extensions should be rendered as pages. This enables us to create components inside the pages folder without generating unneeded routes.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The evolution of scalable CSS:Part 5: Styles Encapsulation]]></title>
        <id>https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part5-styles-encapsulation</id>
        <link href="https://andreipfeiffer.dev/blog/2022/scalable-css-evolution/part5-styles-encapsulation"/>
        <updated>2021-04-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Styles encapsulation and CSS Modules elegantly solve all the CSS naming collisions problems, while keeping specificity low at the same time. These techniques profoundly changed the way we author semantic CSS nowadays and became an industry standard, adopted by all component-based JavaScript frameworks.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Empty objects initialization with TypeScript]]></title>
        <id>https://andreipfeiffer.dev/blog/2020/empty-objects-initialization-with-typescript</id>
        <link href="https://andreipfeiffer.dev/blog/2020/empty-objects-initialization-with-typescript"/>
        <updated>2020-12-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We'll examine multiple methods to initialize empty objects in TypeScript, which is something you'll probably have to deal with in any application that has some form of state management.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tech Debt or Tech Loan?]]></title>
        <id>https://andreipfeiffer.dev/blog/2020/tech-debt-tech-loan</id>
        <link href="https://andreipfeiffer.dev/blog/2020/tech-debt-tech-loan"/>
        <updated>2020-12-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Technical Debt is a trade-off, a choice we make as developers. Sometimes we are (or feel) compelled to make these trade-offs. Sometimes it's our own decision. The fact is we can't always avoid them, so we need to learn how to manage them.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Definition lists with grid layout]]></title>
        <id>https://andreipfeiffer.dev/blog/2020/definition-lists-with-grid-layout</id>
        <link href="https://andreipfeiffer.dev/blog/2020/definition-lists-with-grid-layout"/>
        <updated>2020-11-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this post, we'll examine various implementations for a given layout, using both flex and grid, debating the robustness of each approach. The layout contains a horizontal list of 3 key-value pairs, the values being displayed beneath the labels.]]></summary>
        <author>
            <name>Andrei Pfeiffer</name>
            <email>andrei@upsidedown.ro</email>
            <uri>https://twitter.com/pfeiffer_andrei</uri>
        </author>
    </entry>
</feed>