<?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>DEV Community: Michael Di Prisco</title>
    <description>The latest articles on DEV Community by Michael Di Prisco (@cadienvan).</description>
    <link>https://dev.to/cadienvan</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%2F177277%2Faff0798f-1003-4c17-88ae-e537807dff78.jpg</url>
      <title>DEV Community: Michael Di Prisco</title>
      <link>https://dev.to/cadienvan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cadienvan"/>
    <language>en</language>
    <item>
      <title>Thanks Captain Obvious - Just Don't Be An A**hole</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Wed, 21 Jan 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/cadienvan/thanks-captain-obvious-just-dont-be-an-ahole-fgk</link>
      <guid>https://dev.to/cadienvan/thanks-captain-obvious-just-dont-be-an-ahole-fgk</guid>
      <description>&lt;h2&gt;
  
  
  Leadership advice is everywhere, but.
&lt;/h2&gt;

&lt;p&gt;Threads, books, courses, TED talks, frameworks, pyramids, quadrants, canvases, principles, checklists.&lt;/p&gt;

&lt;p&gt;But after years of being a Developer / Tech Lead / Manager / everything in between, here's the uncomfortable punchline I keep coming back to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Much of leadership starts from a brutally simple principle:&lt;br&gt;&lt;br&gt;
"Thanks Captain Obvious - just don't be an a**hole."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And sure, it sounds superficial... until you look closely and realize how many people fail at exactly this.&lt;/p&gt;

&lt;p&gt;We read articles about psychological safety while publicly mocking colleagues' ideas.&lt;br&gt;&lt;br&gt;
We repost quotes about empowerment and then micromanage code reviews.&lt;br&gt;&lt;br&gt;
We celebrate team ownership while hoarding decisions.&lt;/p&gt;

&lt;p&gt;The problem isn't knowledge.&lt;br&gt;&lt;br&gt;
It's interest.&lt;br&gt;&lt;br&gt;
It's empathy.&lt;br&gt;&lt;br&gt;
It's habit to dismantle.&lt;br&gt;&lt;br&gt;
It's the willingness to see the human being, both on the other side of the desk and especially behind your own.&lt;/p&gt;

&lt;p&gt;And I'm not innocent either.&lt;br&gt;&lt;br&gt;
I'm writing this while replaying a highlight reel of all the times I failed people - the times I interrupted, dismissed, rushed to solutions, hid behind architecture, or simply didn't listen. I still regret some of those moments. And I know the next mistake is just around the corner, waiting to teach me something else about myself.&lt;/p&gt;

&lt;p&gt;But maybe that's the point:&lt;br&gt;&lt;br&gt;
Leadership is not about perfection.&lt;br&gt;&lt;br&gt;
It's about noticing when you screwed up - and choosing to do better next time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ridiculous Obviousness Behind Leadership Advice.
&lt;/h2&gt;

&lt;p&gt;Let's take a tour of some universally celebrated principles and translate them into plain English.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Empower your team.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;➡️ Let people do their job.&lt;br&gt;&lt;br&gt;
Stop solving everything for them. Stop being the human bottleneck.&lt;/p&gt;

&lt;p&gt;I already wrote this in &lt;a href="https://dev.to/blog/en/authority-and-accountability/"&gt;Authority and Accountability&lt;/a&gt;, where authority goes down but accountability goes up. A concept so simple it should be stapled above every manager's monitor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Practice active listening.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;➡️ Shut up. They're talking.&lt;br&gt;&lt;br&gt;
You don't need a workshop for this. You need self-awareness.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create psychological safety.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;➡️ Don't make people feel stupid.&lt;br&gt;&lt;br&gt;
If you roll your eyes at a question, congratulations - you just became the problem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lead by example.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;➡️ Do the things you expect others to do.&lt;br&gt;&lt;br&gt;
I already wrote this clearly in &lt;a href="https://dev.to/blog/en/build-a-rocket-with-legos/"&gt;Build a Rocket with LEGOs&lt;/a&gt;: great developers - and great leaders - make complexity disappear instead of showing off with it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Avoid over-engineering / stay pragmatic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;➡️ Solve the real problem, not the one inside your head.&lt;br&gt;&lt;br&gt;
I already wrote this in &lt;a href="https://dev.to/blog/en/what-sits-and-what-fits/"&gt;What Sits and What Fits&lt;/a&gt; and expanded it in &lt;a href="https://dev.to/blog/en/stay-in-the-problem-space/"&gt;Stay in the Problem Space&lt;/a&gt;: clarity beats cleverness, always.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Help the team grow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;➡️ Care enough to invest in people.&lt;br&gt;&lt;br&gt;
If you don't genuinely want them to succeed, they will feel it. Immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leadership Isn't Learned - It's Revealed.
&lt;/h2&gt;

&lt;p&gt;After years of reading, practicing, and messing up, here's the truth I can't unsee:&lt;/p&gt;

&lt;p&gt;Leadership doesn't come from frameworks.&lt;br&gt;&lt;br&gt;
It mostly comes from how you see - and treat - people.&lt;/p&gt;

&lt;p&gt;You can read 200 leadership books.&lt;br&gt;&lt;br&gt;
You can memorize every model.&lt;br&gt;&lt;br&gt;
You can preach every principle on LinkedIn.&lt;/p&gt;

&lt;p&gt;But if you don't fundamentally care about:&lt;br&gt;&lt;br&gt;
what your teammates fear,&lt;br&gt;&lt;br&gt;
what they hope,&lt;br&gt;&lt;br&gt;
what drains them,&lt;br&gt;&lt;br&gt;
what motivates them,&lt;br&gt;&lt;br&gt;
what they need from you...&lt;/p&gt;

&lt;p&gt;...then none of it matters.&lt;/p&gt;

&lt;p&gt;Leadership is not a skillset you can copy-paste.&lt;br&gt;&lt;br&gt;
It's a lens.&lt;br&gt;&lt;br&gt;
A way of perceiving humans before processes.&lt;br&gt;&lt;br&gt;
A willingness to adapt yourself before asking others to adapt to you.&lt;/p&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;You cannot lead people you are not willing to understand.&lt;/p&gt;

&lt;p&gt;This is the foundation underneath all the "obvious" advice - the part books rarely emphasize, because you can't teach someone to care.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Real Examples (a Bit Too Real).
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When someone delivers poor work
&lt;/h3&gt;

&lt;p&gt;Bad leader:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ugh, they're not good enough.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Actual leader:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did I communicate poorly? Is the context unclear? Are they overwhelmed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  When a junior makes a mistake
&lt;/h3&gt;

&lt;p&gt;Bad leader:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We can't afford this."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Actual leader:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Mistakes are tuition. Let's look at it together."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  When the team is drowning
&lt;/h3&gt;

&lt;p&gt;Bad leader:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Push harder."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Actual leader:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What can we remove? Who needs support? What am I missing?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And yes - I've been both versions.&lt;br&gt;
Sometimes in the same week.&lt;/p&gt;

&lt;p&gt;P.S. These phrases are examples to make a point; each of the "bad leader" statements I indicated could be said constructively and coherently in the right context. What matters is the attitude and intention behind the words. Leadership is not an if-else statement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Don't More People Do This Then?
&lt;/h2&gt;

&lt;p&gt;Because it's far easier to talk about leadership than to actually live it.&lt;/p&gt;

&lt;p&gt;Applying these principles requires two things most people avoid like Friday evening refactoring:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-awareness&lt;/strong&gt; - looking your impulsive reactions, ego, and insecurities in the face.&lt;br&gt;
Not everyone wants to discover that the real bottleneck isn't the team... it's them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vulnerability&lt;/strong&gt; - admitting you might be wrong, that you don't have all the answers, that you need to learn when to stop.&lt;br&gt;
It's much more comfortable to hide behind processes, metrics, architectures, and "best practices."&lt;/p&gt;

&lt;p&gt;The truth is "just don't be an a**hole" sounds trivial until you realize it demands constant work on yourself.&lt;br&gt;
And that work - the work on yourself - is the part of leadership you can't delegate, automate, or copy-paste from a book.&lt;/p&gt;

&lt;p&gt;That's where most people stop.&lt;br&gt;
Not because they don't know what to do - but because actually doing it takes more courage than it seems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ironic Twist.
&lt;/h2&gt;

&lt;p&gt;All the leadership lessons we admire - empathy, clarity, autonomy, pragmatism, communication - are the same things we celebrate in great developers.&lt;/p&gt;

&lt;p&gt;If you read my previous articles, you'll notice a pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/en/the-truth-about-test-coverage/"&gt;The Truth About Test Coverage&lt;/a&gt; -&amp;gt; clarity beats vanity metrics.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/en/iterative-contract-testing/"&gt;Iterative Contract Testing&lt;/a&gt; -&amp;gt; simplicity beats complexity.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/en/colleague-based-testing/"&gt;Colleague-Based Testing&lt;/a&gt; -&amp;gt; your code must be understandable to others.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/en/asynchronous-batching/"&gt;Asynchronous Batching&lt;/a&gt; -&amp;gt; optimize for collective efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replace "codebase" with "team", and they just became leadership mantras.&lt;/p&gt;

&lt;p&gt;Turns out the line between a good architect and a good leader is thinner than we think.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion.
&lt;/h2&gt;

&lt;p&gt;I've made enough mistakes to write a trilogy.&lt;br&gt;&lt;br&gt;
I'll make more.&lt;br&gt;&lt;br&gt;
You will too.&lt;/p&gt;

&lt;p&gt;But if there's one thing I've learned - something no article, no podcast, no book ever taught me explicitly - it's this:&lt;/p&gt;

&lt;p&gt;The quality of your leadership is measured by how people feel after interacting with you.  &lt;/p&gt;

&lt;p&gt;The truth is no framework can save you from yourself.&lt;br&gt;&lt;br&gt;
People don't remember your title, your decisions, your roadmaps.&lt;br&gt;&lt;br&gt;
They remember how you made them feel while all of that was happening.&lt;/p&gt;

&lt;p&gt;Not being an a**hole isn't a leadership principle.&lt;br&gt;&lt;br&gt;
It's a principle of humanity applied to work.&lt;/p&gt;

&lt;p&gt;Everything else - processes, metrics, models - is just maintenance.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>leadership</category>
      <category>career</category>
    </item>
    <item>
      <title>Build a Rocket with LEGOs</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Wed, 20 Aug 2025 07:15:07 +0000</pubDate>
      <link>https://dev.to/cadienvan/build-a-rocket-with-legos-5ck1</link>
      <guid>https://dev.to/cadienvan/build-a-rocket-with-legos-5ck1</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"The Art of Programming is the Art of Organizing Complexity" - Edsger Dijkstra&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm not a dogma guy, so don't expect me to talk about "ports and adapters" or "clean architecture" here. Instead, I want to share a mindset that has helped me and many others build better software. What follows is not just about software, but about how to think like a great developer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's picture the following: you hand a group of developers a huge pile of LEGO bricks and ask them to build a rocket.&lt;/p&gt;

&lt;p&gt;Some will sketch blueprints, carefully laying out every component before placing a single brick. Others will immediately start building, creating elaborate structures, only to watch them collapse under their own complexity. But a rare few - the best developers I've worked with - will do something different.&lt;/p&gt;

&lt;p&gt;They'll visualize the rocket in their mind and then break it down into blocks so simple that anyone in the team could assemble them. They'll start small, test as they go, and invite others to snap pieces in place. And when the rocket finally takes off, it won't just be a marvel of design - it'll be maintainable, adaptable, and collaborative by nature.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 Those are the developers I want to work with.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Complexity Is Not a Badge of Honor
&lt;/h2&gt;

&lt;p&gt;There's a persistent myth in our industry: that the "best" developers are the ones who navigate complexity with elegance, mastering abstract patterns, functional purity, or architecture diagrams that look like subway maps.&lt;/p&gt;

&lt;p&gt;But here's the truth: &lt;strong&gt;The best developers make complexity disappear.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They don't impose it on the team. They &lt;em&gt;tame&lt;/em&gt; it. They break it down into clear, simple steps that are easy to understand and even easier to collaborate on. They understand that their job isn't to make themselves look smart - it's to help everyone move fast without breaking things.&lt;/p&gt;

&lt;p&gt;Their brain handles the complexity - but their output doesn't show it. It shows empathy.&lt;/p&gt;

&lt;h3&gt;
  
  
  A practical example
&lt;/h3&gt;

&lt;p&gt;In Jointly, we built a simple abstraction layer for our cache needs called &lt;a href="https://github.com/JointlyTech/cache-candidate" rel="noopener noreferrer"&gt;cache-candidate&lt;/a&gt;. It is a beast, automatically managing custom keys, dependency invalidation, TTLs, thunder herding problems, and more.&lt;/p&gt;

&lt;p&gt;It can work both in memory and with Redis, and it has a simple interface that allows us to swap implementations without changing the code that uses it.  &lt;/p&gt;

&lt;p&gt;The internal implementation? As of today, &lt;code&gt;516 lines of code&lt;/code&gt; just for the core functionality, ignoring what is actually exposed, so you need to add that, the Redis implementation, the in-memory implementation, the plugins system, etc, which brings the total close to &lt;code&gt;1000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The external interface?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cacheCandidate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@jointly/cache-candidate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT * FROM users WHERE ?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Example function to cache&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cachedGetUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cacheCandidate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ✅ Done!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you want to switch to Redis, have a custom key name, a specific TTL and a different expiration mode?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cachedGetUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cacheCandidate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;customKeyFunction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootArgs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`users_in_system:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rootArgs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;only_active_users&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;makeRedisCache&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;expirationMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;timeout-only&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// ✅ Done!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait, what is that &lt;code&gt;makeRedisCache()&lt;/code&gt;? It's a &lt;code&gt;25 LoC&lt;/code&gt; compatibility layer we built around &lt;code&gt;kv&lt;/code&gt; - an internal Redis client - just for the &lt;code&gt;cache-candidate&lt;/code&gt; to work with Redis. It uses the simple adapter interface of &lt;code&gt;cache-candidate&lt;/code&gt; to provide a Redis implementation based on specific needs we expressed inside &lt;code&gt;kv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This brings the total complexity of the system to around &lt;code&gt;1300 LoC&lt;/code&gt;, yet the final user just had to install a package and copy three lines of code from the README to switch from in-memory to Redis.&lt;/p&gt;

&lt;p&gt;See? The complexity is there, but it doesn't affect and afflict the &lt;strong&gt;Developer Experience&lt;/strong&gt;. The interface is simple, and anyone can use it without needing to understand the underlying implementation. Paradoxically, a developer who doesn't know how to use Redis can still use the cache-candidate in such a configured way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Great Developers Are Systems Thinkers
&lt;/h2&gt;

&lt;p&gt;These developers aren't necessarily the most skilled coders or the fastest bug-fixers. But they're incredible &lt;strong&gt;problem solvers&lt;/strong&gt; because they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deconstruct the problem space before jumping into solution mode.&lt;/li&gt;
&lt;li&gt;Spot dependencies and friction points early.&lt;/li&gt;
&lt;li&gt;Translate ambiguous requirements into crisp, executable building blocks.&lt;/li&gt;
&lt;li&gt;Empower others by making their contributions plug-and-play.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, they're not just engineers - they're &lt;strong&gt;collaborative systems thinkers&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to train your mind to think like this?
&lt;/h3&gt;

&lt;p&gt;To cultivate this mindset, I always suggest the &lt;strong&gt;5 Whys&lt;/strong&gt; technique. When faced with a complex problem, ask "Why?" five times. Each answer will help you peel back layers of complexity until you reach the root cause or the simplest form of the problem.&lt;/p&gt;

&lt;p&gt;I find the 3rd or 4th "Why?" to be the most revealing and usually solves the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills to Cultivate
&lt;/h2&gt;

&lt;p&gt;So how do you get there? Here are a few mindset shifts that separate great developers from good ones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Think in steps, not just solutions&lt;/strong&gt; Can someone else follow your thought process? If not, simplify it.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Design for collaboration&lt;/strong&gt; Would you rather be a genius solo builder or the person who enables 5x progress by everyone else?&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Favor boundaries over cleverness&lt;/strong&gt; A well-defined interface is often more valuable than a brilliant internal algorithm.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Don't just ask "How do I fix this?" - ask "How do I make it easy for someone else to change this tomorrow?"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to cultivate this mindset in a team?
&lt;/h2&gt;

&lt;p&gt;To cultivate this mindset in your team, I would suggest the following practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pair programming&lt;/strong&gt;: Organize moments where developers work together on the same codebase, sharing ideas and approaches, trying to come out with a solution that is easy to understand and extend. If another dev can understand it without questions, it means it's simple enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team-wide Code reviews&lt;/strong&gt;: Encourage team members to review each other's code, all together, without the dev who wrote it present. This way, they can ask questions and suggest improvements without the pressure of the original author being there. If you can't do that, at least try to have the author present but not speaking, so they can only listen to the feedback and answer questions. If answers are needed, it means the code could be improved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation written by a dev who didn't write the code&lt;/strong&gt;: Encourage team members to write documentation for code they didn't write. This forces them to understand the code and explain it in simple terms, which helps both the writer and the reader. This usually happens after the code review, so the &lt;em&gt;clarifying questions&lt;/em&gt; are already answered, and the writer can focus on explaining the code in a way that is easy to understand.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  "What if the system has to be complex?"
&lt;/h2&gt;

&lt;p&gt;Sometimes, complexity is unavoidable. But even then, the best developers find ways to make it manageable. They create abstractions that hide the complexity behind simple interfaces. They document their thought processes so others can follow along. They build systems that are resilient to change, not brittle.&lt;/p&gt;

&lt;p&gt;In this case, I usually suggest to focus on &lt;strong&gt;DevExp&lt;/strong&gt;, &lt;strong&gt;Documentation&lt;/strong&gt; and &lt;strong&gt;Collaboration&lt;/strong&gt;. Make more than one person understand the system, and ensure that anyone can pick it up and work on it without needing to decipher a complex web of dependencies. It still could be a pain to work on, but at least it won't be a system people are afraid to touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;A LEGO rocket built collaboratively will always outperform a duct-taped space shuttle made by one. Not because it flies higher, but because anyone can fix it when it breaks - and everyone knows how it works.&lt;/p&gt;

&lt;p&gt;Next time you're deep in a gnarly refactor, or knee-deep in a greenfield system, ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Am I building a rocket, or am I just piling up bricks?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because the best developers? They build rockets. With LEGOs.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Stay in the problem space.</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Fri, 04 Apr 2025 20:46:46 +0000</pubDate>
      <link>https://dev.to/cadienvan/stay-in-the-problem-space-2p3h</link>
      <guid>https://dev.to/cadienvan/stay-in-the-problem-space-2p3h</guid>
      <description>&lt;h2&gt;
  
  
  When a problem isn't clear, the solution can't be either.
&lt;/h2&gt;

&lt;p&gt;When was the last time you jumped straight into coding or rushed to adopt the latest technology before fully grasping the core issue? 🤔 We've all been there. In software engineering, the allure of shiny new tools or clever solutions can often distract us from the foundational discipline: staying in the &lt;strong&gt;problem space&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem First, Solution Later
&lt;/h2&gt;

&lt;p&gt;Imagine you're debugging a critical issue: your application randomly crashes. You might instinctively start applying patches or quick fixes. But what if the issue resurfaces? You probably didn't spend enough time understanding the true nature of the problem.&lt;/p&gt;

&lt;p&gt;The key is to resist this initial rush toward solutions. Deeply understanding the problem helps you uncover edge cases, hidden assumptions, and unclear requirements---elements that are often overlooked yet critically impact your software's robustness.&lt;/p&gt;

&lt;p&gt;For example, let's consider the widely misunderstood concept of &lt;strong&gt;test coverage&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function sum(a, b) {
  return a + b;
}

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

&lt;/div&gt;



&lt;p&gt;Running some tests on this function might give you 100% coverage---but does it handle unexpected input correctly, such as a string or &lt;code&gt;undefined&lt;/code&gt;? Real-world scenarios demand thorough problem-space exploration rather than superficial solutions driven by metrics alone.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Tip:&lt;/strong&gt; Always start with clarifying edge cases and unclear requirements before writing your first line of code.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Product Teams Can Enable Engineers
&lt;/h2&gt;

&lt;p&gt;It's crucial not just for developers but also for product teams to embrace the problem-first approach. Often, product teams inadvertently present solutions disguised as problems:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We need a button here that sends a notification."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a solution, not a problem. Instead, framing it as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Users don't notice when important changes occur."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, the team can creatively address the issue, potentially uncovering solutions more elegant or effective than a mere button.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bridging Software Engineering and Product Management
&lt;/h3&gt;

&lt;p&gt;Encouraging product teams to articulate problems rather than dictate solutions shifts the role of software engineers towards &lt;strong&gt;Product Engineers&lt;/strong&gt;---professionals who blend deep technical expertise with product insights. In an AI-driven world, this combined perspective becomes increasingly critical.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Tip:&lt;/strong&gt; Advocate for clear problem definitions from your Product team, and become a proactive partner in finding optimal solutions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Avoiding Over-engineering
&lt;/h2&gt;

&lt;p&gt;Staying firmly in the problem space prevents the all-too-common pitfall of &lt;strong&gt;over-engineering&lt;/strong&gt;. Consider the classic case of implementing an event-driven architecture for a simple, low-traffic application. While elegant on paper, such architecture might complicate the solution unnecessarily, diverting energy away from real customer value.&lt;/p&gt;

&lt;p&gt;Focusing on the problem first---like exploring the need for batching requests asynchronously to improve performance---can reveal simpler, more effective solutions tailored precisely to the real issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Tips for Staying Problem-Focused
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clearly Define Problems:&lt;/strong&gt; Use techniques like "5 Whys" to drill down to root causes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Engage Cross-Functional Teams:&lt;/strong&gt; Encourage dialogue between developers, product managers, and stakeholders to enrich understanding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Measure Impact, Not Activity:&lt;/strong&gt; Focus on outcomes and impacts rather than arbitrary metrics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leverage Documentation Wisely:&lt;/strong&gt; Use lightweight documentation like Architecture Decision Records (ADRs) to track decisions made from a problem-centric perspective.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The essence of creating impactful software lies in relentlessly staying in the problem space. Prioritize problem clarity, resist immediate solution temptations, and foster product-engineering collaboration. Embrace this discipline, and you'll drive sustainable, valuable outcomes that truly align with your business goals.&lt;/p&gt;

&lt;p&gt;So next time you're tempted by a quick fix or a new framework, take a step back. Stay with the problem. Let solutions naturally follow.&lt;/p&gt;




&lt;p&gt;👋 &lt;strong&gt;Discussion Starter:&lt;/strong&gt; How often do you find yourself rushing into solutions before fully understanding the problem? Share your experiences below! Let's discuss how we can collectively stay grounded in the problem space.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Authority and Accountability</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Sat, 15 Mar 2025 15:02:49 +0000</pubDate>
      <link>https://dev.to/cadienvan/authority-and-accountability-538o</link>
      <guid>https://dev.to/cadienvan/authority-and-accountability-538o</guid>
      <description>&lt;p&gt;Authority Goes Bottom-Up, Accountability Goes Top-Down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In my small journey as a tech lead, I've learnt that effective &lt;strong&gt;leadership&lt;/strong&gt; isn't about issuing commands from an ivory tower. Instead, it's about redistributing &lt;strong&gt;authority&lt;/strong&gt; while still holding onto &lt;strong&gt;accountability&lt;/strong&gt;. This idea might sound counterintuitive at first --- after all, traditional management put both authority and accountability at the top. Traditionally, managers made all the key decisions (authority flowed top-down) and pushed responsibility for failures onto their teams. But the model I saw bring the best results is different: one where authority goes bottom-up and accountability comes top-down.&lt;/p&gt;

&lt;p&gt;I learnt that empowering those closest to the work leads to better results. By allowing decisions to be made by developers, designers, and other experts on the front lines, a leader taps into the collective intelligence of the team. The leader's role then shifts from being a control point to being a support structure. Yet, even as team members gain more control over &lt;em&gt;how&lt;/em&gt; work gets done, the leader remains the one answerable for &lt;em&gt;what&lt;/em&gt; comes of it. I've seen first-hand that this dynamic can transform a team's agility and morale --- if done right.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Leadership Paradigm Shift
&lt;/h2&gt;

&lt;p&gt;This approach represents a paradigm shift in leadership style. In the old top-down model, authority was concentrated at the top: the tech lead or manager would devise solutions, assign tasks, and dictate methods. Accountability often trickled down in a negative way, where failures were blamed on individuals or sub-teams. In the bottom-up authority model, this script is flipped: authority is distributed among team members who have the knowledge and context to make informed decisions. The tech leader still sets the vision and direction, but trusts the team to determine the best path to reach those goals.&lt;/p&gt;

&lt;p&gt;With authority spread out, innovation and creativity flourish. Team members feel heard and valued because they're actively shaping decisions, not just following orders. &lt;strong&gt;This doesn't mean the leader is hands-off or absent.&lt;/strong&gt; Instead, the leader stays highly engaged in enabling the team's success while accountability remains centralized. The leader takes responsibility for the outcomes of those team-led decisions: if things go well, the whole team shares the credit; if things go poorly, the leader shoulders the blame and seeks solutions. This clear division --- empowerment in execution, responsibility in oversight --- marks a big change from traditional management and demands a new mindset from everyone involved.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trust and Responsibility
&lt;/h2&gt;

&lt;p&gt;At the heart of pushing authority downward is &lt;strong&gt;trust&lt;/strong&gt;. A tech leader must trust their engineers and designers to make choices that align with the project's objectives and the company's values. This trust isn't blind; it's built over time through communication, experience, and mutual competence on both sides. When team members feel truly trusted, they develop a greater sense of &lt;strong&gt;ownership&lt;/strong&gt;. They stop just carrying out tasks and instead take responsibility for solving problems and innovating, because they know their judgment is respected.&lt;/p&gt;

&lt;p&gt;This empowerment fosters a culture of responsibility. Each expert becomes the owner of their domain, whether it's a piece of code, a UI design, or a deployment process. They make decisions as if the project were their own --- because in a sense, it is. Meanwhile, the tech leader remains ultimately accountable for the project's success and failures. In practice, this means the leader stays aware of the big picture and is ready to step in to support or course-correct as needed, but not to second-guess every decision.&lt;/p&gt;

&lt;p&gt;It's a delicate balance: giving people freedom to act, and being ready to catch them if they fall. When done well, the result is a team full of proactive problem-solvers who feel responsible for the outcome, rather than cogs waiting for instructions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges of This Approach
&lt;/h2&gt;

&lt;p&gt;Adopting a bottom-up authority and top-down accountability model isn't without its challenges. Leaders and teams may face several dilemmas as they adjust to this balance of autonomy and oversight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Letting Go of Control&lt;/strong&gt;: For leaders, especially those seasoned in top-down environments, it can be difficult to step back and not micromanage. It takes discipline to allow others to make decisions (and mistakes) in areas you used to control directly.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Team Readiness&lt;/strong&gt;: Not every team member is immediately comfortable with newfound model. Some may fear making the wrong decision and prefer clear orders. There can be a learning curve as individuals grow into their decision-making roles.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Risk Management&lt;/strong&gt;: With greater autonomy comes the chance that teams might pursue an approach that fails or falls short. The leader, while accountable, must create a safety net for smart risk-taking. This involves encouraging experimentation but also having fallback plans or checkpoints to prevent complete derailment.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Avoiding Micromanagement in the Name of Accountability&lt;/strong&gt;: Knowing you are accountable for the team's outcomes can tempt a leader to hover over every choice --- which defeats the whole purpose of empowerment. The challenge is to stay informed and provide guidance &lt;em&gt;without&lt;/em&gt; dictating every move. Leaders must learn to trust but verify: implement review processes, ask questions, and then let the team execute.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Alignment and Clarity&lt;/strong&gt;: When authority is decentralized, maintaining a unified direction requires extra effort. The leader must clearly communicate the vision, goals, and constraints so that even as team members make independent decisions, those decisions align with the broader mission. Without this clarity, bottom-up authority can lead to chaos or divergent paths.
&amp;gt; Letting Go of Control is probably the most challenging aspect of this model, at least for me. Being a hands-on developer for years, I had to learn to trust my team and let them make decisions, even if I would have done things differently. It's a constant exercise in humility and patience, but the results are worth it, and when I fail in doing it, my team is always there to accept my moments of weakness and help me get back on track.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Navigating these challenges requires self-awareness from the leader and a commitment to open communication within the team. It's not a "set and forget" model; it demands continual tuning of how much guidance or freedom the team needs as circumstances change. The payoff, however, is a more resilient and engaged team that can adapt and innovate quickly, with the leader as a guiding force rather than a taskmaster.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tech Lead's Role
&lt;/h2&gt;

&lt;p&gt;In a tech team, the &lt;strong&gt;Tech Lead&lt;/strong&gt; plays a pivotal role in this bottom-up authority structure. Unlike a traditional boss who issues orders, a Tech Lead in this model acts as a facilitator and mentor. They use their technical expertise to guide and support rather than unilaterally decide. On a day-to-day basis, this could mean letting the team choose the tech stack or design patterns for a new feature, while the Tech Lead provides context about constraints (like performance needs or deadlines) and helps navigate trade-offs.&lt;/p&gt;

&lt;p&gt;The Tech Lead must balance two key aspects: autonomy and oversight. On one hand, they encourage developers to propose solutions and run with their ideas. On the other hand, they keep a watchful eye on the bigger picture --- ensuring that all these individual decisions integrate into a coherent, high-quality product. If a developer's experiment is struggling, the Tech Lead offers help or finds additional resources, rather than immediately overruling the effort. They cultivate an environment where mistakes are treated as learning opportunities, not failures.&lt;/p&gt;

&lt;p&gt;Crucially, the Tech Lead also serves as the shield for the team. In meetings with upper management or clients, the Tech Lead takes accountability for the team's output. If a deadline is missed or a feature has issues, the Tech Lead owns up to it, then works with the team to set things right. Internally, they will discuss how to improve, but externally they never throw their team under the bus. This builds trust within the team --- they know their lead has their back.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do not misunderstand shielding your team with covering up their mistakes. It's about taking responsibility for the outcomes, not about ignoring the causes. When something goes wrong, it's the Tech Lead's job to address it, understand it, and work with the team to prevent it from happening again. Shield too much, and you'll lose credibility; shield too little, and you'll lose your team's trust.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over time, this trust loop (team members entrusted with authority, Tech Lead accountable upwards) creates a strong bond and a high-performance culture. The Tech Lead becomes the embodiment of bottom-up authority and top-down accountability: empowering the team at every step, yet standing up to answer for the results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Shifting to a bottom-up authority and top-down accountability model can feel like walking a tightrope, but the results are incredible. By giving away power and holding onto responsibility, leaders might actually strengthen their teams and outcomes. It challenges the very notion of what a leader should do: less controlling, more enabling; less commanding, more accountable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let's see how it goes. I'm still learning, but I'm excited to see where this path leads me and my team. I hope you are too.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>leadership</category>
      <category>learning</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>My latest fatigue!</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Fri, 24 Jan 2025 14:12:57 +0000</pubDate>
      <link>https://dev.to/cadienvan/my-latest-fatigue-3h4d</link>
      <guid>https://dev.to/cadienvan/my-latest-fatigue-3h4d</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/cadienvan" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F177277%2Faff0798f-1003-4c17-88ae-e537807dff78.jpg" alt="cadienvan"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/cadienvan/what-sits-and-what-fits-o58" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;What Sits And What Fits.&lt;/h2&gt;
      &lt;h3&gt;Michael Di Prisco ・ Jan 24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#discuss&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>architecture</category>
    </item>
    <item>
      <title>What Sits And What Fits.</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Fri, 24 Jan 2025 14:06:07 +0000</pubDate>
      <link>https://dev.to/cadienvan/what-sits-and-what-fits-o58</link>
      <guid>https://dev.to/cadienvan/what-sits-and-what-fits-o58</guid>
      <description>&lt;h2&gt;
  
  
  Introduction.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;[TL;DR]&lt;/strong&gt; It depends.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In software development, the concepts of rules, principles, and best practices form the backbone of our work. These are the foundational elements - what &lt;strong&gt;&lt;em&gt;sits&lt;/em&gt;&lt;/strong&gt; - that guide decisions, standardize processes, and ensure scalability in complex systems. They act as anchors, providing stability and a shared understanding across teams and projects.&lt;/p&gt;

&lt;p&gt;Yet, no rule or practice exists in a vacuum. There are moments when the established path is not the best path. Context shifts, priorities change, and sometimes the solution lies in stepping outside the boundaries. These are the moments when &lt;strong&gt;&lt;em&gt;fits&lt;/em&gt;&lt;/strong&gt; - context-specific adaptations - become necessary to resolve unique challenges. The tension between &lt;strong&gt;&lt;em&gt;sits&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;fits&lt;/em&gt;&lt;/strong&gt; is the core of pragmatic software architecture.&lt;/p&gt;

&lt;p&gt;In this article, I'll try to explain my vision and the value of &lt;strong&gt;&lt;em&gt;fits&lt;/em&gt;&lt;/strong&gt;, or better said, &lt;strong&gt;the importance of trade-offs&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of "Sits": Structure and Scalability.
&lt;/h2&gt;

&lt;p&gt;Every software project needs a framework - a set of rules and principles - to thrive. These frameworks are what "sits" represent. By adhering to these foundational practices, teams can create systems that are easier to maintain, extend, and scale over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistency Across the Board.
&lt;/h3&gt;

&lt;p&gt;Consistency is the unsung hero of software architecture. By following well-defined rules, developers can create predictable systems where new contributors can quickly understand the codebase. Consider the widespread use of design patterns such as MVC (Model-View-Controller). These patterns act as a shared language among developers, allowing teams to discuss and implement features without endless debate.&lt;/p&gt;

&lt;p&gt;Consistency also plays a role in reducing cognitive load. For instance, adopting a single testing framework across the organization (e.g., Vitest for JavaScript projects) means that developers don't need to switch mental gears when moving between repositories. This small reduction in mental friction can lead to significant productivity gains over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maintainability Through Clear Rules.
&lt;/h3&gt;

&lt;p&gt;Best practices often emerge to solve recurring problems. Take the principle of separation of concerns. By dividing code into distinct layers - presentation, logic, and data - you make it easier to identify and resolve bugs. For example, debugging a UI bug becomes simpler when the logic is encapsulated in a service layer rather than tangled in view components.&lt;/p&gt;

&lt;p&gt;Moreover, clear rules prevent tech debt from spiraling out of control. Following SOLID principles in object-oriented programming ensures that components remain modular and adaptable. Violating these principles might work in the short term, but over time, the cost of these violations compounds, turning minor issues into systemic problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scalability: Building for Growth.
&lt;/h3&gt;

&lt;p&gt;When designing systems, scalability is often a key concern. Principles like horizontal scaling and stateless services allow architectures to handle increased loads without dramatic redesigns. Kubernetes, for instance, thrives on stateless containers that can be scaled up or down seamlessly. These practices might not seem essential during initial development, but as traffic grows, their importance becomes apparent.&lt;/p&gt;

&lt;p&gt;However, sticking rigidly to these principles can sometimes choke innovation or delay delivery. This is where &lt;strong&gt;&lt;em&gt;fits&lt;/em&gt;&lt;/strong&gt; come into play.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Fits Prevails: Breaking Rules for Context.
&lt;/h2&gt;

&lt;p&gt;While &lt;strong&gt;&lt;em&gt;sits&lt;/em&gt;&lt;/strong&gt; provide structure, they can also impose constraints that are unnecessary in certain contexts. The ability to recognize when breaking the rules serves the greater good is a clear sign of an experienced architect.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nothing is JUST a Technical Decision.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This phrase has been said many times by a dear friend of mine, Luca Mezzalira, and it resonates with me &lt;strong&gt;a lot&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The most important lessons I've learned in software architecture is that no decision is purely technical. Every choice we make has implications for the business, the team, and the product's future. A technical decision can impact budgets, timelines, and even team morale. It's essential to recognize this interconnectedness to make informed choices.&lt;/p&gt;

&lt;p&gt;It's a powerful reminder that we, as architects and developers, operate at the intersection of technology and business, and our decisions must serve both dimensions.&lt;/p&gt;

&lt;p&gt;By keeping this in mind, I've learned to approach every architectural choice with a broader perspective, considering not only the immediate technical benefits but also the ripple effects on stakeholders and long-term goals.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Melvin Conway - 1967&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of Sits and context-specific Fits.
&lt;/h3&gt;

&lt;p&gt;Let's consider some common examples of &lt;strong&gt;&lt;em&gt;sits&lt;/em&gt;&lt;/strong&gt; in software architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Polymorphism in OOP:&lt;/strong&gt; Reducing redundancy by encapsulating shared logic in parent classes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive unit testing:&lt;/strong&gt; Ensuring that changes don't introduce regressions, especially in large codebases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-driven architecture:&lt;/strong&gt; Decoupling components to improve scalability and maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract Testing:&lt;/strong&gt; Verifying that APIs adhere to predefined contracts to prevent breaking changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Sit #1: Polymorphism in OOP.
&lt;/h4&gt;

&lt;p&gt;In software circles, hardcoding a condition with an &lt;code&gt;if&lt;/code&gt; statement is often considered a bad practice. It can lead to brittle code that's hard to maintain. Yet, in small to medium-sized businesses, where budgets and timelines are tight, a single &lt;code&gt;if&lt;/code&gt; statement might solve a customer's issue in minutes. When a high-value client requests a specific customization, writing an elaborate, reusable abstraction using polymorphism might be overkill.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What? Breaking the rules is  something to be done in no case at all? Try to be a 50-people business being asked by a 100.000+ employee Mega Corp to add some Confetti in the intranet you developed for them. What? You don't want to? Well, read the 452-page contract you  blindly signed again and look at the penalty you should pay in case you don't do it respecting the SLA.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The key, here, is understanding the trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short-term gain:&lt;/strong&gt; Immediate satisfaction of the client's need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-term cost:&lt;/strong&gt; Potential maintenance issues as more customizations pile up.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Sit #2: Comprehensive unit testing.
&lt;/h4&gt;

&lt;p&gt;The pursuit of 100% test coverage is another example where pragmatism trumps dogma. While comprehensive testing is valuable, focusing on critical paths — like the checkout flow in an e-commerce app — often delivers more ROI (Return of interest) than exhaustive tests for minor features. In my article, &lt;a href="https://cadienvan.github.io/blog/en/the-truth-about-test-coverage" rel="noopener noreferrer"&gt;The Truth About Test Coverage&lt;/a&gt;, I try to demonstrate how understanding the limits of metrics like coverage leads to better decision-making.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sit #3: Event-driven architecture.
&lt;/h4&gt;

&lt;p&gt;Event-driven architecture (EDA) is a powerful paradigm for building scalable, decoupled systems. However, using events everywhere can lead to unnecessary complexity in small applications. Even in distributed systems, many interactions might be synchronous, making RESTful APIs a more straightforward choice. The opposite is also true: in a monolithic application, finding a use case for asynchronous communication might bring huge value, even if that would mean breaking the "monolith" rule.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sit #4: Contract Testing.
&lt;/h4&gt;

&lt;p&gt;Contract testing is a methodology that ensures APIs adhere to a predefined contract. The standard approach involves manually defining these contracts, which can be time-consuming and error-prone in legacy codebases. Instead, in &lt;a href="https://cadienvan.github.io/blog/en/iterative-contract-testing" rel="noopener noreferrer"&gt;Iterative Contract Testing&lt;/a&gt;, we leveraged API responses themselves to generate contracts dynamically. This &lt;strong&gt;&lt;em&gt;fit&lt;/em&gt;&lt;/strong&gt; reduced overhead while maintaining reliability.&lt;/p&gt;

&lt;p&gt;By introducing patterns like optimistic schema updates, we sidestepped the initial burden of mapping every API. While this approach might not suit every scenario, it exemplifies how bending traditional practices can yield substantial benefits in specific contexts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rules, Exceptions, and the Pragmatic Architect.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Pragmatism in architecture isn't about ignoring the rules; it's about knowing when to break them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Why Rules Aren't Always Universal.
&lt;/h3&gt;

&lt;p&gt;The debate between &lt;strong&gt;&lt;em&gt;sits&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;fits&lt;/em&gt;&lt;/strong&gt; ultimately boils down to trade-offs. Blindly following best practices can lead to inefficiencies, while ignoring them entirely invites chaos. The art of software architecture lies in discerning the appropriate path for a given context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Over-Engineering as a Pitfall of Sits.
&lt;/h3&gt;

&lt;p&gt;Over-engineering occurs when solutions are designed with more complexity than necessary. This often stems from an overzealous application of best practices. For instance, implementing a microservices architecture for a small application can introduce unnecessary overhead in deployment, monitoring, and debugging.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategic Fits in Action.
&lt;/h3&gt;

&lt;p&gt;Conversely, there are scenarios where unconventional approaches shine. In &lt;a href="https://cadienvan.github.io/blog/en/asynchronous-batching" rel="noopener noreferrer"&gt;Asynchronous Batching&lt;/a&gt;, grouping requests in Node.js with Fastify provided a lightweight solution to repetitive tasks, reducing computational waste. While it deviated from traditional REST principles, it delivered exceptional performance improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tracking Technical Debt in Fits Scenarios.
&lt;/h3&gt;

&lt;p&gt;When breaking traditional rules in favor of a &lt;strong&gt;&lt;em&gt;fits&lt;/em&gt;&lt;/strong&gt; approach, one of the most significant risks is the accumulation of technical debt. To mitigate this, I've developed a habit of documenting these decisions through a lightweight version of Architecture Decision Records (ADRs). These simil-ADRs act as living documentation, capturing the rationale behind the deviation and providing a roadmap for revisiting the decision in the future.&lt;/p&gt;

&lt;p&gt;Each simil-ADR includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context and Problem Statement:&lt;/strong&gt; Why the &lt;strong&gt;&lt;em&gt;fit&lt;/em&gt;&lt;/strong&gt; was chosen over the &lt;strong&gt;&lt;em&gt;sit&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Considered Options:&lt;/strong&gt; What was done and how it deviates from standard practices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outcome:&lt;/strong&gt; Notes on whether the deviation served its purpose or needs to be readdressed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By maintaining this practice, I ensure that deviations are not forgotten but become part of a larger strategy. Revisiting these records allows me to assess whether they should be rectified to align with long-term goals or kept as-is because they fulfill their specific purpose effectively. This approach keeps the balance between pragmatism and architectural integrity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intentional Governance in Software Architecture.
&lt;/h3&gt;

&lt;p&gt;One fundamental yet often overlooked aspect of effective architecture is the practice of intentional governance. Governance ensures that architectural decisions align with business goals and technical needs while maintaining the flexibility to adapt to changing circumstances.&lt;/p&gt;

&lt;p&gt;Intentional governance involves defining clear principles and boundaries without overburdening teams with unnecessary restrictions. For instance, rather than mandating the use of a specific technology stack across all projects, governance might focus on broader objectives like ensuring security, scalability, and maintainability. This approach empowers teams to make context-sensitive decisions while adhering to overarching architectural goals.&lt;/p&gt;

&lt;p&gt;Core aspects of intentional governance include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Guiding Principles:&lt;/strong&gt; Establishing high-level rules that teams can interpret based on their specific contexts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision Frameworks:&lt;/strong&gt; Providing tools or processes, like Architecture Decision Records (ADRs), to document and evaluate trade-offs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Review:&lt;/strong&gt; Regularly revisiting decisions to ensure they remain aligned with evolving goals and constraints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By practicing intentional governance, organizations can strike a balance between consistency and adaptability, fostering innovation while maintaining structural integrity.&lt;/p&gt;

&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%2Fzxthvzlqoq07e0vk313d.jpg" 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%2Fzxthvzlqoq07e0vk313d.jpg" alt="Schema Sits &amp;amp; Fits" width="800" height="344"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Thank you, Alessandro Cappellozza, for this amazing representation.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Pragmatism Test.
&lt;/h3&gt;

&lt;p&gt;When deciding between &lt;strong&gt;&lt;em&gt;sits&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;fits&lt;/em&gt;&lt;/strong&gt;, consider the following questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What is the immediate goal?&lt;/strong&gt; Does this decision help achieve it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What are the long-term implications?&lt;/strong&gt; Will this create tech debt that's difficult to resolve?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the deviation simplify or complicate the system?&lt;/strong&gt; Simplicity should be a guiding principle.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Luciano Mammino, a dear friend of mine, suggested to include this awesome article which explains the Amazon model, which I suggest as an addition to this test: &lt;a href="https://thoughtbot.com/blog/one-way-vs-two-way-door-decisions" rel="noopener noreferrer"&gt;One-way vs Two-way door decisions&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Other Powerful Questions to Ask.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;"Are the rules keeping me on track, or are they unnecessarily complicating my work?"&lt;/li&gt;
&lt;li&gt;"If I break this rule, can I explain why it's justified in this context?"&lt;/li&gt;
&lt;li&gt;"Will this decision hold up under scrutiny six months from now?"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  See you in the Next One.
&lt;/h3&gt;

&lt;p&gt;In software architecture, both &lt;strong&gt;&lt;em&gt;sits&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;fits&lt;/em&gt;&lt;/strong&gt; have their place. The key is not choosing one over the other but understanding when to lean on foundational principles and when to adapt them to the context. This balance - the pragmatism in architecture - separates competent developers from great architects.&lt;/p&gt;

&lt;p&gt;As Mark Richards and Neal Ford remind us: &lt;em&gt;"Everything in software architecture is a trade-off."&lt;/em&gt; Embrace that reality, and use it to guide your decisions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Obvious things are always useful, especially when they are not obvious.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The alternative to roadmaps</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Sat, 05 Oct 2024 10:45:00 +0000</pubDate>
      <link>https://dev.to/cadienvan/the-alternative-to-roadmaps-1beo</link>
      <guid>https://dev.to/cadienvan/the-alternative-to-roadmaps-1beo</guid>
      <description>&lt;h2&gt;
  
  
  The Problem with Roadmaps
&lt;/h2&gt;

&lt;p&gt;I recently read &lt;a href="https://www.svpg.com/the-alternative-to-roadmaps/" rel="noopener noreferrer"&gt;a very interesting article&lt;/a&gt; by Marty Cagan against the concept of Roadmaps, called "The alternative to Roadmaps".&lt;/p&gt;

&lt;p&gt;In short, Marty Cagan proposes a mixed concept of &lt;em&gt;Product Vision&lt;/em&gt; and &lt;em&gt;Team Objectives&lt;/em&gt; accompanied by &lt;em&gt;OKRs&lt;/em&gt; to achieve, allowing teams to be autonomous about how to achieve certain objectives, something that a Roadmap, in itself, does not allow.&lt;/p&gt;

&lt;p&gt;Personally, I believe that a Roadmap is not the right way to allow a company to be agile, and in this respect I agree with Marty Cagan.&lt;/p&gt;

&lt;p&gt;At the same time, however, I understand its importance in terms of business. Answering the question "when will you give me my money back with interest?" can make the difference when looking for investors. Additionally, a Roadmap can be useful for communicating to customers what to expect in the future, and for giving direction to development teams.&lt;/p&gt;

&lt;p&gt;The problem, as Marty Cagan points out, is that a Roadmap provides the &lt;em&gt;what&lt;/em&gt;, but does not explain the &lt;em&gt;why&lt;/em&gt;, removing the possibility for the teams to be autonomous.&lt;/p&gt;

&lt;p&gt;Marty Cagan's idea is to make the team aware of the &lt;em&gt;why&lt;/em&gt; of a project, and to let the teams themselves decide the &lt;em&gt;what&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  My opinion
&lt;/h2&gt;

&lt;p&gt;I don't have a clear idea yet, but I think that the concept of Innovation Tokens introduced by Dan McKinley in his article &lt;a href="https://mcfunley.com/choose-boring-technology" rel="noopener noreferrer"&gt;Choose Boring Technology&lt;/a&gt; can be applied in reverse.&lt;/p&gt;

&lt;p&gt;What do I mean? That we could have Roadmap Tokens, which allow development teams to decide for themselves what to develop, but at the same time allow the company to have a vision of what to expect in the future.&lt;/p&gt;

&lt;p&gt;In the next quarter we have to develop 17 new features? Well, we have 4 Roadmap Tokens, which means we can take any four of these initiatives and decide to change them on the fly, adapting to market needs or business changes. Sometimes we will keep the goal but change the way to achieve it, other times we will change the goal itself. Having a limited number of Tokens allows us to maintain some control over initiatives, but at the same time allows teams to be autonomous.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The quiet, pervasive devaluation of frontend</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Tue, 01 Oct 2024 07:00:00 +0000</pubDate>
      <link>https://dev.to/cadienvan/the-quiet-pervasive-devaluation-of-frontend-26h7</link>
      <guid>https://dev.to/cadienvan/the-quiet-pervasive-devaluation-of-frontend-26h7</guid>
      <description>&lt;h2&gt;
  
  
  Premise
&lt;/h2&gt;

&lt;p&gt;What follows is a response to the beautiful article by Josh Collinsworth that you can find &lt;a href="https://joshcollinsworth.com/blog/devaluing-frontend" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I decided to structure this content by taking each summary quote he makes in his article and responding to each of them with my opinion.&lt;/p&gt;

&lt;p&gt;This article is therefore to be considered a series of ideas that identify a personal opinion. Of the 12 quotes reported, I found myself agreeing with &lt;strong&gt;✅ 8&lt;/strong&gt; of them, disagreeing with &lt;strong&gt;❌ 3&lt;/strong&gt; and having no opinion on &lt;strong&gt;🟡 1&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;[TL;DR]&lt;/strong&gt; I generally agree with the author’s opinion and his point of view, although in some cases the distorted view created by the article has led me to disagree with some statements. The analysis on prejudice has caused, in my opinion, just as much prejudice towards the world of development on the part of the author.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  I feel like I’m seeing a widespread diminishment of the practice of frontend. Nearly everywhere I look, I notice its importance minimized, and its challenges trivialized.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ I fully agree with this statement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The frontend has for too long been considered the “little brother” of the backend, and this is a mistake. The frontend is the part of an application that the end user sees and interacts with, and is therefore fundamental to the success of a product. Its importance cannot be underestimated, yet this happens too often, and &lt;strong&gt;I myself have sometimes considered my work as a frontend developer “inferior”&lt;/strong&gt; to what I did in the backend.&lt;/p&gt;

&lt;p&gt;Why does this happen? From my point of view, I believe it is because in the last decade the world of frontend development has been invaded by frameworks and libraries that have made work simpler and more accessible to everyone. This has led to responding to many of the problems that arose in the past, leading frontend development to become “simpler”. This has led to a devaluation of the role of the frontend developer, who is often seen as a “code monkey”. Simple, however, does not mean easy, and the frontend developer is often called upon to solve complex problems and make important decisions, precisely because he or she is no longer expected to resolve “simple” problems, already solved by the framework, but rather to enrich the user experiences in new and innovative ways.&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s like CSS exists in some bizarre quantum state; somehow both too complex to use, yet too simple to take seriously, all at once.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Here too, I agree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CSS is one of the most underrated and devalued languages in the world of web development. CSS is a powerful and complex language, which allows you to create complex and detailed user interfaces. However, the distance from the normal way of writing code, its particular syntax and its operating logic often make it difficult to master and use. CSS is a language that requires time and dedication to master, and what happened with the &lt;em&gt;CSS-in-JS&lt;/em&gt; movement is a clear example of how the community tried to solve a problem that didn’t exist by creating a new one, while also adding abstraction to an already very complex language.&lt;/p&gt;

&lt;h2&gt;
  
  
  In many ways, CSS has greater impact than any other language on a user’s experience, which often directly influences success. Why, then, is its role so belittled?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ I agree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As mentioned in response to the previous quote, I believe that the problem with CSS is due to its operating logic and its particular syntax. The problem is that it is often seen as a “secondary” language compared to JavaScript, when in reality it is a language in itself, with its rules and peculiarities, and requires a learning time comparable to that of a programming. CSS is a powerful and complex language, and its role cannot be underestimated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mostly, nobody actually says frontend is less important, or less real, or that you don’t have to be as smart to do it. But it often seems to be implied.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ I partially agree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To tell the truth, I see this theme as much more explicit than the author says. In fact, I often find myself having to debate with people who consider the frontend to be a “minor” job compared to the backend, and who believe that the frontend developer should not be a &lt;em&gt;programmer&lt;/em&gt;, but a &lt;em&gt;support&lt;/em&gt; to those who do the real work, the backend. When they ask me what my role is, I always answer &lt;em&gt;Full-Stack&lt;/em&gt;, because in my training and growth there are various and different elements, and both sides of the coin have been important and significant for me.&lt;/p&gt;

&lt;p&gt;I believe the community needs to do more to eradicate this mentality. The frontend developer is a professional in all respects, and his work is fundamental to the success of a product.&lt;/p&gt;

&lt;p&gt;The frontend developer is called upon to solve complex problems, supported by constantly evolving tools — which greatly increases the cognitive load — and to make important decisions that directly influence the user experience, the bulwark of a successful product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our output is artistic, to some degree, and artistic things have a long, storied history of being tragically devalued merely because they seem simple and enjoyable.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ I agree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lack of understanding of roles and responsibilities plays a fundamental role in our industry. The frontend developer is often seen as an “artist”, a “creative”, and his work is devalued because it is not “technical” like that of the backend developer. This is a mistake in two respects.&lt;/p&gt;

&lt;p&gt;First of all, it is often not the frontend developer who decides the design of an application, but the designer (UX, UI, call it what you want). The frontend developer is called upon to translate the design into code, and to do so in an efficient and high-performance way. This requires technical skills and specific knowledge, which go far beyond simply writing code.&lt;/p&gt;

&lt;p&gt;Secondly, as already mentioned above, the responsibilities of a frontend developer often go far beyond simply writing code. If I modify code in my backend application, the automatic tests will most likely notice any regressions sooner than I can. If I modify code in my frontend application, it is very likely that the only way to notice any regressions is to manually test the application or wait for a report from end customers*. This makes the frontend developer’s job much more complex and demanding than one might think. Not to mention the amount of &lt;em&gt;business logic&lt;/em&gt; and &lt;em&gt;state management&lt;/em&gt; — both promptly poured into the frontend — which make the role increasingly integrated with the business.&lt;/p&gt;

&lt;p&gt;*Note: I am well aware of the existence of end-to-end tests, but their implementation is much more complex and expensive than traditional automatic tests, furthermore their reliability is often questioned due to their random and external conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The language implies interfaces are decoupled from the software, and not an actual part of it.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🟡 No opinion on this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The reference here is to the paradox whereby in our sector there seems to be a difference between &lt;em&gt;Developer&lt;/em&gt; and &lt;em&gt;Engineer&lt;/em&gt; and which must necessarily be shown as &lt;em&gt;something more&lt;/em&gt;. I have no opinion on the matter, but I agree that nowadays the proliferation of titles and banners does nothing but muddy the waters with respect to what each of us actually does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing CSS seems to be regarded much like taking notes in a meeting, complete with the implicit sexism and devaluation of the note taker’s importance in the room.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ I agree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As already mentioned previously in this article, I agree about the incorrect devaluation of CSS and the frontend world in general. Furthermore, in this part of the article, reference is made to the chauvinism present in our sector, and although I have never had a direct perception of it, I understand its reality and gravity. Our industry is still too often a hostile environment for women, and I believe the community needs to do more to combat this mentality.&lt;/p&gt;

&lt;h2&gt;
  
  
  As though the nearly impossible job of supporting every possible device, operating system, screen size, browser, user preference, and interface in the past, present and future is so simple we invented all the complexity ourselves, just because we were bored.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ I agree with the intrinsic meaning of this statement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The complexity of today’s world makes the role of the frontend developer even more complex than it has ever been, and when frontend jokes and &lt;em&gt;punchlines&lt;/em&gt; become &lt;em&gt;bias&lt;/em&gt;, it’s easy to fall into the trap of devaluing the work of frontend workers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yes, as a group, we get excited about new things. But why doesn’t that make us curious, or adaptable, or inquisitive? Why don’t we get credit for our joy of learning, instead of denigrated for refusing to stay in place?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ I agree less with this one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although it is true that the evolution of the frontend world — as already mentioned previously — has led to a proliferation of ideas, tools and methodologies, &lt;em&gt;Shiny Object Syndrome&lt;/em&gt; is a real and widespread problem, especially in the frontend community. This doesn’t mean that you shouldn’t be curious or adaptable, but that you often fall into the trap of adopting new technologies without fully understanding the pros and cons, and without evaluating whether they are actually necessary or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  If our skills are valuable as duct tape over the cracks of organizational shortcomings, why aren’t they valuable during the planning and decision-making that led to those defects, when we could potentially prevent them?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Totally agree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exactly as a Software Architect (Or Tech Lead, or whoever is in charge of the architecture) must involve every member of the team in the architectural choices — despite having the last word and ultimately the responsibility over them -, also the decision-making process that leads to the creation of an application or part of it should involve every member of the team, including frontend developers. Those who have been doing this long enough may be able to find gaps in the user experience or design that others wouldn’t see, and involving them in the decision-making process can lead to a better user experience and a successful product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend tools market themselves as though frontend is something no one wants to do, and nobody should care about any more than they have to.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ You can clearly see the frustration increasing as the post develops, but in this case I can only disagree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;em&gt;marketing&lt;/em&gt; — as Josh defines it — of frontend tools has never trivialized or tried to simplify the challenges of developers, except for a few rare exceptions. These tools increasingly aim to make the frontend developer’s work simpler and more efficient, but never &lt;em&gt;banal&lt;/em&gt;, and it is right that the direction remains the same. The promise is never to make the frontend developer a &lt;em&gt;code monkey&lt;/em&gt;, but to allow him to focus on what is truly important: the creation of a successful user experience and the impact on the business and the world around him . The same goes for the backend world, where tools have evolved to allow developers to focus on the product, rather than on technical choices or configuration issues.&lt;/p&gt;

&lt;p&gt;Finally, let us remember that the world of Developer Relations has developed in a structured manner in recent years, and any missteps by some companies should not be considered the norm.&lt;/p&gt;

&lt;h2&gt;
  
  
  It seems like nobody thinks of frontend as a critical part of the product anymore; they only think of it as the nice box the product arrives in.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Here too, alas, I disagree with Josh.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The frontend is a fundamental part of a product, and its importance cannot be underestimated, but that doesn’t mean you necessarily have to indulge in complexity and abstraction. Frontend development is already complex enough to not require super-sophisticated design or abstruse architectures, and exactly as in the backend world, standardization, if done with full knowledge of the facts, allows us not to add unnecessary cognitive load and to focus on other aspects of the product.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Inevitabot. A future as inevitable as it is unpredictable.</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Sat, 28 Sep 2024 08:05:27 +0000</pubDate>
      <link>https://dev.to/cadienvan/inevitabot-a-future-as-inevitable-as-it-is-unpredictable-4102</link>
      <guid>https://dev.to/cadienvan/inevitabot-a-future-as-inevitable-as-it-is-unpredictable-4102</guid>
      <description>&lt;h2&gt;
  
  
  Premise
&lt;/h2&gt;

&lt;p&gt;What follows is my personal opinion on what I consider plausible to happen in the not too distant future, it is not a prediction, much less a certainty, and as an opinion it must be taken and evaluated.&lt;/p&gt;

&lt;p&gt;As a techno-optimist, I consider technological advancement as a whole to be a positive factor, and as such it must be encouraged and supported, but at the same time, like everything, it must be managed with attention, responsibility and above all: ethics.&lt;/p&gt;

&lt;p&gt;Where deemed possible I have indicated a year in which I consider it likely that that specific aspect can be achieved or in any case take a form similar to that described.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the vortex of technological evolution, we are getting ever closer to a future that will radically redefine our perception of work, creativity and even the very concept of intelligence. The evolutions of artificial intelligence (AI) are laying the foundations for an epochal change, where every aspect of our daily lives will be intertwined with the omnipresent presence of algorithms and intelligent machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Large Language Models: The first piece.
&lt;/h2&gt;

&lt;p&gt;The advent of Large Language Models (LLM) undoubtedly marks a turning point in the research and development of artificial intelligence, but it is only the first step in a race that promises to be intense and full of developments in the coming years. These models, such as the modern (November 2023) GPT-4, Claude, etc., have demonstrated the extraordinary ability to understand and generate human language at scale, paving the way for multiple applications in areas such as virtual assistance, creation of content, automatic translation and much more.&lt;/p&gt;

&lt;p&gt;However, the race to the cutting edge of AI is set to evolve in increasingly ambitious directions. Developers are aiming for even larger and more complex models, capable of learning from more diverse data and understanding increasingly rich contexts. This implies not only an increase in the necessary computing power but also greater attention to training and the quality of the data used to train the models.&lt;/p&gt;

&lt;p&gt;A crucial next step will be honing your contextual understanding and continuous learning ability. More sophisticated models will need to be able to understand not only the immediate meaning of words, but also the broader context in which they are used. This will require significant progress in understanding the semantics, irony, and cultural and social nuances that make human language so rich and complex.&lt;/p&gt;

&lt;p&gt;The race to the cutting edge will not only be about the size of the models, but also their ability to adapt to specific industries and domains. Customizing and adapting the capabilities of an LLM to specific contexts will become a crucial focus, enabling more specialized and refined applications, such as advanced medical care, personalized scientific research and much more.&lt;/p&gt;

&lt;p&gt;At the same time, the research will go beyond language alone. Vision, listening, understanding the environmental context and more complex interactions with users will become key objectives. AI will aim to become increasingly multimodal, integrating different input and output modalities to offer a more complete and natural experience.&lt;/p&gt;

&lt;p&gt;In conclusion, Large Language Models represent an excellent starting point, but the race in artificial intelligence is destined to expand, embracing increasingly ambitious challenges and paving the way for a future in which machines will be able to understand and interact with the world more and more like humans.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I believe it is likely that Large Language Models will become less and less impactful and that instead the focus will be oriented towards AGI around 2030–2035.&lt;/p&gt;

&lt;p&gt;My prediction is that the Turing Test will become obsolete by 2030 and will be replaced by a more sophisticated test that takes into account what, when the Turing was designed, was considered the limit to overcome.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  AGI
&lt;/h2&gt;

&lt;p&gt;AGI, or General Artificial Intelligence, represents the final goal in the field of artificial intelligence as we know it today, characterized by the ability to perform any human intellectual task. AGI is expected to not only reach, but radically surpass the capabilities of current Large Language Models (LLM), bringing artificial intelligence to an unprecedented level of understanding and adaptability.&lt;/p&gt;

&lt;p&gt;LLMs are known for their exceptional ability to understand and generate natural language, but they are limited to specific contexts and do not have a deep understanding of the physical world or human interactions beyond text. AGI, in contrast, aims to overcome these limitations, demonstrating intelligence that can be generalized across a wide range of tasks and situations.&lt;/p&gt;

&lt;p&gt;One of the key challenges in the transition to AGI will be acquiring a broader and deeper understanding of the context. The AGI should be able to extract knowledge from various sources, understand complex relationships between concepts, and apply their learning to new situations in a flexible way. While LLMs excel at manipulating language, AGI will extend to a wide range of sensory input and complex information from different sources.&lt;/p&gt;

&lt;p&gt;Furthermore, AGI will feature an advanced form of machine learning and self-improvement. This ability to continuously learn and improve its performance over time is a key element in building general AI. LLMs are powerful in their ability to learn from large datasets, but AGI will need to go further, actively adapting to new information and improving their understanding and performance on their own.&lt;/p&gt;

&lt;p&gt;Another crucial aspect is the ability to interact in a more sophisticated way with the physical environment and with humans. AGI should demonstrate social intelligence, understanding emotions, responding to nonverbal cues, and adapting to the nuances of human interactions. This represents a significant challenge compared to current language-focused models.&lt;/p&gt;

&lt;p&gt;In conclusion, while the current Large Language Models represent a significant step in the evolution of artificial intelligence, AGI is destined to radically surpass them, bringing AI to a level of complexity and understanding that will radically transform our conception of artificial intelligence and its applications. The road to AGI will be characterized by technical, ethical and social challenges that will require prudent management to ensure sustainable and responsible benefits.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My prediction is that we will reach AGI by 2040, but that it will still not be able to surpass human intelligence, although it will come very close. This will happen, in my opinion, not before 2045.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Work
&lt;/h2&gt;

&lt;p&gt;The traditional concept of work may gradually give way to an era in which employment is more like a paid hobby than a monotonous duty.&lt;/p&gt;

&lt;p&gt;The automation of repetitive tasks and the efficiency of machines in performing specific tasks will free individuals from a tiring routine, allowing them to focus on more meaningful and personally rewarding activities. The evolution of AI could transform the very nature of work, pushing society towards a model in which creativity and innovation are key values.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My prediction is that work as we know it today will be obsolete by 2050, and that by 2100 no one will be working the traditional way anymore. The period is deliberately broad as the cultural change will be so drastic that it will require a generational change or two to assimilate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Creativity
&lt;/h2&gt;

&lt;p&gt;The future of creativity stands out as an evolving landscape, in which humans continue to hold the helm, despite witnessing a radical transformation that recalls, in a singular way, the roots of the past. While artificial intelligence and advanced technologies will profoundly influence the creative process, we are likely to see a rebirth of the fundamental principles of human inspiration.&lt;/p&gt;

&lt;p&gt;In this scenario, human creativity will be more than ever a deliberate choice, a manifestation of our intrinsic capacity to imagine, innovate and express emotion. While machines can generate creative content based on models and data, the essence of human inspiration will remain irreducible to an algorithm. Art, literature, music and all forms of creative expression will retain the distinctive touch of human individuality, a signature that no algorithm can fully replicate.&lt;/p&gt;

&lt;p&gt;We may witness a return to more traditional creative practices, inspired by manual skills and craftsmanship. Nostalgia for manual workmanship and craftsmanship could become a source of inspiration, causing people to seek a return to concreteness and authenticity in an increasingly digital world. Creativity could be shaped by a fusion of ancient and modern, incorporating age-old techniques with the possibilities offered by advanced technology.&lt;/p&gt;

&lt;p&gt;However, as humans rediscover the roots of creativity, technology can still serve as a catalyst and amplifier of their ideas. Advanced tools can be used as a means to explore new creative frontiers, experiment with new media and take art to levels never seen before.&lt;/p&gt;

&lt;p&gt;Ultimately, creativity in the future will remain a deliberate act of human beings, an articulation of our uniqueness and our ability to adapt to evolving challenges. The synthesis of ancient and modern could shape a creative landscape that celebrates human diversity, recognizing that creativity is, and will continue to be, an intrinsic trait of our species.&lt;/p&gt;

&lt;h2&gt;
  
  
  Education
&lt;/h2&gt;

&lt;p&gt;The future of education promises to be a field of radical change, a place where the focus will shift from technical skills to an education more focused on humanistic, philosophical and artistic disciplines. In an era in which artificial intelligence and advanced technology will assume a predominant role in technical skills, the human essence will be increasingly reflected in subjects that challenge creativity, critical reflection and self-understanding.&lt;/p&gt;

&lt;p&gt;The humanities will become key pillars of education, encouraging students to explore history, philosophy, literature and the arts. These subjects not only offer a critical perspective on past and present human experiences, but develop analytical, communication and critical thinking skills that are fundamental to tackling the complex challenges that the future will face us.&lt;/p&gt;

&lt;p&gt;Philosophy, in particular, could emerge as a focus of education, stimulating critical and ethical thinking. In a world where decisions are increasingly influenced by algorithms and machines, philosophy will be able to offer a framework for addressing ethical and moral issues related to the use of artificial intelligence and advanced technology.&lt;/p&gt;

&lt;p&gt;Artistic disciplines, including music, painting, theater and other creative expressions, will be integrated into the fabric of education to cultivate aesthetic sensitivity and stimulate individual creativity. Culture and the arts will become vehicles for exploring human diversity, promoting understanding and empathy between individuals of different origins and perspectives.&lt;/p&gt;

&lt;p&gt;In this scenario, education will not only be a vehicle for acquiring specific knowledge, but also and above all an opportunity to develop a deep understanding of oneself and the surrounding world. The radical transformation of education will be a response to the needs of an evolving world, where distinctive human skills will be valued above simple technical knowledge, the domain of machines.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My prediction is that education will never do without technical subjects, but that they will no longer be compulsory by 2060. This ample time arises from the need for a generational change to assimilate such a radical change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Politics
&lt;/h2&gt;

&lt;p&gt;The future of politics will emerge as a context in which decisions and solutions to problems will be almost totally replaced by an ethical approach and conscious control of technological evolution.&lt;/p&gt;

&lt;p&gt;While politics has traditionally focused on solving immediate challenges, the emergence of advanced technologies and artificial intelligence will lead society to reflect on fundamental ethical questions and the long-term implications of using certain technologies.&lt;/p&gt;

&lt;p&gt;Controlling technological evolution will become a key responsibility for political leaders. While technological innovation offers extraordinary opportunities, it will be essential to mitigate the risks associated with it. Regulations and policies will need to be proactive in guiding technological development in an ethical way, ensuring transparency, security and accountability regarding new technologies.&lt;/p&gt;

&lt;p&gt;The politics of the future will be characterized by greater international collaboration in managing global technology-related challenges, such as cybersecurity, the regulation of new technological initiatives and the management of ethical implications. Joint efforts to establish ethical international standards will help shape a future where technology serves the common good.&lt;/p&gt;

&lt;p&gt;In this context, public participation and transparency will be crucial. Policy will no longer be an isolated process but will actively involve civil society, technology experts and affected communities in the decision-making process. The formation of informed and conscious policies will be essential to manage the complex challenges of an increasingly connected and technologically advanced world.&lt;/p&gt;

&lt;p&gt;In conclusion, the politics of the future will be characterized by an ethical perspective and the awareness of the need to guide technological evolution in a responsible way. In this way, political leaders will be able to face emerging challenges with a vision oriented towards the common good and long-term sustainability.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My prediction is that in a political context the application of decentralized technologies, not necessarily via blockchain but similar, will first be strongly recommended and then made mandatory with a view to transparency by 2040.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Global Issues
&lt;/h2&gt;

&lt;p&gt;Technological progress, driven by artificial intelligence and its ability to analyze data on a large scale, promises to be the bulwark that will transform our most serious daily problems into distant memories.&lt;/p&gt;

&lt;p&gt;Global warming, a phenomenon that has threatened and continues to threaten the stability of our planet, could see a solution through the implementation of advanced technologies to monitor and mitigate greenhouse gas emissions. Intelligent systems could anticipate and manage climate fluctuations, offering preventive strategies that reduce environmental impact.&lt;/p&gt;

&lt;p&gt;World hunger, one of the most complex challenges humanity faces today, could be overcome with the help of cutting-edge agricultural technologies. Artificial intelligence could optimize food production, improve distribution and ensure sustainable management of agricultural resources. Advanced monitoring systems, based on real-time data, could predict famines and coordinate timely responses to ensure that no individual goes hungry.&lt;/p&gt;

&lt;p&gt;However, as we approach this potentially utopian future, it is crucial to address the ethical and social challenges that accompany the dominance of technology. We will need to ensure that access to these solutions is equitable and that decision-making power is not concentrated in limited hands. Furthermore, we will need to carefully consider the environmental impact of the very technologies we intend to use to solve environmental problems.&lt;/p&gt;

&lt;p&gt;In summary, the future in which technology proactively prevents global problems may be on the horizon, but it is essential to adopt a holistic approach that balances technological effectiveness with an ethical and sustainable perspective. Only through a collective commitment to drive technological development responsibly can we hope to overcome the most pressing challenges of our time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The use of the conditional is intentional in this section because although technology could allow such resolutions, politics and people will have to implement them, sometimes even giving up profits. The abandonment of unbridled capitalism is a prerequisite for the resolution of these problems but given today’s society it would be presumptuous of me to assume a plausible date of event.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The truth about test coverage</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Sat, 28 Sep 2024 07:46:17 +0000</pubDate>
      <link>https://dev.to/cadienvan/the-truth-about-test-coverage-3gko</link>
      <guid>https://dev.to/cadienvan/the-truth-about-test-coverage-3gko</guid>
      <description>&lt;h2&gt;
  
  
  A powerful truth.
&lt;/h2&gt;

&lt;p&gt;Look at the following, simple and straightforward code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's write some tests for it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We got 100% coverage, right? Well, yes, we do, in fact we could say we got 400% coverage as all the code is fully tested 4 times, but &lt;em&gt;do we?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The truth is that we don't. We are testing the function with a limited set of inputs, and we are not considering edge cases, nor we are testing the function with invalid inputs.&lt;/p&gt;

&lt;p&gt;Consider the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What would happen in such a scenario? Would the function throw an error? Would it return a value? Would it break our application?&lt;/p&gt;

&lt;h2&gt;
  
  
  Be aware of the test coverage trap.
&lt;/h2&gt;

&lt;p&gt;Test coverage is a powerful tool, but it's not the ultimate solution. It's a metric that can help you understand how much of your code is being tested, but it doesn't tell you how well it's being tested.&lt;/p&gt;

&lt;p&gt;Test coverage can help you with quantity, but it can do little with quality. It's up to you to write good tests, to consider edge cases, to test your code with invalid inputs, and to make sure that your tests are meaningful and valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This was a pretty short article, I admit, still, I hope it was useful to you as a reminder of the importance of writing good tests. Remember, test coverage is a tool, not a goal. It's up to you to make the most out of it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ciao&lt;/em&gt;,&lt;br&gt;&lt;br&gt;
Michael.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Celebrating 2000 Followers on Dev.to 🎉</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Sat, 17 Aug 2024 13:47:52 +0000</pubDate>
      <link>https://dev.to/cadienvan/celebrating-2000-followers-on-devto-53ko</link>
      <guid>https://dev.to/cadienvan/celebrating-2000-followers-on-devto-53ko</guid>
      <description>&lt;p&gt;Less than a year ago, I was &lt;a href="https://dev.to/cadienvan/celebrating-1000-followers-on-devto-32f1"&gt;celebrating my first thousand followers&lt;/a&gt; on Dev.to and I just noticed I reached &lt;strong&gt;2.000&lt;/strong&gt; some days ago!&lt;/p&gt;

&lt;p&gt;I won't repeat myself, many thanks to everyone of you for this little, but important milestone.&lt;/p&gt;

&lt;p&gt;Let's go for the next thousand!&lt;/p&gt;

</description>
      <category>milestone</category>
      <category>learning</category>
      <category>development</category>
      <category>programming</category>
    </item>
    <item>
      <title>Node.js did not implement TypeScript</title>
      <dc:creator>Michael Di Prisco</dc:creator>
      <pubDate>Thu, 15 Aug 2024 20:03:28 +0000</pubDate>
      <link>https://dev.to/cadienvan/nodejs-did-not-implement-typescript-1k4p</link>
      <guid>https://dev.to/cadienvan/nodejs-did-not-implement-typescript-1k4p</guid>
      <description>&lt;p&gt;&lt;em&gt;A brief article on the reasons why Node.js did not implement TypeScript.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First things first
&lt;/h2&gt;

&lt;p&gt;What follows is an explanation of what &lt;em&gt;has been&lt;/em&gt; and what &lt;em&gt;has not been&lt;/em&gt; done in Node.js regarding TypeScript.&lt;/p&gt;

&lt;p&gt;This article is not intended to be a criticism of the Node.js team or the TypeScript team.&lt;/p&gt;

&lt;p&gt;In fact, it's quite the opposite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I seriously think the Node.js team has made the best possible choice in "implementing" TypeScript the way they did.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What I'm really stressing here is that Node.js did not implement TypeScript. They just added some sort of support for it. This is a crucial distinction that I think is often overlooked in discussions about Node.js and TypeScript.&lt;/p&gt;

&lt;p&gt;In the last couple of weeks, I counted more than 50 articles cited in newsletters I read that mentioned Node.js implemented TypeScript.&lt;/p&gt;

&lt;p&gt;I think it's time to clarify this point once and for all.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Spoiler alert: Node.js did not implement TypeScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TypeScript: a brief history and some data
&lt;/h2&gt;

&lt;p&gt;In 2010, Microsoft released TypeScript, a superset of JavaScript that adds static typing to the language. TypeScript was designed to address some of the shortcomings of JavaScript, such as the lack of type safety and the difficulty of maintaining large codebases. Since its release, TypeScript has gained popularity among developers, with many projects adopting it as their primary language.&lt;/p&gt;

&lt;p&gt;As per the latest &lt;a href="https://2023.stateofjs.com/en-US/usage/" rel="noopener noreferrer"&gt;State Of JS Survey&lt;/a&gt; TypeScript is pratically everywhere. 78% developers uses TypeScript for at least 50% of their development time, so no wonder the echo of &lt;strong&gt;"Node.js implemented TypeScript"&lt;/strong&gt; reached even the most profound corners of the web.&lt;/p&gt;

&lt;p&gt;But, just to be clear, it didn't happen. And it probably never will.&lt;/p&gt;

&lt;h2&gt;
  
  
  The issues
&lt;/h2&gt;

&lt;p&gt;There are several reasons why Node.js did not implement TypeScript. Here are what I think are the two most important ones:&lt;/p&gt;

&lt;h3&gt;
  
  
  #1: TypeScript injects things at runtime.
&lt;/h3&gt;

&lt;p&gt;Did you know what an &lt;em&gt;enum&lt;/em&gt; becomes at runtime? An object.&lt;/p&gt;

&lt;p&gt;And this is just one of the - luckily - few examples of how TypeScript injects things at runtime. This is a problem for Node.js because it would mean that the runtime would have to be aware of TypeScript's features, which would introduce a lot of complexity and overhead.&lt;/p&gt;

&lt;p&gt;If Node.js wants to keep its consistency with ECMAScript and not having to deal with dependency management for the rest of its existence, it can't accept TypeScript as a dependency in the current form.&lt;/p&gt;

&lt;h3&gt;
  
  
  #2: Semantic Versioning.
&lt;/h3&gt;

&lt;p&gt;TypeScript doesn't follow semantic versioning (semver). &lt;/p&gt;

&lt;p&gt;Node.js, on the other hand, follows semver strictly and has three different release lines (Currently, we have 18.x, 20.x, 22.x). This means that breaking changes can be introduced in minor or patch releases, which can cause compatibility issues with existing code.&lt;/p&gt;

&lt;p&gt;Also, the &lt;a href="https://github.com/nodejs/node/blob/main/BUILDING.md#supported-platforms" rel="noopener noreferrer"&gt;amount of supported platforms&lt;/a&gt; is huge, so it's not easy to keep everything in check.&lt;/p&gt;

&lt;p&gt;Node.js simply can't accept TypeScript as a dependency because it would break semver. This is a fundamental issue that prevents Node.js from implementing TypeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what did they do?
&lt;/h2&gt;

&lt;p&gt;This is where the confusion arises. Node.js did not implement TypeScript, but they did add type stripping under an experimental flag. This feature allows developers to write TypeScript code and have it compiled to JavaScript without the type information. This is a compromise that allows developers to use TypeScript in Node.js without introducing the issues mentioned above.&lt;/p&gt;

&lt;p&gt;Do you want an example? Here you go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function, when compiled with the &lt;code&gt;--experimental-strip-types&lt;/code&gt; flag, will become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;        &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;        &lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Did you see that? The types are gone and have been replaced by spaces. &lt;em&gt;But, why?&lt;/em&gt;, you might ask. Well, because doing so preserves sourcemaps references without the hassle of having a separate build process for those.&lt;/p&gt;

&lt;p&gt;Internally, this is done via a package called &lt;code&gt;amaro&lt;/code&gt; which wraps &lt;code&gt;swc&lt;/code&gt; — a well-known build tool which does the actual stripping.&lt;/p&gt;

&lt;p&gt;Of course, limitations exist, such as the inability to use TypeScript-specific features like the before-mentioned &lt;em&gt;enums&lt;/em&gt;. But still, it's a big step forward to prevent people from writing 135 config files to make a &lt;code&gt;sum&lt;/code&gt; function accept two numbers and return a third one.&lt;/p&gt;

&lt;p&gt;Ciao,&lt;br&gt;
Michael.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>typescript</category>
      <category>development</category>
    </item>
  </channel>
</rss>
