<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Juan Rueda</title>
    <description>The latest articles on Forem by Juan Rueda (@pepefeliblu).</description>
    <link>https://forem.com/pepefeliblu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F57269%2F063760da-d2b1-4c62-9d47-f568e1cf646f.jpeg</url>
      <title>Forem: Juan Rueda</title>
      <link>https://forem.com/pepefeliblu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pepefeliblu"/>
    <language>en</language>
    <item>
      <title>Agile Is Not About Speed</title>
      <dc:creator>Juan Rueda</dc:creator>
      <pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate>
      <link>https://forem.com/pepefeliblu/agile-is-not-about-speed-19ol</link>
      <guid>https://forem.com/pepefeliblu/agile-is-not-about-speed-19ol</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qaw9rlu45f0nh1kgczl.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qaw9rlu45f0nh1kgczl.webp" alt="Agile beyond speed" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Speed without direction is just chaos with a deadline.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Along my professional journey, I've come to realize that many people confuse what Agile and Scrum actually mean. It is not about speed, or delivering ultra fast. It is about being resilient to change and delivering value constantly.&lt;/p&gt;

&lt;p&gt;I've sat through countless meetings where a manager says "we need to be more agile" and what they really mean is "we need to ship faster." That's not agile. That's just pressure with a trendy label.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Agile Actually Means (And What It Doesn't)
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://agilemanifesto.org/" rel="noopener noreferrer"&gt;Agile Manifesto&lt;/a&gt; was never a productivity hack. Read it. It says nothing about velocity charts, burndown metrics, or cramming more story points into a sprint. Its actual goal is to bridge the gap between technical and non-technical stakeholders, deliver real value to users, and most importantly, be able to shift gears when the world changes under your feet.&lt;/p&gt;

&lt;p&gt;Here's the thing: when agile is applied &lt;em&gt;well&lt;/em&gt;, teams do deliver faster. But that's a side effect, not the goal. It's like exercise. You don't run to sweat. You run to get healthy, and sweating just happens along the way. Teams that genuinely embrace agile can orchestrate changes across large codebases without the usual delays and miscommunication. Not because they're rushing, but because they've removed the friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ceremonies Nobody Wants (But Everyone Needs)
&lt;/h2&gt;

&lt;p&gt;Let's be honest. Nobody wakes up excited about a daily standup. Sprint planning can feel like pulling teeth. Retros sometimes devolve into polite silence or complaint sessions.&lt;/p&gt;

&lt;p&gt;But here's what those ceremonies actually do: they build synergy. And I don't mean that in the corporate-buzzword way. I mean that a team that talks every day, that plans together, that closes a sprint and reflects on what happened, develops a shared rhythm. They start anticipating each other. They know who's blocked before they ask. They course-correct in days instead of months.&lt;/p&gt;

&lt;p&gt;The alternative? Feature branches that drift for weeks, a "big reveal" at the end of a quarter that nobody asked for, and the classic "but I thought &lt;em&gt;you&lt;/em&gt; were handling that" conversation.&lt;/p&gt;

&lt;p&gt;I'll take the standup, thanks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trunk-Based Development: One Truth, Many Hands
&lt;/h2&gt;

&lt;p&gt;Speaking of tools that make agile actually work, &lt;a href="https://trunkbaseddevelopment.com/" rel="noopener noreferrer"&gt;trunk-based development&lt;/a&gt; is one of the most underrated. The idea is simple: everyone works against a single source of truth. No long-lived feature branches. No merge request that sits open for two weeks collecting cobwebs.&lt;/p&gt;

&lt;p&gt;If conflicts arise, they surface early and get tackled in small increments. Compare that to the alternative: three developers working in parallel on branches for a month, then spending an entire Friday playing merge-conflict whack-a-mole right before a deploy. We've all been there. It's not fun.&lt;/p&gt;

&lt;p&gt;Trunk-based development doesn't eliminate conflict. It makes conflict &lt;em&gt;manageable&lt;/em&gt;. And that's a very different thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automate Everything You Don't Want to Screw Up
&lt;/h2&gt;

&lt;p&gt;Here's a paradox I love: manual testing is done by humans to ensure quality, and yet humans are &lt;em&gt;terrible&lt;/em&gt; at repetitive quality checks. We get bored. We skip steps. We convince ourselves "I already checked that, it's fine." Then production breaks at 2 AM.&lt;/p&gt;

&lt;p&gt;Automating your deployment and release process removes the human error from the equation. But automation isn't just about CI/CD pipelines. It's about &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" rel="noopener noreferrer"&gt;automated tests&lt;/a&gt; that run every single time, without fatigue, without shortcuts, without "I'll write the tests later" (spoiler: later never comes).&lt;/p&gt;

&lt;p&gt;Automated tests are a safety net. They don't guarantee you won't fall, but they guarantee the fall won't kill you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test-Driven Development: Writing Code With Intent
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://martinfowler.com/bliki/TestDrivenDevelopment.html" rel="noopener noreferrer"&gt;Test-Driven Development&lt;/a&gt; takes this a step further. You write the test &lt;em&gt;before&lt;/em&gt; the code. Sounds backwards? It's actually the opposite. You're forced to think about &lt;em&gt;what&lt;/em&gt; the code needs to do before you think about &lt;em&gt;how&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That single shift changes everything. You stop over-engineering. You stop building features nobody asked for. You write exactly what's needed and nothing more. Pair that with &lt;a href="https://martinfowler.com/bliki/BroadStackTest.html" rel="noopener noreferrer"&gt;end-to-end testing&lt;/a&gt;, and you get a layered verification system where unit tests handle the details and E2E tests handle the flow.&lt;/p&gt;

&lt;p&gt;The result? Cleaner code, fewer bugs, and the confidence to refactor without breaking things. When the test comes first, the design follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain-Driven Design: Speaking the Same Language
&lt;/h2&gt;

&lt;p&gt;All of these practices, agile ceremonies, trunk-based development, automated testing, TDD, they work even better when wrapped in a &lt;a href="https://martinfowler.com/bliki/DomainDrivenDesign.html" rel="noopener noreferrer"&gt;Domain-Driven Design&lt;/a&gt; approach.&lt;/p&gt;

&lt;p&gt;DDD is one of those concepts that sounds academic until you live through the problem it solves. I've been in rooms where the backend team calls something an "Order," the frontend calls it a "Request," and the product owner calls it a "Transaction." Same thing, three names, endless confusion. DDD fixes that by establishing a shared language, a &lt;a href="https://martinfowler.com/bliki/UbiquitousLanguage.html" rel="noopener noreferrer"&gt;Ubiquitous Language&lt;/a&gt;, so that when someone says "Order," every person in the room pictures the same thing.&lt;/p&gt;

&lt;p&gt;Beyond naming, DDD helps you draw clear boundaries between services. Changes in billing don't ripple into shipping. Each domain owns its logic. It's not just good architecture. It's organizational sanity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Era: Agents, Prompts, and the Developer's New Role
&lt;/h2&gt;

&lt;p&gt;And then there's the elephant in the room. In the era of AI, new paradigms are emerging. Agent-driven development is reshaping what it means to be a developer. The human has become more of a manager and auditor of the software. In extreme cases, developers have turned into prompt architects, feeding direction to swarms of agents that do the heavy lifting.&lt;/p&gt;

&lt;p&gt;I find this fascinating and slightly terrifying in equal measure.&lt;/p&gt;

&lt;p&gt;But here's my take: this doesn't diminish the value of engineering fundamentals. If anything, it amplifies them. An agent that writes code without agile principles, without tests, without clear domain boundaries? That's not productivity. That's chaos at scale. The principles we've been discussing aren't made obsolete by AI. They become the &lt;em&gt;guardrails&lt;/em&gt; that keep AI-generated code from going off the rails.&lt;/p&gt;

&lt;p&gt;The developer who understands TDD, DDD, and trunk-based development will guide agents to produce maintainable software. The one who doesn't will just produce more technical debt, faster.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The best methodology is the one that keeps you moving forward, not the one that keeps you busy.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agile</category>
      <category>softwareengineering</category>
      <category>tdd</category>
      <category>ddd</category>
    </item>
    <item>
      <title>Simple vs Complex: When to Level Up Your Solutions</title>
      <dc:creator>Juan Rueda</dc:creator>
      <pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate>
      <link>https://forem.com/pepefeliblu/simple-vs-complex-when-to-level-up-your-solutions-29ja</link>
      <guid>https://forem.com/pepefeliblu/simple-vs-complex-when-to-level-up-your-solutions-29ja</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxs2tjgfdn6owzimhh5j.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxs2tjgfdn6owzimhh5j.webp" alt="Complexity vs Simplicity" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Complexity is like salt, essential in the right amount, but ruinous if you pour the whole shaker.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I recently came across a dev commentary that sparked an interesting discussion about solution complexity. The scenario involved implementing an internal feature to convert natural language into &lt;a href="https://en.wikipedia.org/wiki/SQL" rel="noopener noreferrer"&gt;SQL&lt;/a&gt; queries. A tenured engineer (with what you might call a god-like complex, pun intended) suggested building a complex &lt;a href="https://en.wikipedia.org/wiki/Retrieval-augmented_generation" rel="noopener noreferrer"&gt;RAG&lt;/a&gt; system in-house. The alternative? A simpler approach: connect &lt;a href="https://en.wikipedia.org/wiki/ChatGPT" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Claude_(language_model)" rel="noopener noreferrer"&gt;Claude&lt;/a&gt; to a read-only database and teach users basic prompting techniques to generate the queries they need.&lt;/p&gt;

&lt;p&gt;Both solutions work. But that's not really the question, is it? The real question is: &lt;strong&gt;which solution makes sense for your constraints, your scale, and your team?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Cost-Effectiveness Lens
&lt;/h2&gt;

&lt;p&gt;I believe we need to weigh cost-effectiveness and necessity before jumping to either extreme. Let me share a personal example that illustrates this principle perfectly.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Unicode Book Name Problem
&lt;/h3&gt;

&lt;p&gt;In our book catalogue system (names changed to protect the innocent), we encountered an issue with special non-ASCII characters in book names. The problem stemmed from using &lt;code&gt;VARCHAR&lt;/code&gt; for the name field in our &lt;a href="https://learn.microsoft.com/en-us/sql/t-sql/language-reference" rel="noopener noreferrer"&gt;T-SQL&lt;/a&gt; schema, which can't properly handle &lt;a href="https://en.wikipedia.org/wiki/Unicode" rel="noopener noreferrer"&gt;Unicode&lt;/a&gt; characters.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;correct solution from the start&lt;/strong&gt; would have been using &lt;a href="https://learn.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql" rel="noopener noreferrer"&gt;&lt;code&gt;NVARCHAR&lt;/code&gt;&lt;/a&gt; to support Unicode. But that comes with a cost: double the storage size for that field. It's a tradeoff that should have been made during initial design, but hindsight is 20/20.&lt;/p&gt;

&lt;p&gt;That only solves half our problem anyway. We have existing books with malformed characters. The book masters want us to strip these characters out (yes, this will create some weird names temporarily, but there's a post-processing strategy to fix them later, bear with me).&lt;/p&gt;
&lt;h3&gt;
  
  
  Iteration 1: The Naive Approach
&lt;/h3&gt;

&lt;p&gt;The simplest solution? A straightforward UPDATE statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE Library.Books
SET Name = Library.cleanBookNameFn(Name)
WHERE Library.cleanBookNameFn(Name) != Name

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple enough. If our cleaning function produces a different result, update the name. But this is inefficient. We're invoking the function &lt;strong&gt;twice per row&lt;/strong&gt; , doubling our processing cost and locking the table longer than necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Iteration 2: Table Variables
&lt;/h3&gt;

&lt;p&gt;An improvement would be using a &lt;a href="https://learn.microsoft.com/en-us/sql/t-sql/data-types/table-transact-sql" rel="noopener noreferrer"&gt;table variable&lt;/a&gt; to separate the computation from the update:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Retrieve all books with dirty names
DECLARE @BooksWithDirtyNames TABLE (IdBook INT, CleanName VARCHAR(MAX))
INSERT INTO @BooksWithDirtyNames (IdBook, CleanName)
SELECT IdBook, Library.cleanBookNameFn(Name) as CleanName
FROM Library.Books WITH (NOLOCK)

-- Update book names in a single sweep
UPDATE Library.Books
SET Name = new.CleanName
FROM Library.Books b
INNER JOIN @BooksWithDirtyNames new ON b.IdBook = new.IdBook

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better. We're still calling the function for each affected row, but we're not locking the table during computation, only during the update. This assumes no users are actively updating book names with special characters (an edge case we can probably ignore).&lt;/p&gt;

&lt;p&gt;This performs reasonably well for tables with up to a hundred thousand books, especially during off-peak hours. Even then, it might take 10+ minutes to complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But what about larger tables?&lt;/strong&gt; What if you have hundreds of thousands (or millions) of records in a highly concurrent table that's central to your business logic? Suddenly, this "simple" solution becomes inefficient and unviable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Iteration 3: Batched Processing with Temp Tables
&lt;/h3&gt;

&lt;p&gt;When simple reaches its limits, it's time to be more resourceful. For backfills on huge, highly concurrent tables, we need a different strategy: &lt;a href="https://www.mssqltips.com/sqlservertip/5636/optimize-large-sql-server-insert-update-and-delete-processes-by-using-batches/" rel="noopener noreferrer"&gt;batch processing with temporary tables&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Ensure the temporary table doesn't exist
DROP TABLE IF EXISTS #BooksWithDirtyNames

CREATE TABLE #BooksWithDirtyNames (
    IdBook INT PRIMARY KEY,
    CleanName VARCHAR(9000), -- Using MAX may be overkill
    Cleaned BIT DEFAULT 0 
);

INSERT INTO #BooksWithDirtyNames (IdBook, CleanName)
SELECT IdBook, Library.cleanBookNameFn(Name) as CleanName
FROM Library.Books
WHERE Library.cleanBookNameFn(Name) != Name

DECLARE @WindowSize INT = 2000; -- Fine-tune for optimal performance
DECLARE @CleanedRows INT = 1;
DECLARE @CleanedTotal INT = 0;

WHILE @CleanedRows &amp;gt; 0
BEGIN
    UPDATE TOP (@WindowSize) book WITH (ROWLOCK) -- Row-level locking prevents inconsistencies
    SET Name = new.CleanName
    FROM Library.Books book
    INNER JOIN #BooksWithDirtyNames new ON book.IdBook = new.IdBook
    WHERE new.Cleaned = 0;

    SET @CleanedRows = @@ROWCOUNT; -- Iterate until nothing left to update
    SET @CleanedTotal = @CleanedTotal + @CleanedRows 

    UPDATE TOP (@WindowSize) new
    SET Cleaned = 1
    FROM #BooksWithDirtyNames new
    WHERE Cleaned = 0;

    IF @CleanedRows &amp;gt; 0
        WAITFOR DELAY '00:00:00.100' -- Small delay allows other transactions to proceed
END

PRINT 'Total records updated: ' + CAST(@CleanedTotal AS VARCHAR(20));

DROP TABLE #BooksWithDirtyNames

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, this is definitively more complex. But we gain significant advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance control&lt;/strong&gt; : We can fine-tune the window size for optimal throughput&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal disruption&lt;/strong&gt; : We don't lock a crucial table for extended periods&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility&lt;/strong&gt; : We can run this during business hours if needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt; : We can track progress and adjust on the fly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Principle: Iterate Deliberately
&lt;/h2&gt;

&lt;p&gt;There's no universal "rule of thumb" or "one size fits all" solution. But I do believe in &lt;strong&gt;systematic analysis and strategic iteration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's my approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start small and simple&lt;/strong&gt; - Implement the most straightforward solution first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze the impact&lt;/strong&gt; - Measure performance, identify bottlenecks, observe real-world behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand the constraints&lt;/strong&gt; - Consider scale, concurrency, business requirements, and team capacity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Have a clear goal&lt;/strong&gt; - Know what "good enough" and "excellent" look like for your use case&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate deliberately&lt;/strong&gt; - Add complexity only when simpler approaches demonstrably fail&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This way, solutions unfold organically and, most importantly, &lt;strong&gt;logically and understandably&lt;/strong&gt;. You're following a process others can understand and replicate, dramatically reducing the "WTF per minute" metric (assuming we document clearly).&lt;/p&gt;

&lt;h2&gt;
  
  
  Back to the RAG vs API Question
&lt;/h2&gt;

&lt;p&gt;Returning to the original natural language to SQL scenario: maybe the simple API integration handles 90% of use cases perfectly. Maybe the complex RAG system is needed for security, offline operation, or specialized domain knowledge. The point isn't which is inherently better. It's understanding your specific context well enough to make an informed choice.&lt;/p&gt;

&lt;p&gt;And sometimes, like with our book name cleanup, you start simple and discover you need to level up. That's not failure. That's engineering.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Complexity is a tax you pay every time you touch the code. Make sure the purchase is worth it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>complexity</category>
      <category>engineering</category>
      <category>sql</category>
    </item>
    <item>
      <title>From Startup CTO to Enterprise Tech Lead: What I Learned About Leadership</title>
      <dc:creator>Juan Rueda</dc:creator>
      <pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate>
      <link>https://forem.com/pepefeliblu/from-startup-cto-to-enterprise-tech-lead-what-i-learned-about-leadership-1p7k</link>
      <guid>https://forem.com/pepefeliblu/from-startup-cto-to-enterprise-tech-lead-what-i-learned-about-leadership-1p7k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fck86e94zpw2ziko0wdvx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fck86e94zpw2ziko0wdvx.webp" alt="A developer staring at a calendar instead of code" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sometimes you have to trade the compiler for a calendar.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I used to think I was a &lt;a href="https://en.wikipedia.org/wiki/Chief_technology_officer" rel="noopener noreferrer"&gt;CTO&lt;/a&gt;. In my previous role at a small startup, I designed the entire application architecture from scratch, managed backend and database design, handled &lt;a href="https://en.wikipedia.org/wiki/DevOps" rel="noopener noreferrer"&gt;DevOps&lt;/a&gt;, and orchestrated our APIs. I was a one-man army who eventually mentored a growing team of frontend developers working on our complex 3D product design tool. I was strict about code style, made all the tough technical decisions, and people came to me when they hit walls.&lt;/p&gt;

&lt;p&gt;But as I gained experience, I realized something: I wasn't a CTO. I was a &lt;a href="https://en.wikipedia.org/wiki/Technical_lead" rel="noopener noreferrer"&gt;Tech Lead&lt;/a&gt;. And that distinction taught me one of the most important lessons of my career.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Illusion of Technical Excellence
&lt;/h2&gt;

&lt;p&gt;We started with no roadmap, just a goal and my technical vision. I vested myself as CTO because, well, someone had to. I mentored engineers from zero background to full-fledged developers, pushing them beyond their comfort zones while maximizing their strengths. When they became capable enough, I learned to trust them with critical work.&lt;/p&gt;

&lt;p&gt;We grew tremendously as individuals and professionals. But the project? Not so much.&lt;/p&gt;

&lt;p&gt;That's when the hard truth hit me: &lt;strong&gt;&lt;a href="https://amplitude.com/blog/why-outcomes-over-outputs" rel="noopener noreferrer"&gt;code alone doesn't make a product&lt;/a&gt;&lt;/strong&gt;. You can write beautiful software, follow every best practice, ship relentlessly, but if there's no real value being delivered, the software is effectively dead. The solution matters more than the code.&lt;/p&gt;

&lt;p&gt;We didn't have a tech bottleneck. We had a management problem.&lt;/p&gt;

&lt;p&gt;I left because it became a burden, like a toxic relationship where I'd invested everything but received little in return. Sure, they kept the code, but I built it, and they can't take that talent. They miss me for that. The only consolation: I never stopped trying to improve myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Different Kind of Challenge
&lt;/h2&gt;

&lt;p&gt;Now I work for a big company with a massive software ecosystem. The contrast couldn't be starker.&lt;/p&gt;

&lt;p&gt;Before, I called all the shots and held the master key to everything. Now, even when I have brilliant database optimizations with tremendous positive impact, I need to convince &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Database_administrator" rel="noopener noreferrer"&gt;DBAs&lt;/a&gt;&lt;/strong&gt; it's the right call. I need to dance through processes and arrangements just to gain access to critical systems. &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Principle_of_least_privilege" rel="noopener noreferrer"&gt;Minimum privilege access&lt;/a&gt;&lt;/strong&gt;. Yay!&lt;/p&gt;

&lt;p&gt;It's frustrating at first. Going from architect of everything to needing permission for routine tasks feels like a demotion.&lt;/p&gt;

&lt;p&gt;But here's what I discovered: &lt;strong&gt;once a Tech Lead, always a Tech Lead.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Leadership Without Authority
&lt;/h2&gt;

&lt;p&gt;In less than six months, I've moved between teams, had two manager changes, and experienced constant organizational shifts. Change is the only constant. Yet somehow, I've managed to make an impact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I learn fast and stay ahead of the curve.&lt;/li&gt;
&lt;li&gt;I unblock QA when they need fixes so features ship on time.&lt;/li&gt;
&lt;li&gt;I provide genuine feedback to peers because I truly value their work.&lt;/li&gt;
&lt;li&gt;I focus on results and being helpful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm no longer the mastermind behind everything. Honestly, I feel clueless sometimes. But I do my research, I constantly learn, and I prove myself through outcomes.&lt;/p&gt;

&lt;p&gt;Now they want me to become a Technical Leader/Owner. After less than six months. While I'm still learning the business domain and internal workings. They appreciate how I tackle problems, and my manager sees me as an asset who helps achieve team goals, not as a responsibility to manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Leadership Actually Means
&lt;/h2&gt;

&lt;p&gt;Some people think being a leader means being a boss, telling others what to do and how to do it.&lt;/p&gt;

&lt;p&gt;That's not leadership.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A leader paves the way and shows how things get done. A leader provides insight and listens to feedback.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In &lt;strong&gt;&lt;a href="https://www.sally.io/blog/war-room-meetings" rel="noopener noreferrer"&gt;war room discussions&lt;/a&gt;&lt;/strong&gt; or architectural design meetings, I barely talk. I let my peers lead the conversation because they're confident and have strong input. I trust them, and I want to learn how they approach problems. When I do speak up, it's to ask follow-up questions or &lt;strong&gt;&lt;a href="https://handbook.gitlab.com/handbook/values/#disagree-and-commit" rel="noopener noreferrer"&gt;respectfully disagree&lt;/a&gt;&lt;/strong&gt; when needed, not to justify my position or hijack the meeting.&lt;/p&gt;

&lt;p&gt;A leader isn't obligated to dominate every discussion. A leader is entitled to disagree, &lt;a href="https://www.ccl.org/articles/leading-effectively-articles/coaching-others-use-active-listening-skills/" rel="noopener noreferrer"&gt;ask questions&lt;/a&gt;, and broaden the scope so the team makes informed decisions together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons for Aspiring Leaders
&lt;/h2&gt;

&lt;p&gt;I'm still learning, and I have a long way to go. But I'm surrounded by smart, capable peers who teach me something new every day. If I had to share what I've learned so far:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be proactive.&lt;/strong&gt; Ask any doubts you have. Don't be scared to sound silly or disagree with something that doesn't convince you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't wait for others.&lt;/strong&gt; Instead of relying on your manager to reach out to the client for input, ask the client directly. First-hand insight is invaluable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be methodical.&lt;/strong&gt; Develop rituals in your routine that help you tackle daily goals, which accumulate into weekly and monthly progress, which impact your long-term objectives. Don't lose focus of yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Know your role.&lt;/strong&gt; A leader isn't someone who knows all the answers. A leader is someone willing to find them and provide solutions. And when they're not the ideal person to solve a problem, they make sure to find the right person who can.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;True leadership isn't measured by the code you write, but by the engineers you grow.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>leadership</category>
      <category>careergrowth</category>
      <category>engineeringmanagemen</category>
      <category>startup</category>
    </item>
    <item>
      <title>Why I Keep My Kids Away From Screens (Even Though I Work in Tech)</title>
      <dc:creator>Juan Rueda</dc:creator>
      <pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate>
      <link>https://forem.com/pepefeliblu/why-i-keep-my-kids-away-from-screens-even-though-i-work-in-tech-2aop</link>
      <guid>https://forem.com/pepefeliblu/why-i-keep-my-kids-away-from-screens-even-though-i-work-in-tech-2aop</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftis6lh0nvlty644k8jf5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftis6lh0nvlty644k8jf5.webp" alt="Child playing with wooden blocks" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sometimes the best firewall is a physical one, made of wooden blocks and pure imagination.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Next week, my youngest turns one. My oldest is eight. As a father who spends over eight hours a day staring at screens for work, I've made a choice that surprises many people: I deliberately keep my children away from tablets, smartphones, and the digital noise that dominates modern childhood.&lt;/p&gt;

&lt;p&gt;This isn't technophobia. This is informed caution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Paradox of the Digital Worker
&lt;/h2&gt;

&lt;p&gt;I live in code. I architect systems. I debug, deploy, and iterate. Yet when I need to truly retain information, in a meeting, during a critical discussion, I reach for something analog: a real notebook and a pen.&lt;/p&gt;

&lt;p&gt;There's something about the physical act of writing that creates a different kind of engagement. My hand moves, my brain processes in real time, acting as a throughput for information rather than a passive receiver. The connection between listening, thinking, and writing forces focus in a way that typing on a keyboard never quite achieves. I retain more. I understand deeper.&lt;/p&gt;

&lt;p&gt;If I, someone who builds digital systems for a living, need to step away from screens to think clearly, what does that tell us about developing minds?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Nintendo Switch Principle
&lt;/h2&gt;

&lt;p&gt;My eight-year-old doesn't own a laptop or smartphone. He has a &lt;a href="https://en.wikipedia.org/wiki/Nintendo_Switch" rel="noopener noreferrer"&gt;Nintendo Switch&lt;/a&gt;, and I love it for one specific reason: it's &lt;em&gt;just&lt;/em&gt; a gaming device. No Spotify. No Google. No real internet access. No infinite scroll of content designed by engagement engineers to hijack attention.&lt;/p&gt;

&lt;p&gt;When it's meal time, he turns it off. When he's ready to play again, he turns it on and resumes exactly where he left off. No lost progress. No notifications pulling him back in. No algorithms learning his preferences to serve him "just one more" video.&lt;/p&gt;

&lt;p&gt;I still remember my mother's frustration when I was a kid, unable to understand that some games couldn't be paused. He's too young for online multiplayer, but the principle stands: we've designed a boundary around gaming that keeps it contained, intentional, and controllable.&lt;/p&gt;

&lt;p&gt;And the beautiful thing? He handles time away from screens marvelously. He plays with his toys, makes up elaborate stories, builds worlds from his imagination. His creativity isn't depleted; it thrives.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Really Stealing
&lt;/h2&gt;

&lt;p&gt;I've seen children his age who own smartphones, who play &lt;a href="https://en.wikipedia.org/wiki/Roblox" rel="noopener noreferrer"&gt;Roblox&lt;/a&gt; (which I genuinely believe is a &lt;a href="https://www.theguardian.com/games/2025/nov/18/roblox-facial-age-estimation-children-adults-chats-blocked" rel="noopener noreferrer"&gt;pedophile's playground&lt;/a&gt;), who lack any sense of imagination. It breaks my heart because I know what's been stolen from them, not maliciously, but carelessly.&lt;/p&gt;

&lt;p&gt;Their parents didn't set out to harm them. They wanted to buy themselves some peace, some "quality time" without the constant demands of engaged parenting. And I get it. Parenting is exhausting. But the trade-off is devastating.&lt;/p&gt;

&lt;p&gt;Yes, those kids are "tech savvy." They can navigate apps better than my son can navigate a computer login screen. He still depends on us to open his school assignments. He struggles with digital tasks that his peers breeze through.&lt;/p&gt;

&lt;p&gt;But I'm not in a hurry.&lt;/p&gt;

&lt;p&gt;He'll have &lt;em&gt;decades&lt;/em&gt; to become fluent in digital interfaces. He'll learn when he's developmentally ready, when he can communicate assertively, when he actually needs a phone for safety or coordination. And even then, it won't be a smartphone, it'll be a basic device with &lt;a href="https://en.wikipedia.org/wiki/Snake_(video_game_genre)" rel="noopener noreferrer"&gt;Snake&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Breakout_(video_game)" rel="noopener noreferrer"&gt;Brick Breaker&lt;/a&gt;, something that serves a purpose without becoming a portal to infinite distraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Infra Engineer Who Won't Smart-Home
&lt;/h2&gt;

&lt;p&gt;There's an old saying in tech: true infrastructure engineers don't have smart homes. They've seen behind the curtain. They know the vulnerabilities, the data collection, the attack surfaces. They understand that the convenience isn't free, it's financed by surveillance, by vendor lock-in, by security risks that most consumers never consider.&lt;/p&gt;

&lt;p&gt;I apply the same logic to childhood screen exposure. I know enough to know that the risks outweigh the benefits. The price we pay for that "freemium" childhood is far higher than most parents realize: depleted attention spans, reduced frustration tolerance, algorithmic manipulation, privacy invasion, and the slow erosion of the skills that make us human.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Humans, Not Users
&lt;/h2&gt;

&lt;p&gt;I'm not protecting my children from technology. I'm protecting their humanity.&lt;/p&gt;

&lt;p&gt;I'm giving them the gift of boredom, which is the birthplace of creativity. I'm teaching them frustration tolerance by not letting them skip past every moment of difficulty with a dopamine hit. I'm preserving their ability to engage with the physical world, to "touch grass," to develop the deep focus that will become increasingly rare as AI handles more of our cognitive load.&lt;/p&gt;

&lt;p&gt;These aren't just soft skills. These are survival skills for an uncertain future.&lt;/p&gt;

&lt;p&gt;While their peers may grow up dependent on &lt;a href="https://arxiv.org/abs/2506.08872v1" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt; to decide what to eat for breakfast, my children will have something more valuable: the ability to think critically, to create from nothing, to adapt to changing circumstances, and to maintain their agency in a world designed to extract it.&lt;/p&gt;

&lt;p&gt;When the time comes for them to engage with technology, and it will come, they'll do so from a position of strength. They'll have the cognitive tools to use technology rather than be used by it. They'll have imaginations that weren't outsourced to algorithm-driven content. They'll have experienced enough of reality to know when the digital world is failing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Long Game
&lt;/h2&gt;

&lt;p&gt;This approach isn't easy. My son struggles with online school assignments while his classmates don't. We have to be more present, more engaged, less able to use screens as a babysitter. We get judged by other parents who think we're overprotective or unrealistic.&lt;/p&gt;

&lt;p&gt;But next week, when my youngest turns one and we celebrate another year of protecting their childhood, I'll know we made the right choice.&lt;/p&gt;

&lt;p&gt;Because in a world where everyone is optimizing for convenience, we're optimizing for humanity.&lt;/p&gt;

&lt;p&gt;And that's a bet I'm willing to make.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;In a world of infinite digital input, the most radical act of rebellion is to remain beautifully, inefficiently analog.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>mentalhealth</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>The Mechanical Turk Redux: Why Your AI Assistant Carries a Wand</title>
      <dc:creator>Juan Rueda</dc:creator>
      <pubDate>Fri, 19 Dec 2025 00:00:00 +0000</pubDate>
      <link>https://forem.com/pepefeliblu/the-mechanical-turk-redux-why-your-ai-assistant-carries-a-wand-15k9</link>
      <guid>https://forem.com/pepefeliblu/the-mechanical-turk-redux-why-your-ai-assistant-carries-a-wand-15k9</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3puw9md7y3kz5klqscqg.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3puw9md7y3kz5klqscqg.webp" alt="The Mechanical Turk" width="800" height="436"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The original black box algorithm: A human hidden inside a machine.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The other day, I stumbled upon a thought-provoking post that asked a seemingly whimsical question: Why do so many AI tools dress themselves up with wands, crystal balls, and mystical imagery? The answer, it turns out, takes us back to one of history's most elaborate illusions, the &lt;a href="https://en.wikipedia.org/wiki/Mechanical_Turk" rel="noopener noreferrer"&gt;Mechanical Turk&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Original Illusion
&lt;/h2&gt;

&lt;p&gt;For over 80 years, the Mechanical Turk toured the world, challenging chess masters and dignitaries alike. It defeated &lt;a href="https://en.wikipedia.org/wiki/Benjamin_Franklin" rel="noopener noreferrer"&gt;Benjamin Franklin&lt;/a&gt;. It beat &lt;a href="https://en.wikipedia.org/wiki/Napoleon" rel="noopener noreferrer"&gt;Napoleon Bonaparte&lt;/a&gt;. This automaton, dressed in Ottoman robes and sitting behind an ornate cabinet, appeared to be the world's first thinking machine, a genuine artificial intelligence before electricity was even properly harnessed.&lt;/p&gt;

&lt;p&gt;Except it was all a hoax. Hidden inside that elaborate cabinet was a human chess master, operating the mechanical arms through a clever system of levers and magnets. The Turk wasn't artificial intelligence at all. It was artificial &lt;em&gt;artificiality&lt;/em&gt;, an illusion wrapped in gears and showmanship.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modern Illusion
&lt;/h2&gt;

&lt;p&gt;Today's &lt;a href="https://www.ibm.com/topics/large-language-models" rel="noopener noreferrer"&gt;Large Language Models&lt;/a&gt; are, in many ways, our generation's Mechanical Turk. Don't get me wrong, they're remarkable technological achievements. But they're not the "real AI" that science fiction promised us. They're extraordinarily sophisticated text prediction machines, pre-trained on massive datasets and frozen in time at the moment of their training.&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable truth: LLMs don't learn. They don't get smarter through experience. When GPT-5 or Claude 5 arrives, it won't be because the previous model evolved. It will be because engineers trained an entirely new model from scratch on new data.&lt;/p&gt;

&lt;p&gt;And that's where things get interesting, and a bit terrifying.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Model Decay Problem
&lt;/h2&gt;

&lt;p&gt;We're rapidly approaching a crisis point. As AI-generated content floods the internet, we risk training future models on content created by previous models. It's like making a photocopy of a photocopy of a photocopy. Each generation loses fidelity. Each iteration risks amplifying the biases, hallucinations, and artifacts of its predecessors.&lt;/p&gt;

&lt;p&gt;This phenomenon, sometimes called "&lt;a href="https://www.nature.com/articles/d41586-024-02355-z" rel="noopener noreferrer"&gt;model collapse&lt;/a&gt;" or "model decay," threatens the very foundation of how we improve these systems. The internet, once a vast library of human knowledge and creativity, increasingly resembles a hall of mirrors reflecting AI-generated content back at itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Illusion of Intelligence
&lt;/h2&gt;

&lt;p&gt;LLMs are brilliant mimics. They can write poetry, debug code, explain quantum physics, and even simulate empathy. But it's crucial to understand what they &lt;em&gt;are&lt;/em&gt;: pattern-matching engines operating at incomprehensible scale and speed. They have no intuition, no genuine reasoning, no understanding in any meaningful sense.&lt;/p&gt;

&lt;p&gt;Yet their capabilities are undeniable. They process information faster than any human ever could. They can synthesize information across domains in milliseconds. They're becoming so pervasive that we're approaching a future where computing intelligence is truly ubiquitous. Embedded in our environments, available everywhere and at all times.&lt;/p&gt;

&lt;p&gt;Soon, even your milk carton might have more computing power than the Apollo missions (and yes, it might tell you when you're out of milk before you know it yourself).&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Be Fooled by the Automaton
&lt;/h2&gt;

&lt;p&gt;This is why developing a certain kind of literacy, let's call it "AI skepticism", is more critical than ever. We need to see through the illusion, to understand the Mechanical Turk for what it is: impressive mechanics, not genuine intelligence.&lt;/p&gt;

&lt;p&gt;The mystical imagery, the wands, the crystal balls, the magical branding, isn't accidental. It's the modern equivalent of the Turk's Ottoman robes and ornate cabinet: theatrical dressing designed to make the technology feel more capable, more mysterious, more &lt;em&gt;intelligent&lt;/em&gt; than it actually is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes Us Human
&lt;/h2&gt;

&lt;p&gt;In this AI-saturated future, our uniquely human capabilities become not just valuable, but essential:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical thinking&lt;/strong&gt; : The ability to question outputs, to probe for weaknesses, to ask "does this actually make sense?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deduction&lt;/strong&gt; : The capacity to reason from first principles, to spot logical fallacies that pattern-matching might miss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intuition&lt;/strong&gt; : That ineffable "&lt;a href="https://hbr.org/2015/04/when-its-safe-to-rely-on-intuition-and-when-its-not" rel="noopener noreferrer"&gt;gut feeling&lt;/a&gt;" that something is off, even when the surface looks perfect. The kind of knowing that comes from lived experience, not statistical correlations.&lt;/p&gt;

&lt;p&gt;No machine will possess true intuition until we figure out how to give them actual guts. And I mean that both literally and figuratively (though I'm not holding my breath for biological AI anytime soon).&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving Forward
&lt;/h2&gt;

&lt;p&gt;I'm not arguing that LLMs are useless. Far from it. They're powerful tools that can augment human capability in remarkable ways. But they are &lt;em&gt;tools&lt;/em&gt;, not colleagues. They are sophisticated instruments, not thinking beings.&lt;/p&gt;

&lt;p&gt;The danger isn't that these systems are too intelligent. It's that we might mistake their fluent outputs for genuine understanding. That we might defer to their certainty when we should be exercising skepticism. That we might let our own critical faculties atrophy because it's easier to ask an AI than to think through a problem ourselves.&lt;/p&gt;

&lt;p&gt;The Mechanical Turk fooled audiences for 80 years. Let's not let history repeat itself.&lt;/p&gt;

&lt;p&gt;As we hurtle toward a future of ubiquitous intelligence, real or simulated, our greatest asset isn't the AI in our pocket. It's the messy, intuitive, gloriously imperfect intelligence between our ears.&lt;/p&gt;

&lt;p&gt;Don't let the wand and crystal ball fool you. There's still a person hiding in that cabinet. It's just that now, the person is you, and you're the one who needs to stay sharp.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;In a world of artificial illusions, reality is the only magic that matters.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>ux</category>
    </item>
    <item>
      <title>The Pragmatist's Dilemma: When 'Wrong' Solutions Work Better</title>
      <dc:creator>Juan Rueda</dc:creator>
      <pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate>
      <link>https://forem.com/pepefeliblu/the-pragmatists-dilemma-when-wrong-solutions-work-better-4mca</link>
      <guid>https://forem.com/pepefeliblu/the-pragmatists-dilemma-when-wrong-solutions-work-better-4mca</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a2vyr7cs4jmsu21svep.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a2vyr7cs4jmsu21svep.webp" alt="Pragmatism vs Purism" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sometimes the crooked path is the only one that leads home.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There's a certain satisfaction in doing things "the right way." We read the &lt;a href="https://www.ietf.org/standards/rfcs/" rel="noopener noreferrer"&gt;RFCs&lt;/a&gt;, we follow the best practices, we architect our systems according to well-established patterns. But sometimes, in the trenches of real-world development, you encounter solutions that make you pause and think: "Wait, that's not how you're supposed to do that... but it actually makes sense."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Base64 Revelation
&lt;/h2&gt;

&lt;p&gt;I recently stumbled upon something in our company's web platform that challenged my assumptions about file uploads. Instead of the standard &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" rel="noopener noreferrer"&gt;&lt;code&gt;multipart/form-data&lt;/code&gt;&lt;/a&gt; approach we all learned to use (probably with &lt;a href="https://www.npmjs.com/package/multer" rel="noopener noreferrer"&gt;multer&lt;/a&gt; or similar libraries), our custom API requires files to be converted to &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Base64" rel="noopener noreferrer"&gt;base64 strings&lt;/a&gt; and embedded directly in JSON payloads.&lt;/p&gt;

&lt;p&gt;My first reaction was textbook: "That's inefficient! Base64 encoding bloats the file size by approximately 33%." And I'm not wrong about that. A 1MB file becomes 1.33MB when base64-encoded. On paper, this is wasteful, especially at scale.&lt;/p&gt;

&lt;p&gt;But here's the thing: it works beautifully for our use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Benefits of "Inefficiency"
&lt;/h2&gt;

&lt;p&gt;When you step back from the theoretical overhead, some practical advantages emerge:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplicity in testing.&lt;/strong&gt; No need to wrestle with multipart forms in your API client. Every request is just JSON. You can test endpoints with a simple &lt;code&gt;curl&lt;/code&gt; command or any basic HTTP client. The friction disappears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistent serialization.&lt;/strong&gt; Your entire request body follows the same structure and validation patterns. No special handling for file parts versus data parts. The mental model is cleaner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Easier debugging.&lt;/strong&gt; JSON is human-readable. You can log entire requests, inspect them in browser dev tools, and understand exactly what's being sent without specialized tooling.&lt;/p&gt;

&lt;p&gt;For an internal API serving a controlled set of clients with modest file sizes, that 33% overhead might be a small price to pay for dramatically improved developer experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code-First Templates: Another "Wrong" That's Right
&lt;/h2&gt;

&lt;p&gt;I encountered another unconventional choice recently. One of our backend developers generates CSV templates dynamically in code rather than storing static template files in the assets folder.&lt;/p&gt;

&lt;p&gt;My instinct said: "Just put the CSV in assets. Why generate something that never changes?"&lt;/p&gt;

&lt;p&gt;But his approach has merit:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single source of truth.&lt;/strong&gt; The CSV structure lives in the same place as the code that validates and processes uploaded CSVs. When the schema changes, the template automatically reflects it. No risk of the template and validation logic drifting apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No asset management overhead.&lt;/strong&gt; No questions about cache invalidation, versioning, or deployment pipelines for static files. It's just code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Programmatic flexibility.&lt;/strong&gt; Need to add helpful comments or examples based on user permissions? Need to generate slightly different templates for different contexts? The code can handle it.&lt;/p&gt;

&lt;p&gt;Yes, you're "wasting" CPU cycles generating the same CSV repeatedly instead of serving a static file. But we're talking about microseconds of processing time versus the very real cost of maintaining consistency between code and assets over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pattern: Optimizing for Maintainability
&lt;/h2&gt;

&lt;p&gt;Both of these "wrong" solutions share a common thread: they optimize for maintainability and developer experience rather than theoretical efficiency.&lt;/p&gt;

&lt;p&gt;This isn't new. The entire history of software development is filled with examples of "slower" solutions winning because they made developers more productive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt; is slower than C, but we use it anyway&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;React's virtual DOM&lt;/a&gt; adds overhead, but simplifies our mental model&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker containers&lt;/a&gt; have more overhead than bare metal, but we containerize everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight is understanding &lt;strong&gt;what you're actually optimizing for.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Break the Rules
&lt;/h2&gt;

&lt;p&gt;I'm not advocating for throwing out best practices. Base64-encoding gigabyte-sized files would be ridiculous. Generating massive, complex templates on every request would be wasteful.&lt;/p&gt;

&lt;p&gt;The question to ask is: &lt;strong&gt;What are the actual constraints of my system, and what trade-offs make sense given those constraints?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For our internal API with controlled clients and modest file sizes, the base64 approach works. For CSV templates that are tiny and generated infrequently, code-first makes sense.&lt;/p&gt;

&lt;p&gt;The "right" way is contextual.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pragmatist's Mindset
&lt;/h2&gt;

&lt;p&gt;As engineers, especially as senior engineers who've been burned by technical debt, we can become dogmatic about best practices. We've seen the consequences of shortcuts, and we're rightfully cautious.&lt;/p&gt;

&lt;p&gt;But there's wisdom in recognizing when a solution that seems "wrong" by the book is actually the most pragmatic choice for your specific context. Sometimes the code that makes you raise an eyebrow on first glance is the same code that will be easiest to maintain three years from now.&lt;/p&gt;

&lt;p&gt;The craft isn't just in knowing the patterns. It's in knowing when to apply them, when to adapt them, and when to ignore them entirely.&lt;/p&gt;

&lt;p&gt;After all, there are many ways to kill a mockingbird. The best way depends on what you're actually trying to accomplish.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The map is not the territory. In the end, our job isn't to follow patterns, but to solve problems.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>discuss</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Google DevFest Quito: A Journey into Modern Engineering</title>
      <dc:creator>Juan Rueda</dc:creator>
      <pubDate>Mon, 16 Dec 2024 00:00:00 +0000</pubDate>
      <link>https://forem.com/pepefeliblu/google-devfest-quito-a-journey-into-modern-engineering-ekn</link>
      <guid>https://forem.com/pepefeliblu/google-devfest-quito-a-journey-into-modern-engineering-ekn</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpy0twq12c6nfsrxqkb84.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpy0twq12c6nfsrxqkb84.webp" alt="Google DevFest Badge" width="800" height="597"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The volunteer got a bit nervous and skipped the 'n' in my name, so we had to perform a hot-fix and squish it in.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This past month, I attended &lt;strong&gt;&lt;a href="https://gdg.community.dev/events/details/google-gdg-quito-presents-devfest-ecuador-2025/" rel="noopener noreferrer"&gt;Google DevFest Quito 2025&lt;/a&gt;&lt;/strong&gt; at Universidad San Francisco de Quito. While the event showcased the latest from Google, the real value lay in the architectural discussions that cut through the hype. It wasn't just about tools; it was about strategy.&lt;/p&gt;

&lt;p&gt;Here are the key takeaways that are reshaping my perspective on modern engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Modern Data Architecture: Actionable vs. Just "Big"
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Speaker: &lt;a href="https://www.linkedin.com/in/ericknaunay/" rel="noopener noreferrer"&gt;Erick Andre Naunay&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The industry definition of "Big Data" is maturing. It's no longer just about hoarding terabytes; it's about shifting from "data without action" to data as a competitive advantage. If your data doesn't drive decisions in minutes, it's just a cost center.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Shift to ELT
&lt;/h3&gt;

&lt;p&gt;The classic ETL (Extract, Transform, Load) model is rigid and hard to scale. The modern approach is &lt;strong&gt;ELT&lt;/strong&gt; (Extract, Load, Transform), where raw data lands first, and transformations happen within the warehouse.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transformation Layer&lt;/strong&gt; : Tools like &lt;a href="https://www.getdbt.com/" rel="noopener noreferrer"&gt;dbt (data build tool)&lt;/a&gt; allow us to version, test, and document transformations like software code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration&lt;/strong&gt; : &lt;a href="https://www.mage.ai/" rel="noopener noreferrer"&gt;Mage AI&lt;/a&gt; was highlighted as a modern alternative for orchestrating pipelines, integrating seamlessly with Spark and monitoring tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Medallion Architecture
&lt;/h3&gt;

&lt;p&gt;To ensure quality, data should flow through distinct layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bronze&lt;/strong&gt; : Raw data (Data Lake).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silver&lt;/strong&gt; : Cleaned and filtered data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gold&lt;/strong&gt; : Business-level aggregates ready for consumption.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Crucially, &lt;strong&gt;Kimball modeling&lt;/strong&gt; remains the gold standard for structuring this "Single Source of Truth," proving that foundational theory often outlasts trend cycles.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Agentic AI &amp;amp; The Local Web
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Speakers: &lt;a href="https://botavalo.com" rel="noopener noreferrer"&gt;Braulio Otavalo&lt;/a&gt; &amp;amp; &lt;a href="https://ew.academy/" rel="noopener noreferrer"&gt;Erick Wendel&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We are moving past the era of simple chatbots into &lt;strong&gt;Agentic AI&lt;/strong&gt; , systems with memory, reasoning, and tool access. But the most interesting shift isn't in the cloud; it's in the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Browser as an AI Runtime
&lt;/h3&gt;

&lt;p&gt;Erick Wendel demonstrated that the web is evolving. With &lt;a href="https://developer.chrome.com/docs/ai/built-in" rel="noopener noreferrer"&gt;Chrome's built-in AI APIs&lt;/a&gt;, we can run LLMs locally. This solves two massive problems: &lt;strong&gt;Privacy&lt;/strong&gt; (data never leaves the device) and &lt;strong&gt;Cost&lt;/strong&gt; (no per-token fees).&lt;/p&gt;

&lt;h3&gt;
  
  
  Small Language Models (SLMs)
&lt;/h3&gt;

&lt;p&gt;The future is likely &lt;strong&gt;Small Language Models&lt;/strong&gt;. They are operational, cost-effective, and fast. While they struggle with the O(n^2) complexity of transformers, for specific tasks, they blow massive models out of the water in terms of ROI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Other notables: &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; for standardizing tool access, and &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt; as the new &lt;code&gt;robots.txt&lt;/code&gt; for AI crawlers.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Infrastructure as Code: Foundational, Not Optional
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Speakers: &lt;a href="https://luisreyesvanegas.com" rel="noopener noreferrer"&gt;Luis Carlos Reyes Vanegas&lt;/a&gt; &amp;amp; &lt;a href="https://www.docker.com/captains/camilla-martins/" rel="noopener noreferrer"&gt;Camilla Martins&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In 2024, "click-ops" is technical debt. Scalability, security, and maintainability must be baked in from day one.&lt;/p&gt;

&lt;p&gt;The winning formula presented was &lt;strong&gt;IaC + AI + Google Cloud&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt;&lt;/strong&gt;: Provides the immutability and state management required for team collaboration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceability&lt;/strong&gt; : Every change is versioned. If it's not in code, it doesn't exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment Parity&lt;/strong&gt; : Creating exact replicas of Prod in QA and Dev environments becomes trivial, reducing the "it works on my machine" syndrome.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎨 Domain Driven Design: Organization as Code
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Speaker: &lt;a href="https://www.thoughtworks.com/profiles/tex-albuja" rel="noopener noreferrer"&gt;Tex Albuja&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;DDD is often treated as abstract theory, but Tex framed it as an organizational necessity. The biggest challenge in product teams isn't coding; it's &lt;strong&gt;communication&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Storming
&lt;/h3&gt;

&lt;p&gt;The highlight was a practical approach to Event Storming using a standardized color code for sticky notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orange&lt;/strong&gt; : Domain Events (Past tense verbs, e.g., &lt;code&gt;OrderPlaced&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pink&lt;/strong&gt; : Problems/Risks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blue&lt;/strong&gt; : Commands (Imperative, e.g., &lt;code&gt;PlaceOrder&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This visual language allows the design to "emerge" naturally. By clearly defining &lt;strong&gt;Bounded Contexts&lt;/strong&gt; , we ensure that changes in one domain (e.g., Shipping) don't ripple out and break another (e.g., Billing). It’s about keeping systems decoupled and maintainable.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks to the &lt;a href="https://gdg.community.dev/gdg-quito/" rel="noopener noreferrer"&gt;GDG Quito&lt;/a&gt; team for hosting such a high-signal event. It’s exciting to see the local community converging on these global best practices.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>google</category>
      <category>softwareengineering</category>
      <category>community</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Mac M1 | Apple Silicon - Death Valleys</title>
      <dc:creator>Juan Rueda</dc:creator>
      <pubDate>Mon, 17 May 2021 16:38:56 +0000</pubDate>
      <link>https://forem.com/pepefeliblu/apple-silicon-death-valleys-4i63</link>
      <guid>https://forem.com/pepefeliblu/apple-silicon-death-valleys-4i63</guid>
      <description>&lt;h1&gt;
  
  
  Sweet Apple MacBook M1
&lt;/h1&gt;

&lt;p&gt;I am not an apple fan/boy. I mean, I get it. They provide this unique and friendly ecosystem of products that now are consolidating under one hardware architecture. But along those changes, their OS also changes too. On previous jobs I used the iMac 4K 27 inch display. They used intel and they were nice. And working on those machines is pretty sweet! I think it was macOS Catalina?&lt;/p&gt;

&lt;p&gt;Personally I own an ASUS gaming machine with windows, I mostly use it for gaming! But I can tell that many workflows change and maintaining the code can have slight differences on either OS. Which was the brand new macOS BigSur meant for the apple silicon systems that they were releasing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;just use docker! &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yeah! We did! An amazing guy setted up our dev-ops and I never managed to run some bash scripts on my docker windows container.&lt;br&gt;
&lt;br&gt;
&lt;code&gt;insertSadFace.webp&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Anyways, run forward to last week and I've just got a brand new Macbook Air M1. I remember that Big Sur brought some aesthetic and GUI changes overall. But I had no issue getting use the the machine...&lt;/p&gt;

&lt;p&gt;Until I decided to do a factory reset and deleted the disk.&lt;/p&gt;

&lt;h1&gt;
  
  
  Never delete the disk
&lt;/h1&gt;

&lt;p&gt;Usually, or at least it's how I used to do this. I would delete everything from the disk. And do a fresh install of the OS. Yeah, ok. But why?! You might be asking yourselves. And well, I do this when I want to sell it. Or I usually leave the company so I hand all the work and I do a factory reset. This time I just needed to do it because &lt;em&gt;"work reasons"&lt;/em&gt;. So, when I tried to do the fresh install of the OS I came with an odd looking message:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;No users available for authorization.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;What?...&lt;/p&gt;

&lt;p&gt;I have never encountered this before. So I decided to do a google research, and things started to look dark.&lt;/p&gt;

&lt;p&gt;Some dude on Reddit said: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;M1 machiens have a known issue with Restoring. Basically, it doesn't work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/macbookair/comments/kb6vjv/m1_no_users_available_for_authorization_on_os/" rel="noopener noreferrer"&gt;Link to reddit thread&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Holy fudge, I almost flipped and after some digging and one and a half hour of cold sweating; I managed to fix it like this:&lt;br&gt;
(I had around 4 hours to solve it before I met with the IT security officer to see some features I needed) &lt;/p&gt;

&lt;h2&gt;
  
  
  Solution to this
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Start up in Recovery Mode&lt;/li&gt;
&lt;li&gt;From the Utilities Open the terminal&lt;/li&gt;
&lt;li&gt;In the terminal run &lt;code&gt;resetpassword&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;This will prompt you to a screen where it tells you there are no users.&lt;/li&gt;
&lt;li&gt;On the bottom part there should be an option for

&lt;code&gt;Delete Mac&lt;/code&gt;

(You can also select this option from the task bar).&lt;/li&gt;
&lt;li&gt;After it reboots the Recovery Utility open the Disk Utility.&lt;/li&gt;
&lt;li&gt;Create a new Volume. (My default vas called &lt;em&gt;Untitled&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Delete the old volume. (The one that was created by default)&lt;/li&gt;
&lt;li&gt;Now you can reinstall your OS.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  After thoughts
&lt;/h1&gt;

&lt;p&gt;I haven't felt like that in some time. And oh boy, Apple did it again! Getting this workaround took me some time and if I didn't have previous experience this would had been a gruesome situation. Other solutions involved creating volumes, using other devices to install the OS. I even tried doing the OS install using the terminal but it also failed with weird errors! &lt;/p&gt;

&lt;p&gt;I felt so relieved when the OS started to download and the authorization user error was gone. I hope this solution fits any of you useful! If you got any similar issues I would love to read them! Also any comments or suggestions are more than welcome! &lt;/p&gt;

</description>
      <category>macbook</category>
      <category>apple</category>
      <category>macos</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
