<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Enrique's life engineering]]></title><description><![CDATA[This is my journal where I write my reflections on the pursuits of building great software products and cultivating a meaningful life. ]]></description><link>https://blog.enriquecastl.info</link><image><url>https://substackcdn.com/image/fetch/$s_!D7OR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452d1a2d-fbc5-47ae-af45-e69542cb6f35_608x608.png</url><title>Enrique&apos;s life engineering</title><link>https://blog.enriquecastl.info</link></image><generator>Substack</generator><lastBuildDate>Wed, 13 May 2026 18:03:09 GMT</lastBuildDate><atom:link href="https://blog.enriquecastl.info/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Enrique Alcantara]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[enriquecastl@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[enriquecastl@substack.com]]></itunes:email><itunes:name><![CDATA[Enrique Alcantara]]></itunes:name></itunes:owner><itunes:author><![CDATA[Enrique Alcantara]]></itunes:author><googleplay:owner><![CDATA[enriquecastl@substack.com]]></googleplay:owner><googleplay:email><![CDATA[enriquecastl@substack.com]]></googleplay:email><googleplay:author><![CDATA[Enrique Alcantara]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Cultivating a product mindset]]></title><description><![CDATA[Why engineers make better decisions when they think like product builders. A guide for engineers evolving from code-first to problem-first thinking.]]></description><link>https://blog.enriquecastl.info/p/cultivating-a-product-mindset</link><guid isPermaLink="false">https://blog.enriquecastl.info/p/cultivating-a-product-mindset</guid><dc:creator><![CDATA[Enrique Alcantara]]></dc:creator><pubDate>Mon, 19 Jan 2026 17:22:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4Fyw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As we advance in our careers, we can benefit from basing our technical decisions on a deep understanding of the problem space and fostering empathy for our users. It&#8217;s likely that in your job, there are product managers, UX researchers, and marketing professionals thinking deeply about these concerns. We can serve as better counterparts and decision-making partners when we also adopt some of the same thinking principles. </p><p>As software engineers, we start our careers driven by our curiosity for computer science and exciting technological innovation happening in our industry. The most beautiful part of developing software is the creative freedom enabled by the absence of physical constraints. In practice,  however, the boundaries of software development are of economical nature. Most of the code that we write serves a business and businesses face time and financial constraints, and competing priorities. These conditions limit the amount of time that we can dedicate to implement an idea and create risks about the cost of maintaining them in the long term.  </p><p>For this reason, we should weigh costs, risks, and benefits of our technical decisions. For example, what are the non obvious maintenance costs of an architectural choice? We should also focus on understanding our users and guiding our limited resources towards features that actually solve their problems. The following sections expand on a few tools that can help us with that.  </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Fyw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Fyw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!4Fyw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!4Fyw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!4Fyw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Fyw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:509074,&quot;alt&quot;:&quot;Diagram that depicts the software development process when cultivating a product mindset. The first figure describes understanding the problem space. An arrow points to using mental models to have a deep understanding of the problem. Finally, we build the product with user empathy in mind.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.enriquecastl.info/i/183642175?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Diagram that depicts the software development process when cultivating a product mindset. The first figure describes understanding the problem space. An arrow points to using mental models to have a deep understanding of the problem. Finally, we build the product with user empathy in mind." title="Diagram that depicts the software development process when cultivating a product mindset. The first figure describes understanding the problem space. An arrow points to using mental models to have a deep understanding of the problem. Finally, we build the product with user empathy in mind." srcset="https://substackcdn.com/image/fetch/$s_!4Fyw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!4Fyw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!4Fyw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!4Fyw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c6ba480-bda5-4dc7-a29e-c876b7829dbd_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Understanding of the problem space</h4><p>A good problem definition describes what we aim to achieve and the hurdles that stand on the way. It helps us simplify solutions but most importantly avoid an incorrect one. Not understanding the problem is costly in any type of creative endeavor. Particularly in the beginning, we have to make decisions that <a href="https://thoughtbot.com/blog/one-way-vs-two-way-door-decisions">are not easily reversible</a>. For example, we could choose the wrong tech stack, design a bad architecture, or implement a feature that nobody needs. </p><p>I find two mental models to be very useful tools to improve our understanding of the problem space : <a href="https://fs.blog/first-principles/">First principles thinking</a> and <a href="https://fs.blog/second-order-thinking/">second order thinking</a>. The former helps us to break down problems into essential and irreducible aspects. The latter helps us to uncover the obscure aspects of a user flow by thinking beyond the immediate consequences of their actions. The following questions turn these principles into practical tools to dissect a problem that we are solving with our software product: </p><ul><li><p>Why does this problem exist in the first place?</p></li><li><p>Are we building this because it&#8217;s genuinely needed, or because &#8220;that&#8217;s how it&#8217;s done&#8221; in this domain?</p></li><li><p>What are the absolute minimum inputs and outputs this system must have?</p></li><li><p>If we were to rebuild this entire domain from scratch with today&#8217;s technology, what would we keep and what would we discard?</p></li><li><p>If we had 10&#215; the budget, would we solve the same problem? If we had 1/10th?</p></li><li><p>What are we implicitly saying &#8220;no&#8221; to by saying &#8220;yes&#8221; to this?</p></li><li><p>What&#8217;s the second-order cost of taking the &#8220;easy&#8221; path now?</p></li></ul><p>Finally, experimentation and quick iteration are good companions to deep thinking but they can&#8217;t replace it. We can always iterate quickly towards the wrong solution. That&#8217;s why it is important to treat problem understanding and solution exploration as two different phases.  </p><h4>User empathy and dogfooding </h4><p>We spend most of our careers working on products that we don&#8217;t need. In some cases, we are lucky enough to work in products that solve a problem for us. Regardless of our current situation, it&#8217;s critical that we either use our own product or dedicate time to understand what our users do, want, think, and feel about it. There are many techniques that helps us refine our understanding of the users&#8217; needs like creating <a href="https://www.interaction-design.org/literature/article/personas-why-and-how-you-should-use-them?srsltid=AfmBOopfqOQOmo-cdKrXZ2L-13LChmTMlEwHo5EUNM1dck77ZGsW9zyN">user personas</a>, writing use case documents, and software stories. </p><p>Using our own product is also a practical way of identifying quality issues and opportunities to improve existing workflows. In the tech industry, we call this practice &#8220;<a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">dogfooding</a>&#8221;. Dogfooding helps us to sharpen our focus and narrow down our efforts to problems that actually affect users. It helps us to learn the language that our users use to talk about their workflows which leads to better communication with product managers and designers. </p><p>These are some of the good and bad practices that I&#8217;ve learned over the years when putting dogfooding in practice: </p><ul><li><p>Identify gaps in the user documentation by identifying missing steps when performing a task with your product. </p></li><li><p>Encourage teammates to dogfood a feature that you are developing by recording a demo of the feature and broadcasting your interest in public channels.</p></li><li><p>Provide a tool to collect feedback in a single knowledge base. Ideally, this tool allows categorizing the feedback by releases and calculate different metrics.</p></li><li><p>Don&#8217;t fall into the trap of believing that our own experience is fully representative of other users which can create a false sense of confidence. </p></li></ul><p>Shifting our mindset from fully technical folks to product-minded engineers helps us amplify our contributions from just building the product to also defining it. As AI-powered tools automate more steps of the software development lifecycle, the industry starts to have expectations from engineers to be able to think about a product end-to-end and wear many hats during the process. Cultivating a product mindset can help us evolve our career in this direction.</p>]]></content:encoded></item><item><title><![CDATA[My AI year in review: Favorite use cases as a software developer in 2025]]></title><description><![CDATA[How agentic AI tools revolutionized my workflow, from generating diagrams to confidently contributing to unfamiliar tech stacks, prototyping projects, and more.]]></description><link>https://blog.enriquecastl.info/p/my-ai-year-in-review-favorite-use</link><guid isPermaLink="false">https://blog.enriquecastl.info/p/my-ai-year-in-review-favorite-use</guid><dc:creator><![CDATA[Enrique Alcantara]]></dc:creator><pubDate>Sun, 28 Dec 2025 14:55:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WtEt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This year, generative and agentic AI tools have become an essential part of my tool-set as a software developer. In 2023 and 2024, AI usage in software development tools exploded with features such as integrated chat panels in popular editors and code completion/generation that appears as the user types changes in a source file. Even though I found those tools <em>occasionally</em> useful, I never felt that they represented a significant shift in my workflow and productivity.</p><p>I started using agentic tools for the first time this year. My introductory tool was <a href="https://cline.bot/">Cline</a>, an open source coding agent that integrates with VS Code as an extension. Cline works by connecting to your preferred model provider service for which you have to provide an API key. After setting up the API key, you prompt the model using chat-style UI, and unlike classic chat tools, Cline can execute CLI tools, edit files, and run tests, based on your commands.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.enriquecastl.info/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Enrique's life engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In the second half of the year, I started using <a href="https://claude.com/product/claude-code">Claude code</a>, which replaces the integrated chat UI with a CLI tool that loosely integrates with your editor of choice. The main advantage of a CLI tool compared to the chat UI is the ability to create more automated and parallel flows. You can have multiple, specialized agents running in parallel as separate terminal processes. I&#8217;m also lucky enough to contribute to the development of agentic tools while working at GitLab. I&#8217;m dog-fooding these tools every day and many of the use cases that I&#8217;ll mention in the sections below happen in the context of these tools.</p><p><em>Generative and Agentic AI tools changed the way that I develop software.</em> I can report bugs and draft ideas quicker. I can communicate complex ideas more clearly generating <a href="https://mermaid.js.org/">Mermaid diagrams</a> and iteratively refining them. I feel more confident and willing to contributing to projects that I don&#8217;t have deep expertise in. And it&#8217;s so fun to explore what&#8217;s possible with technologies that I don&#8217;t know deeply. The following sections expand on each of these use cases. </p><h3>Generating diagrams</h3><p>In a remote workplace, it&#8217;s challenging to replicate the in-person whiteboard sessions where two or more people can sketch diagrams to communicate high level ideas and build a mutual understanding. Even though there are amazing real-time collaboration tools, I usually strive to communicate ideas as clearly as possible in a written format before jumping to a call. When communicating asynchronously via written notes, dedicating time to conveying an idea using a diagram consumes a lot of time. This aspiration raises the bar for what a diagram should be: Choosing the correct type of diagram and making it clear and useful without excess detail becomes more important.</p><p>I&#8217;m a fan of <a href="https://mermaid.js.org/intro/">Mermaid</a>, a JavaScript-based tool that allows creating all sorts of diagrams using a powerful Domain Specific Language:</p><pre><code> graph TD;
    A--&gt;B;
    A--&gt;C;
    B--&gt;D;
    C--&gt;D; </code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cay-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cay-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png 424w, https://substackcdn.com/image/fetch/$s_!cay-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png 848w, https://substackcdn.com/image/fetch/$s_!cay-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png 1272w, https://substackcdn.com/image/fetch/$s_!cay-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cay-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png" width="256" height="312" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:312,&quot;width&quot;:256,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6110,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.enriquecastl.info/i/182406665?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cay-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png 424w, https://substackcdn.com/image/fetch/$s_!cay-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png 848w, https://substackcdn.com/image/fetch/$s_!cay-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png 1272w, https://substackcdn.com/image/fetch/$s_!cay-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94b380-576a-44a5-84ec-d4eaab983a9e_256x312.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Generative AI reduces the time to produce useful diagrams from hours to minutes. Models are quite good at identifying associations, grouping related nodes, and generating color palettes. Exploring what an idea looks like in different types of diagrams is faster than ever. I begin by writing a prompt that describes my idea as a rough diagram, then I refine the model&#8217;s first result. For example, I suggested a team to use Storybook interaction testing framework to write integration tests that rely on user-centered commands and assertions.</p><p>I wanted to convey in a single diagram multiple ideas: How the testing framework interacts with the UI components, that Storybook provides a mock backend that the state management layer connects to, and how these tests fall in the integration test category. The model generated this diagram that I found overly complex:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WtEt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WtEt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png 424w, https://substackcdn.com/image/fetch/$s_!WtEt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png 848w, https://substackcdn.com/image/fetch/$s_!WtEt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png 1272w, https://substackcdn.com/image/fetch/$s_!WtEt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WtEt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png" width="1456" height="1085" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1085,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:279806,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.enriquecastl.info/i/182406665?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WtEt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png 424w, https://substackcdn.com/image/fetch/$s_!WtEt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png 848w, https://substackcdn.com/image/fetch/$s_!WtEt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png 1272w, https://substackcdn.com/image/fetch/$s_!WtEt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83483b84-b825-4055-bb7e-b7e9f2029596_2275x1695.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I send successive prompts to remove what I considered unnecessary elements of the initial proposal and simplify the information flow and associations. The result was a simpler and more focused diagram that conveyed my suggestion precisely. </p><ul><li><p><em>&#8220;Remove the unit tests and e2e tests boxes. Focus the diagram on explaining the integration tests&#8221;.</em></p></li><li><p><em>&#8220;The diagram should only have three groups: Storybook interaction tests, Vue components, State management (Pinia) -&gt; mocked message bus&#8221;.</em></p></li><li><p><em>&#8220;The Pinia store connects to the mocked message bus, not the opposite.&#8221;</em></p></li><li><p><em>&#8220;Storybook mocks the message bus and the vue components use the Pinia store&#8221;</em></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-3OA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-3OA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png 424w, https://substackcdn.com/image/fetch/$s_!-3OA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png 848w, https://substackcdn.com/image/fetch/$s_!-3OA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png 1272w, https://substackcdn.com/image/fetch/$s_!-3OA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-3OA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png" width="1456" height="1085" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1085,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:182677,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.enriquecastl.info/i/182406665?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-3OA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png 424w, https://substackcdn.com/image/fetch/$s_!-3OA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png 848w, https://substackcdn.com/image/fetch/$s_!-3OA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png 1272w, https://substackcdn.com/image/fetch/$s_!-3OA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d2b144-ea9d-457c-8e9f-c0ba3be41612_2275x1695.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Brainstorming and flattening the learning curve with agentic tools</h3><p>My job demands me to learn quickly, adapt, and stretch beyond my current skillet. Agentic AI tools represent a game changer to my productivity because they speed up my process of on-boarding or starting new projects. They also help me realize what&#8217;s possible by generating prototypes from ideas that rely on tools that I would have to learn in detail before I can write a line of code.</p><p>I think that AI Agentic tools are specially powerful in the hands of experienced developers. I can translate heuristics and best practices that I&#8217;ve learned in one tech stack to another. Modern programming languages share similar design paradigms like functional programming, OOP, etc. And software design best practices such as loose-coupling/high cohesion, DRY, and are applicable to most projects. AI agentic tools help me to onboard quickly into the specific implementation details of a tech stack while my experience and understanding of functional/technical requirements guide my requests to agents. Code review of teammates that are subject matter experts serve guardrails to ensure that my contributions conform with idioms and project-specific conventions. </p><div class="poll-embed" data-attrs="{&quot;id&quot;:424605}" data-component-name="PollToDOM"></div><p>For example, this year, we had to set up an e2e testing framework to test a <a href="https://langserver.org/">Language Server</a> in the web browser. Language servers run in a web worker for several reasons such as creating a sandboxed execution context (when loading the worker on a separate origin) and to prevent expensive operations from blocking the web browser&#8217;s main UI thread. We wanted to test web workers in a headless browser rather than using an environment that emulates web browser APIs such as JSDOM. </p><p>Agentic tools allowed me to develop three prototypes using several combinations of test runners and libraries in a single working day. Making a decision is much easier when we can uncover as many unknowns as possible. In the past, we have to time-box these exploration phase due to the usual time and resource constraints that affect software development projects. </p><p>Agentic tools have the potential of flattening the learning curve for contributing to a project without lowering the quality bar. To strike this balance, we should rely on a well known software development practices such as a strong code review process, continuous refactoring, and automating quality checks using test coverage tools, code linters, security scanners, etc. </p><h3>2026</h3><p>Next year, I want to scale my usage AI agents by executing them in parallel, learning how to create agents tailored for specific use cases, and automating complete flows. My usage of agents so far has involved significant supervision on my part by breaking down requirements into smaller tasks, providing feedback for every proposal, etc. I want to move away from this workflow and give agents more complex requirements that require longer periods of focus. </p><p>One area that I find very exciting is the evolution of agentic AI for accessibility and e2e testing. For example, <a href="https://playwright.dev/docs/release-notes#playwright-test-agents">Playwright 1.56</a> includes agent definitions for test planning, generation, and most importantly healing.  The other area that I want to explore is automating the resolution of breaking changes when updating dependencies to major versions. This kind of maintenance work is crucial for the health of a project, however, it has historically represented a big cost for teams because of the amount of busywork involved. </p><p>When it comes to AI, every year feels different. The big players in the AI industry make seismic moves that transform the way we use these tools. I&#8217;m looking forward to all the new developments 2026 and how they will reshape my day-to-day work. </p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.enriquecastl.info/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Enrique's life engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[About trust and how to build it]]></title><description><![CDATA[Navigating the Balance Between Personal Agency and Connection in Relationships]]></description><link>https://blog.enriquecastl.info/p/about-trust-and-how-to-build-it</link><guid isPermaLink="false">https://blog.enriquecastl.info/p/about-trust-and-how-to-build-it</guid><dc:creator><![CDATA[Enrique Alcantara]]></dc:creator><pubDate>Tue, 29 Apr 2025 20:54:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452d1a2d-fbc5-47ae-af45-e69542cb6f35_608x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've been thinking about trust lately&#8212;how it's both essential and elusive. Trust is one of the fundamental building blocks of modern society. Many systems we rely on, like banking, government, and mail services, are built on implicit trust. These systems operate with well-established, transparent rules and counterbalances that help create immediate trust. Breaking these rules carries clear consequences.</p><p>Building trust becomes more challenging in personal relationships. Unlike formal systems, our personal relationships lack clear rules, and the consequences of our actions often remain unclear. Yet trust is even more vital in these relationships since they profoundly shape our daily lives. In this essay, I'll explore the behaviors that either build or erode trust in these personal connections. I think that most of these behaviors arise in the conflict between trust and agency.</p><h3>Trust vs agency</h3><p>In all human relationships formed with the purpose of achieving a goal, there are two forces at play in every interaction: Trust and agency. Trust provides individuals the assurance that members of their group shared some values, respect a common set of rules, and work towards one or more common goals. Agency is the capacity of an individual to make decisions on their own and pursue interests unique to them with confidence and security.</p><p>Trust promotes collaboration while agency serves individual interests. When individuals in the same group are pursuing conflicting interests, their agency can erode trust. Lack of trust, in turn, leads to dysfunctional behaviors such as withholding information, hindering the ability of others to achieve their interests, or just falling into avoidance. This negative feedback loop ends up hindering collaboration in the group.</p><p>For example, let&#8217;s say that a couple is planning to purchase their first home. A real estate investment is one of the most important and challenging decisions that two people can make together. We trust that the person that we decided to spent our lives with will have our backs financially. We also expect that our preferences will align with our partner&#8217;s in a way that makes the buying process smooth and happy.</p><p>In reality, your better half might be more of a city animal while you lean more towards the suburbia life style with backyard and an automobile included. Also, you both could have different levels of risk tolerance which leads them to desire properties with a wild price range difference. These conflicting perspectives often lead to the dysfunctional behaviors that I described before because we will defend our agency to choose the home of our dreams. We can try to avoid these traps by guiding our actions with values that protect or even develop trust in relationships.</p><h3>Building trust</h3><p>These are personal values that have helped me to develop or repair trust in my relationships.</p><p><strong>Respect the agency of others.</strong> We should make other people feel that we respect their opinions and decisions even if we disagree with them or they end up making a mistake. Sharing a long term journey with anybody means that they will make many mistakes along the way. If mistakes are unavoidable, what is the point of creating a environment where people feel guilty about them? A better path is helping others to identify the cause of their mistakes and finding possible remediation.</p><p><strong>Be honest.</strong> Specially, when your truth will lead to conflict and disagreement. Staying truthful to your beliefs is a strong source of self respect and confidence. It&#8217;s also a sign of respect for others because we give them the opportunity to decide whether to stick with us or not based on our true selves. Fear of conflict leads people to lie. We are afraid that conflict will deteriorate or even break our relationships. However, the fatal blow is usually the discovery of a long held lie or our incapacity to drag it for longer and exploding as a result.</p><p><strong>Assume positive intention</strong>. Give other people the benefit of the doubt that you give to yourself when you&#8217;ve made a mistake. This is very challenging because we usually don&#8217;t have the full picture of what led someone else to behave in one way or the other. Even so, this lack of context should become the reason to see others in a better light rather than judging them. We can approach other people&#8217;s mistakes with curiosity and explore the path that led them to their outcomes.</p><h3>Conclusion</h3><p>As I&#8217;m writing this essay, I can&#8217;t escape the reminder of the countless times I&#8217;ve failed to act based on the principles that I described. This essay serves me as a place to come back and remember the person that I aspire to be, not the person that I always am. Humanity has prospered due to its extraordinary capacity of working together. Nevertheless, we never lost the tribal and competition instincts that pull us apart. Building trust requires fighting deeply rooted behaviors that we&#8217;ve inherited to survive in harsh environments. It is a worthy struggle because our lives feel lighter when we can trust the people that form an integral part of it.</p>]]></content:encoded></item></channel></rss>