<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Valerio Francescangeli</title><link>https://v19i.com/posts/</link><description>Recent content in Posts on Valerio Francescangeli</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Thu, 12 Feb 2026 10:31:47 +0200</lastBuildDate><atom:link href="https://v19i.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>On using AI Agents: get the best out of them by thinking first</title><link>https://v19i.com/posts/on-using-ai-agents/</link><pubDate>Thu, 12 Feb 2026 10:31:47 +0200</pubDate><guid>https://v19i.com/posts/on-using-ai-agents/</guid><description>&lt;h1 id="on-using-ai-agents-get-the-best-out-of-them-by-thinking-first"&gt;On using AI Agents: get the best out of them by thinking first&lt;/h1&gt;
&lt;p&gt;Over the past months, I’ve had more than 3,000 conversations with Claude Code and Codex. I have analysed them and extracted the patterns I used. Here, I’ll describe my approach to getting the most out of AI Agents for software development.&lt;/p&gt;
&lt;p&gt;When working with AI, I tend to go all in or not bother at all. I don’t like the tab-autocomplete style. I prefer to have an AI Agent that works with me and helps me think through and produce the right solution. But before coding a solution, researching and thinking are essential parts of a solid engineering approach.&lt;/p&gt;</description></item><item><title>Managing Node.js versions with asdf</title><link>https://v19i.com/posts/managing-nodejs-versions-with-asdf/</link><pubDate>Sat, 17 May 2025 10:04:23 +0100</pubDate><guid>https://v19i.com/posts/managing-nodejs-versions-with-asdf/</guid><description>&lt;h1 id="managing-nodejs-versions-with-asdf"&gt;Managing Node.js versions with asdf&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://asdf-vm.com"&gt;asdf&lt;/a&gt; is a runtime version manager that allows you to install multiple programming languages. Its main advantage over the others is that it has a plugin system that will enable it to support various languages, including Ruby, Elixir and Python.&lt;/p&gt;
&lt;h2 id="installation-on-macos-zsh"&gt;Installation on macOS (Zsh)&lt;/h2&gt;
&lt;h3 id="1-make-sure-homebrew-is-installed"&gt;1. Make sure Homebrew is installed&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/bin/bash -c &amp;#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2-install-asdf"&gt;2. Install asdf&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;brew install asdf
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="3-configure-shell"&gt;3. Configure Shell&lt;/h3&gt;
&lt;p&gt;Add these two lines to your .zshrc file.&lt;/p&gt;</description></item><item><title>GraphQL: Publish the Schema of Your Company, Not Your Api</title><link>https://v19i.com/posts/graphql-publish-the-schema-of-your-company-not-your-api/</link><pubDate>Fri, 16 Jun 2023 10:40:08 +0100</pubDate><guid>https://v19i.com/posts/graphql-publish-the-schema-of-your-company-not-your-api/</guid><description>&lt;h1 id="graphql-publish-the-schema-of-your-company-not-your-api"&gt;GraphQL: Publish the Schema of Your Company, Not Your Api&lt;/h1&gt;
&lt;p&gt;GraphQL is an interesting technology that promises better developer and user experience, but its usefulness can be misinterpreted as an overall better technology than what came before it.&lt;/p&gt;
&lt;p&gt;To best utilise it, a specific organisation approach must be used. GraphQL works best when the whole organisation shares the same domain conventions. Domain Driven Design shines in a GraphQL environment, but it requires a lot of effort to change a company’s mentality and embrace it.&lt;/p&gt;</description></item><item><title>A More Consistent Future for the Web</title><link>https://v19i.com/posts/a-more-consistent-future-for-the-web/</link><pubDate>Fri, 19 May 2023 14:42:51 +0100</pubDate><guid>https://v19i.com/posts/a-more-consistent-future-for-the-web/</guid><description>&lt;h1 id="a-more-consistent-future-for-the-web"&gt;A More Consistent Future for the Web&lt;/h1&gt;
&lt;p&gt;Last week at Google I/O 2023, a new initiative was presented: the Web Platform Baseline.&lt;/p&gt;
&lt;h2 id="what-is-it"&gt;What is it?&lt;/h2&gt;
&lt;p&gt;It is a multi-company effort from the newly formed Web Developer Experience Group, also known as the WebDX Community Group, that wants to improve the developer experience by providing a unified set of same-to-use features.&lt;/p&gt;
&lt;p&gt;Any feature in the Baseline is guaranteed to work without critical bugs in all major browsers’ previous and current versions: Chrome, Edge, Firefox and Safari.&lt;/p&gt;</description></item><item><title>Exploring Technical Tests in the Software Industry</title><link>https://v19i.com/posts/exploring-technical-tests-in-the-software-industry/</link><pubDate>Thu, 11 May 2023 11:04:15 +0100</pubDate><guid>https://v19i.com/posts/exploring-technical-tests-in-the-software-industry/</guid><description>&lt;h1 id="exploring-technical-tests-in-the-software-industry"&gt;Exploring Technical Tests in the Software Industry&lt;/h1&gt;
&lt;p&gt;Technical tests are a staple of the tech industry interview process; they are used to assess the candidate’s communication, knowledge and problem-solving skills. This article will delve into the most commonly used ones.&lt;/p&gt;
&lt;h2 id="take-home-assignment"&gt;Take Home Assignment&lt;/h2&gt;
&lt;p&gt;This type renounces on interaction and communication skills, which will have to be measured in a follow-up session, to allow for a longer time allowance to solve a problem. The advantage of this style is the ability to create a more complex set of requirements, allowing the candidate to choose where to focus their time and solve only part of them. If your company has an API third parties can use, consider using it in your tech test to create a test that will showcase your company’s tech offering. It will give you an edge in creating a personalised tech test, allowing the candidate to get comfortable with the domain. You can use it to ask them questions about your documentation, what they liked about it and the API itself, and see how they have integrated it into their software design.&lt;/p&gt;</description></item><item><title>On Hiring Software Engineers</title><link>https://v19i.com/posts/on-hiring-software-engineers/</link><pubDate>Fri, 05 May 2023 13:22:00 +0100</pubDate><guid>https://v19i.com/posts/on-hiring-software-engineers/</guid><description>&lt;h1 id="on-hiring-software-engineers"&gt;On Hiring Software Engineers&lt;/h1&gt;
&lt;p&gt;In the past few years, the tech industry has seen a significant shift in hiring practices, with many companies attempting to replicate the FAANG method without fully understanding the context or requirements. This has led to a complicated and inefficient hiring process that often wastes both the company&amp;rsquo;s and the candidates&amp;rsquo; time.&lt;/p&gt;
&lt;p&gt;This blog post will discuss how to create a healthy hiring process.&lt;/p&gt;
&lt;h2 id="creating-a-customised-hiring-process"&gt;Creating a customised hiring process&lt;/h2&gt;
&lt;p&gt;Each company has different requirements for their tech team. Don’t blindly follow what another big company does for their hiring strategy since the difference in culture and preparation could lead to many false-negatives.&lt;/p&gt;</description></item><item><title>Single and Multi Purposed Software</title><link>https://v19i.com/posts/single-and-multi-purposed-software/</link><pubDate>Thu, 27 Apr 2023 09:13:11 +0100</pubDate><guid>https://v19i.com/posts/single-and-multi-purposed-software/</guid><description>&lt;h1 id="single-and-multi-purposed-software"&gt;Single and multi-purposed software&lt;/h1&gt;
&lt;p&gt;There are two types of software, the ones with a specific focus (single-purpose) and the ones with multiple functionalities (multi-purpose).&lt;/p&gt;
&lt;h2 id="single-purpose-software"&gt;Single-purpose software&lt;/h2&gt;
&lt;p&gt;Single-purpose software, also known as focused or task-oriented software, is created specifically to get a single job done. The ideal workflow allows the user to quickly open the app, complete their task and get on with their day.&lt;/p&gt;
&lt;h4 id="examples"&gt;Examples&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Currency converter&lt;/li&gt;
&lt;li&gt;Room booking&lt;/li&gt;
&lt;li&gt;Translator&lt;/li&gt;
&lt;li&gt;Video player&lt;/li&gt;
&lt;li&gt;Simple text editor (TextEdit and Notepad).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="characteristics-of-single-purpose-software"&gt;Characteristics of single-purpose software&lt;/h3&gt;
&lt;p&gt;To create a piece of software that adheres to this category, start by defining a clear goal. The scope has to be explainable in a couple of sentences.&lt;/p&gt;</description></item><item><title>React Pattern: Compound Component</title><link>https://v19i.com/posts/react-pattern-compound-component/</link><pubDate>Wed, 08 Mar 2023 13:03:35 +0000</pubDate><guid>https://v19i.com/posts/react-pattern-compound-component/</guid><description>&lt;h1 id="react-pattern-compound-component"&gt;React Pattern: Compound Component&lt;/h1&gt;
&lt;p&gt;When creating custom UI components in React, an easy to evolve and implement solution is to add more props to an element to describe what to show on screen and what functions to call. It enables us to create a lot with a low level of abstraction and is usually a good choice.&lt;/p&gt;
&lt;p&gt;One problem arises when creating a component used by a third party or another team (like in a component library). In this case, we would like to provide a more customisable approach to give more UI freedom to the developers.&lt;/p&gt;</description></item><item><title>On Test Driven Development</title><link>https://v19i.com/posts/on-test-driven-development/</link><pubDate>Wed, 08 Jun 2022 09:27:27 +0100</pubDate><guid>https://v19i.com/posts/on-test-driven-development/</guid><description>&lt;h1 id="on-test-driven-development"&gt;On Test-driven development&lt;/h1&gt;
&lt;p&gt;Test-driven development is a technique at the basis of Agile software development and is, in my view, the most important contributing factor to creating high-quality results.&lt;/p&gt;
&lt;p&gt;The primary goal of Test-driven development (TDD) is to force a quick feedback loop that forces you to write in small steps.&lt;/p&gt;
&lt;p&gt;TDD imposes writing first a test for a code that hasn&amp;rsquo;t been written yet and then writing enough code to make it produce the desired output and nothing more.&lt;/p&gt;</description></item><item><title>Use The Platform: URL API</title><link>https://v19i.com/posts/use-the-platform-url-api/</link><pubDate>Fri, 07 May 2021 09:23:51 +0100</pubDate><guid>https://v19i.com/posts/use-the-platform-url-api/</guid><description>&lt;h1 id="use-the-platform-url-api"&gt;Use The Platform: URL API&lt;/h1&gt;
&lt;p&gt;Modern web JavaScript provides an intuitive and feature-rich interface to parse, create and edit URLs info.&lt;/p&gt;
&lt;p&gt;This page illustrates only the parts that I use the most; for the full spec, have a look at &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/URL"&gt;&lt;code&gt;URL&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams"&gt;&lt;code&gt;URLSearchParams&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="create-a-url"&gt;Create a URL&lt;/h2&gt;
&lt;p&gt;A URL is created by instantiating a new URL instance:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;const url = new URL(&amp;#34;https://v19i.com&amp;#34;);
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="manage-search-params"&gt;Manage search params&lt;/h2&gt;
&lt;p&gt;The created object provides an easy interface to add, edit and remove search params; it behaves similarly to &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map"&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Lines in Four Directions by Sol Lewitt</title><link>https://v19i.com/posts/lines-in-four-directions-by-sol-lewitt/</link><pubDate>Mon, 18 Jan 2021 16:58:12 +0000</pubDate><guid>https://v19i.com/posts/lines-in-four-directions-by-sol-lewitt/</guid><description>&lt;style&gt;
 :root {
 --border-width: 2rem;
 --border-internal: 1rem;
 --square-size: 42rem
 }

 .outer {
 display: grid;
 grid-template-rows: repeat(2, 17rem);
 grid-template-columns: repeat(2, 17rem);;
 padding: var(--border-width);
 border: var(--border-width) solid var(--text);
 width: var(--square-size);
 margin: 0 auto;
 }
 @media (prefers-color-scheme: dark) {
 .outer {
 border-color: var(--text);
 }
 }

 .top-left, .top-right , .bottom-left, .bottom-right {
 border-color: var(--text);
 border-style: solid;
 }
 @media (prefers-color-scheme: dark) {
 .top-left, .top-right , .bottom-left, .bottom-right {
 border-color: var(--text);
 }
 }

 .top-left {
 display: flex;
 border-width: var(--border-width) var(--border-internal) var(--border-internal) var(--border-width);
 }

 .top-right {
 border-width: var(--border-width) var(--border-width) var(--border-internal) var(--border-internal);
 }

 .bottom-left {
 border-width: var(--border-internal) var(--border-internal) var(--border-width) var(--border-width);
 overflow: hidden;
 }

 .bottom-right {
 border-width: var(--border-internal) var(--border-width) var(--border-width) var(--border-internal);
 overflow: hidden;
 }

 .box {
 width: 100%;
 height: 100%;
 }

 .top-left-rotation {
 transform: rotate(90deg);
 }

 .bottom-left-rotation {
 transform: rotate(-45deg);
 }

 .bottom-right-rotation {
 transform: rotate(45deg);
 }

 .bottom-left-container {
 transform: translateY(-4rem) translateX(-4rem);
 width: 22rem;
 }

 .bottom-right-container {
 transform: translateY(-4rem) translateX(-4rem);
 width: 22rem;
 }

 .black {
 background-color: var(--text);
 }
 @media (prefers-color-scheme: dark) {
 .black {
 background-color: var(--text);
 }
 }

 .white {
 background-color: transparent;
 }

 .bar {
 padding: 0;
 margin: 0;
 width: 100%;
 height: var(--border-width);
 }
&lt;/style&gt;
&lt;br&gt;
&lt;div class="outer"&gt;
 &lt;div class="top-left"&gt;
 &lt;div class="top-left-rotation box"&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="top-right"&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="bottom-left"&gt;
 &lt;div class="bottom-left-rotation box"&gt;
 &lt;div class="bottom-left-container"&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="bottom-right"&gt;
 &lt;div class="bottom-right-rotation box"&gt;
 &lt;div class="bottom-right-container"&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;div class="bar black"&gt;&lt;/div&gt;
 &lt;div class="bar white"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
 Lines In Four Directions by Sol Lewitt
&lt;/p&gt;</description></item><item><title>On Agile software development</title><link>https://v19i.com/posts/on-agile-software-development/</link><pubDate>Mon, 10 Feb 2020 10:01:00 +0000</pubDate><guid>https://v19i.com/posts/on-agile-software-development/</guid><description>&lt;h1 id="on-agile-software-development"&gt;On Agile software development&lt;/h1&gt;
&lt;h2 id="an-often-distorted-view"&gt;An often distorted view&lt;/h2&gt;
&lt;p&gt;In the past year, I’ve run many interviews for project-manager and engineering roles. One common thing I’ve noticed is that the industry’s idea of what Agile means, is incredibly varied, going from something that is waterfall under a different name, to a style that requires specific “Agile roles” in a team.&lt;/p&gt;
&lt;p&gt;In this post, I’ll go through what the initial idea of Agile was, and what it should be; hopefully, this will help people realise how far from the original purpose they’ve steered.&lt;/p&gt;</description></item></channel></rss>