<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Davide de Paolis</title>
    <description>The latest articles on Forem by Davide de Paolis (@dvddpl).</description>
    <link>https://forem.com/dvddpl</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%2F132615%2Fc7c6d1d6-2cb8-4d37-9908-3f1393e2e7ff.png</url>
      <title>Forem: Davide de Paolis</title>
      <link>https://forem.com/dvddpl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dvddpl"/>
    <language>en</language>
    <item>
      <title>Kiro showcase: Automating Changes Across Several Repos with Spec-Driven Development and Custom Sub-Agents</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Tue, 07 Apr 2026 14:54:04 +0000</pubDate>
      <link>https://forem.com/dvddpl/kiro-showcase-automating-changes-across-several-repos-with-spec-driven-development-and-custom-8bo</link>
      <guid>https://forem.com/dvddpl/kiro-showcase-automating-changes-across-several-repos-with-spec-driven-development-and-custom-8bo</guid>
      <description>&lt;p&gt;As I mentioned in &lt;a href="https://dev.to/dvddpl/no-time-to-code-ai-as-leverage-for-engineering-leadership-274i"&gt;my previous post about engineering leadership and AI&lt;/a&gt;, I'm constantly looking for opportunities to experiment with AI-native development. Given how scarce hands-on time is in a manager's calendar, I'm often "&lt;strong&gt;vibe-coding between meetings&lt;/strong&gt;" - trying to make the most of short, focused sessions with an AI-native SDLC.&lt;/p&gt;

&lt;p&gt;In my recent talk at &lt;a href="https://www.awscommunityday.sk/sessions/generative_ai-02/" rel="noopener noreferrer"&gt;AWS Community Day Slovakia&lt;/a&gt;, I referenced &lt;strong&gt;the four archetypes of AI adoption&lt;/strong&gt; by AWS Serverless Hero Lee Gilmore. Until last year, I was a &lt;strong&gt;"&lt;em&gt;dismissive expert&lt;/em&gt;"&lt;/strong&gt;, and I still recognise that scepticism around AI in engineering almost daily - at work and online.&lt;/p&gt;

&lt;p&gt;Many sceptics limit AI to debugging tasks or use it as a glorified search engine. That's a missed opportunity.&lt;/p&gt;

&lt;p&gt;This post documents a real-world case where I used AI for a small but necessary "side-quest" that would have required several hours of tedious refactoring. It's a practical example of spec-driven development and AI-native SDLC in action.&lt;/p&gt;

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

&lt;p&gt;While reviewing IAM policies on a colleague's PR, I noticed references to DynamoDB tables that were used for Terraform state locking. &lt;strong&gt;HashiCorp deprecated DynamoDB-based state locking in Terraform 1.10 (November 2024) in favor of S3 native locking&lt;/strong&gt;: I was sure we had already updated all our 200+ repositories' Terraform backend configurations to avoid the deprecated lock mechanism. &lt;br&gt;
Was this policy an unnecessary leftover, or had we forgotten some repos? &lt;br&gt;
Or had other teams recently created new IaC using the old mechanism?&lt;/p&gt;

&lt;p&gt;Searching and fixing this was definitely out of scope for the original ticket and PR. We have bigger, more important problems to solve than this small cleanup. But as my team is responsible for our Cloud Infrastructure Platform and for Cloud Engineering practices, it bothered me that we had such an inconsistency, that we were using deprecated Terraform versions, and risked pipeline failures if a Terraform update suddenly broke things, causing panic and wasted time in feature teams.&lt;/p&gt;

&lt;p&gt;Since a manual migration/refactoring would be tedious and error-prone, this appeared like a great task for AI - not just to run a search-and-replace across 200 repos, but to explore the capabilities of several MCP servers, spec-driven development, and agent orchestration with Kiro. &lt;/p&gt;

&lt;p&gt;A well-integrated AI-native SDLC use case: simple but useful.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 1: Discovery
&lt;/h2&gt;

&lt;p&gt;Rather than manually searching through repositories, I used Kiro with the &lt;a href="https://github.com/github/github-mcp-server" rel="noopener noreferrer"&gt;GitHub MCP server&lt;/a&gt; to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find all repositories using the deprecated config&lt;/li&gt;
&lt;li&gt;Identify repos using Terraform versions below 1.10&lt;/li&gt;
&lt;li&gt;Retrieve the actual files (Terraform configs, Terragrunt files, CI workflows)&lt;/li&gt;
&lt;li&gt;Group them by codeowners for easier review coordination&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since switching to S3 object locking could corrupt state if bucket versioning isn't enabled, I also wanted to verify our buckets' configurations across all AWS accounts.&lt;/p&gt;

&lt;p&gt;Using the &lt;a href="https://github.com/awslabs/mcp?tab=readme-ov-file" rel="noopener noreferrer"&gt;AWS MCP server&lt;/a&gt; and our own &lt;strong&gt;connect-aws skill&lt;/strong&gt;, I could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically reconnected to all accounts in our AWS config&lt;/li&gt;
&lt;li&gt;Checked every S3 bucket used by these repos&lt;/li&gt;
&lt;li&gt;Verified versioning was enabled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The discovery phase took less than few minutes of actual work. The AI handled the tedious data gathering while I focused on validation and decision-making.&lt;/p&gt;

&lt;p&gt;With the data collected, I used the &lt;a href="https://www.atlassian.com/blog/announcements/remote-mcp-server" rel="noopener noreferrer"&gt;Atlassian MCP server&lt;/a&gt; to create a Jira ticket documenting the context, affected repos, and migration risks. Without leaving my IDE, all the relevant information was nicely formatted in a user story. &lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 2: Spec-Driven Development
&lt;/h2&gt;

&lt;p&gt;Rather than jumping straight to coding, I used this as an opportunity to practice spec-driven development and AI-native SDLC.&lt;/p&gt;

&lt;p&gt;I started a new project and asked Kiro to pull the Jira ticket and help write a spec.&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%2Fv0drtol2zoncglpg8bbs.png" 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%2Fv0drtol2zoncglpg8bbs.png" alt="spec-driven-development-with-kiro" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Requirements Phase
&lt;/h3&gt;

&lt;p&gt;The AI-generated requirements document captured the key aspects well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load migration targets from &lt;code&gt;repositories.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Validate Terraform version compatibility (&amp;gt;= 1.10 required)&lt;/li&gt;
&lt;li&gt;Update backend configurations via text replacement&lt;/li&gt;
&lt;li&gt;Handle edge cases (older Terraform versions, CI pipeline overrides)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I refined a few details around how pipelines use &lt;code&gt;backend-config&lt;/code&gt; flags, but overall the requirements were solid.&lt;/p&gt;
&lt;h3&gt;
  
  
  Design Phase
&lt;/h3&gt;

&lt;p&gt;This is where iteration became necessary. The AI's initial approach was a monolithic Python script - procedural and difficult to parallelize (let alone review and debug).&lt;/p&gt;

&lt;p&gt;After several iterations where I emphasized the need for orchestration, progress tracking, error correction, and race condition avoidance - basically where I tried to achieve the so-called "Ralph Wiggum Loop" (see &lt;a href="https://ghuntley.com/ralph/" rel="noopener noreferrer"&gt;Ralph Wiggum Pattern by G. Huntley&lt;/a&gt; and &lt;a href="https://github.com/mreferre/ralph-loop-kiro-specs/blob/main/ralph-loop-kiro-specs-prompt.md" rel="noopener noreferrer"&gt;Massimo Ferre's Kiro implementation&lt;/a&gt;) - we arrived at an agent-based architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Orchestrator Script
├── Spawns multiple worker agents
├── Each agent claims a repository atomically
├── Agents work in parallel
├── Shared state via migration-status.json
└── Learning system via corrections.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The design included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Atomic operations&lt;/strong&gt;: Each repo migration is independent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status tracking&lt;/strong&gt;: &lt;code&gt;migration-status.json&lt;/code&gt; prevents duplicate work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning loop&lt;/strong&gt;: &lt;code&gt;corrections.md&lt;/code&gt; records failures and solutions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Race condition protection&lt;/strong&gt;: Agents verify ownership after claiming&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tasks Phase
&lt;/h3&gt;

&lt;p&gt;Despite defining the design with an agent-based approach, the tasks initially generated by Kiro had issues: the first task was meant to write a script for subsequent tasks to use, which wouldn't work for parallel orchestrated execution.&lt;/p&gt;

&lt;p&gt;However, the task descriptions themselves were useful. Therefore I pivoted and asked Kiro to use its &lt;code&gt;/custom-agent-creator&lt;/code&gt; to create an agent (not a script) with proper tool settings and a prompt to execute the workflow.&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%2Fj6e0nzeu76h2kr4mj1fr.png" 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%2Fj6e0nzeu76h2kr4mj1fr.png" alt="custom-agent-creator" width="590" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's quite annoying that Kiro IDE creates and uses agents written in markdown, but if you rely on agents invoked as subagents or start kiro-cli directly with an agent, you need a JSON format. So usually I tend to write (or ask Kiro to create) the agent in Markdown (with frontmatter section) and then in JSON format as well (but importing the prompt from the markdown file: &lt;code&gt;"prompt": "file://migrator-agent.md"&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Phase 3: Building the Migrator Agent
&lt;/h2&gt;

&lt;p&gt;The agent prompt handled the complete workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claim a repository from &lt;code&gt;migration-status.json&lt;/code&gt; atomically&lt;/li&gt;
&lt;li&gt;Load corrections from previous failures&lt;/li&gt;
&lt;li&gt;Clone the repo and create a branch&lt;/li&gt;
&lt;li&gt;Search for the deprecated configuration using &lt;code&gt;dynamodb_table&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replace the config with the new S3 &lt;code&gt;use_lockfile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Check and update Terraform versions if needed&lt;/li&gt;
&lt;li&gt;Format the code (&lt;code&gt;terraform fmt&lt;/code&gt; / &lt;code&gt;terragrunt hclfmt&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Commit, push, and create a PR&lt;/li&gt;
&lt;li&gt;Update status (completed/failed)&lt;/li&gt;
&lt;li&gt;Clean up temp directories&lt;/li&gt;
&lt;li&gt;Record errors in &lt;code&gt;corrections.md&lt;/code&gt; for learning&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent configuration (&lt;code&gt;.kiro/agents/migrator-agent.json&lt;/code&gt;) defined the Tools that the agent has available and what are allowed with or without approval:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"mcp:github"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"mcp:atlassian"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowedTools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"fs_read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"mcp:github"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"mcp:atlassian"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"toolsSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"write"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowedPaths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&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="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fs_read"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"alwaysAllow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowedCommands"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&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="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"autoAllowReadonly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Defining the tools and what is allowed is one of the trickiest parts. I want to orchestrate agents and have as much as possible automated, and I definitely want to spend my time solving other problems rather than being a guardian/gatekeeper clicking "approve or reject" for each action. On the other hand, granting full write or shell access is concerning. Finding the right balance is important. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After running the agent on its own and addressing a couple of issues, the agent was ready to be called as a subagent. &lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 4: Orchestration
&lt;/h2&gt;

&lt;p&gt;The agent worked well sequentially, but processing 30+ repos one at a time would be slow. Therefore I asked Kiro to create an orchestrator script that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spawns 4 agents in parallel (the current maximum of kiro-cli)&lt;/li&gt;
&lt;li&gt;Monitors progress&lt;/li&gt;
&lt;li&gt;Shows real-time stats (completed, in progress, failed, pending) and pipes progress and errors&lt;/li&gt;
&lt;li&gt;Waits for all workers to finish&lt;/li&gt;
&lt;li&gt;Generates final report&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agents coordinate through &lt;code&gt;migration-status.json&lt;/code&gt; using atomic file updates with &lt;a href="https://jqlang.org/" rel="noopener noreferrer"&gt;jq&lt;/a&gt;, save the progress to that file and to a more detailed &lt;code&gt;corrections.md&lt;/code&gt; where all errors and different attempts are documented, to retry without going through the same mistakes but instead trying different approaches. &lt;/p&gt;

&lt;h2&gt;
  
  
  Necessary Reminder About AI-Generated Code
&lt;/h2&gt;

&lt;p&gt;AI-generated code can be &lt;strong&gt;confidently incorrect&lt;/strong&gt;. During this project/experiment, Kiro produced several times:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Made-up Kiro Agents' JSON schemas - which is particularly surprising since I would expect Kiro should know how it works...&lt;/li&gt;
&lt;li&gt;Non-existent commands&lt;/li&gt;
&lt;li&gt;Illogical implementations&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Always review what's generated. Think critically about the problem and solution. Challenge the AI when something seems off. Otherwise, you'll waste time debugging broken code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Results and What This Really Demonstrates
&lt;/h2&gt;

&lt;p&gt;I spent probably less than &lt;strong&gt;90 minutes&lt;/strong&gt; iterating on the entire "side-quest" - from identifying the scope of the changes (number of files and repos, type of change) and defining the prompt of the agent and putting everything together with the orchestrator (once again, not in one focused session but spread across meetings).&lt;br&gt;
Once working, all 30+ PRs were created within a few minutes.&lt;br&gt;
The amount of credits consumed was roughly ~80 (out of 1K monthly allowance with $20/month plan).&lt;/p&gt;

&lt;h4&gt;
  
  
  Was that worth it?
&lt;/h4&gt;

&lt;p&gt;The manual alternative would have required likely &lt;strong&gt;4-6 hours&lt;/strong&gt; of very repetitive work: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone each repo&lt;/li&gt;
&lt;li&gt;Find the files&lt;/li&gt;
&lt;li&gt;Make the changes&lt;/li&gt;
&lt;li&gt;Handle version updates&lt;/li&gt;
&lt;li&gt;Create PRs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tedious and error-prone&lt;/strong&gt;. Considering breaks and some meetings, working manually on this ticket would have required a full day of an engineer, and likely a very &lt;em&gt;wasted&lt;/em&gt; one - not such great conceptual work, nor a great learning experience (if not becoming faster in git clone, search &amp;amp; replace, git commit, and &lt;code&gt;gh pr create --title --body --base main&lt;/code&gt;).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The value isn't just time saved. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This project provided:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hands-on experience with AI automation and parallel agent orchestration&lt;/li&gt;
&lt;li&gt;Practice with spec-driven development (requirements → design → tasks)&lt;/li&gt;
&lt;li&gt;A learning system (corrections.md) that improves over time&lt;/li&gt;
&lt;li&gt;Reusable patterns for any bulk repository operation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I took this small opportunity ( a necessary, but not so crucial refactoring task ) as a &lt;strong&gt;training ground for more complex problems&lt;/strong&gt;. &lt;br&gt;
&lt;strong&gt;You don't learn advanced techniques by tackling the hardest problems first - you build skills incrementally.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When I face truly challenging automation needs, these patterns will be ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Worked
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MCP servers (GitHub, AWS, Atlassian) enable AI to interact with real APIs effectively - although I am already aware that MCP servers, especially for local development, are losing the attention they received last year because actually using any CLI is likely faster and cheaper. Using them allowed me to really start experimenting more with AI and see the benefit of integrating different tools to improve productivity and focus.  (Read more about the &lt;a href="https://www.scalekit.com/blog/mcp-vs-cli-use" rel="noopener noreferrer"&gt;MCP vs CLI discussion&lt;/a&gt; and &lt;a href="https://jannikreinhard.com/2026/02/22/why-cli-tools-are-beating-mcp-for-ai-agents/" rel="noopener noreferrer"&gt;why CLI tools are beating MCP for AI agents&lt;/a&gt;.)&lt;/li&gt;
&lt;li&gt;Spec-driven development forces clarity before implementation: this is something that we engineers should always do, and this is how we should have always been working (receiving well-described tickets with clear specifications and requirements, and then spending some time thinking about the problem and how to implement the solution rather than just diving into coding). Now spec-driven development finally forces us to do that.&lt;/li&gt;
&lt;li&gt;Agent-based architecture with shared state scales simply&lt;/li&gt;
&lt;li&gt;Learning loops (corrections.md) turn failures into improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Required Iteration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI defaults to monolithic solutions; modular design requires explicit guidance&lt;/li&gt;
&lt;li&gt;Generated code needs critical review before execution&lt;/li&gt;
&lt;li&gt;Edge cases emerge during testing that specs don't anticipate&lt;/li&gt;
&lt;li&gt;Despite refined prompts and clear guidance, context rot and hallucination are relatively common &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Lessons
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Use AI for discovery and data gathering before making decisions&lt;/li&gt;
&lt;li&gt;Document requirements and design - &lt;strong&gt;specs are thinking tools&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Iterate on design; don't accept the first solution&lt;/li&gt;
&lt;li&gt;Review generated code critically&lt;/li&gt;
&lt;li&gt;Test incrementally before full-scale execution&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;By taking on this side-quest - likely an improvement ticket that would have been postponed for months, if ever, due to &lt;strong&gt;low urgency and low importance&lt;/strong&gt; (and almost a day of effort) - I praticed AI-native development workflows, built reusable automation patterns, experimented with spec-driven development, and with Ralh Wiggum loop.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When faced with tedious, automatable work, using it as an opportunity to experiment and learn is more valuable than optimizing for immediate completion. The patterns and experience gained here will apply to far more complex problems in the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hope it helps!&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>ai</category>
      <category>ainativedlc</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Setting Up Kiro for Your AI-Native SDLC</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Fri, 06 Feb 2026 12:28:21 +0000</pubDate>
      <link>https://forem.com/dvddpl/setting-up-kiro-for-your-ai-native-sdlc-578c</link>
      <guid>https://forem.com/dvddpl/setting-up-kiro-for-your-ai-native-sdlc-578c</guid>
      <description>&lt;p&gt;I didn't wake up one morning and decide, &lt;strong&gt;&lt;em&gt;"Today I'm building an AI-native Software Development Life Cycle!"&lt;/em&gt;&lt;/strong&gt; It took weeks of trial and error to figure out what actually works. This post is my attempt to save you that time, so you can hit the ground running from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Context: Coding Between Meetings
&lt;/h2&gt;

&lt;p&gt;When you move from IC to Tech Lead or Engineering Manager you will face different challenges: you write less code, but you're expected to stay technical. At this point, my hands-on coding is close to zero (though I know the role of EM varies wildly depending on company and team). But I'm not just doing people stuff like 1:1s, roadmaps, vacation planning and agile ceremonies. &lt;br&gt;
The real job is still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Providing technical guidance and architecture decisions&lt;/li&gt;
&lt;li&gt;Keeping an eye on delivery and quality&lt;/li&gt;
&lt;li&gt;Mentoring the team&lt;/li&gt;
&lt;li&gt;Evaluating technical contributions&lt;/li&gt;
&lt;li&gt;Building a high-performing team where blockers get removed and &lt;strong&gt;quality, security, and automation are just how we work&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You know the difference between the &lt;a href="https://paulgraham.com/makersschedule.html" rel="noopener noreferrer"&gt;&lt;strong&gt;maker's schedule and the manager's schedule&lt;/strong&gt;&lt;/a&gt;? Yeah, that's my life now.&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%2Fcvdeyql1qym73kie9ykh.png" 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%2Fcvdeyql1qym73kie9ykh.png" alt="time management" width="402" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Still, I try to stay close to the code whenever I can. It keeps me sharp, and often &lt;strong&gt;dogfooding our own platform&lt;/strong&gt; helps me understand what pains my team members, our internal users and newly onboarded teams are going through.&lt;/p&gt;

&lt;p&gt;So I pick up tickets that are off the critical path. The grunt work. The nice-to-haves. Stuff that could take a day or a month and nobody's blocked waiting for it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation improvements&lt;/li&gt;
&lt;li&gt;Pipeline fixes and optimizations&lt;/li&gt;
&lt;li&gt;Small refactors that have been bugging people&lt;/li&gt;
&lt;li&gt;Architecture diagrams that actually reflect reality&lt;/li&gt;
&lt;li&gt;Raising the bar on code quality through better practices and conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, there's the other stuff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code reviews (even in languages I'm rusty in)&lt;/li&gt;
&lt;li&gt;Making sense of old, poorly documented repos we've inherited&lt;/li&gt;
&lt;li&gt;Cutting through documentation overhead and decision paralysis&lt;/li&gt;
&lt;li&gt;Exploring new services we might want to add to our platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a lot of hats. And the time is always scarce.&lt;br&gt;
Trying to do all this between meetings, with constant context switching and maybe 30 minutes here and there? It was rough. Until recently, &lt;strong&gt;my AI usage was pretty basic&lt;/strong&gt;: ChatGPT or Langdock for document reviews, text polishing, brainstorming. Basically a fancy Google search.&lt;/p&gt;

&lt;p&gt;For coding, I had Copilot in VS Code and Amazon Q in my terminal, but I was barely scratching the surface. &lt;em&gt;"Summarise this document", "Refactor that function", "Write me a quick shell script."&lt;/em&gt; The most useful thing was asking Q for &lt;em&gt;AWS CLI commands in plain English&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then &lt;a href="https://kiro.dev/blog/general-availability/" rel="noopener noreferrer"&gt;Kiro happened&lt;/a&gt;. When it launched (and especially when Q became Kiro in November), I immediately upgraded to Kiro Plus. Perfect timing, too—my team got hit hard with parental leave, sick days, and vacation all at once. Suddenly, I had a chance to &lt;strong&gt;get my hands dirty again&lt;/strong&gt;, yet I still can't get long, uninterrupted coding sessions. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most EMs and Staff+ engineers I know are coding in the gaps between meetings. That's exactly why AI matters so much now. We can use it to amplify what we can do in those fragmented windows of time.&lt;br&gt;
&lt;strong&gt;Turning hours into minutes&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What Changed: The Mindset Shift
&lt;/h2&gt;

&lt;p&gt;These days, Kiro is my go-to for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code Reviews&lt;/strong&gt;: Even in languages where I'm not the expert, I can provide meaningful guidance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Making sense of legacy repos and actually documenting them properly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem Structuring&lt;/strong&gt;: Taking vague requirements and turning them into something actionable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt;: Quickly exploring alternatives, surfacing trade-offs, challenging my own assumptions. And yeah, drawing diagrams (with Draw.io and Mermaid) that actually stay up to date&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision Records&lt;/strong&gt;: Writing RFCs and ADRs while the context is still in my head&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance&lt;/strong&gt;: Keeping docs and diagrams from going stale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning&lt;/strong&gt;: Getting up to speed on unfamiliar (but not necessarily new) tech&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Has it boosted my productivity? Absolutely. But I won't lie; the setup took time. Figuring out steering files, agents, hooks, MCP servers, powers... it was a lot. That's why I'm writing this: to save you the mental overhead I went through.&lt;/p&gt;

&lt;p&gt;I won't bore you with the details of setting it up. It's really straightforward and well documented: &lt;a href="https://www.youtube.com/watch?v=JOqLp1adGO4&amp;amp;t=1s" rel="noopener noreferrer"&gt;Kiro How-To&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But I want to &lt;em&gt;briefly&lt;/em&gt;  introduce Kiro features and how you can take advantage of them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Quick Note on Cost and Pricing
&lt;/h2&gt;

&lt;p&gt;Before we dive in, let's talk money. &lt;a href="https://kiro.dev/pricing/" rel="noopener noreferrer"&gt;Kiro's pricing&lt;/a&gt; is refreshingly simple: monthly plans with credits. €20 gets you 1,000 credits, €40 gets you 2,000, and €200 gets you 10,000.&lt;/p&gt;

&lt;p&gt;How fast you burn through credits? That depends on which model you're using and how complex your interactions are. Bigger context means more credits. But what I appreciate is the full cost visibility. &lt;strong&gt;Every single interaction shows you exactly how many credits it used.&lt;/strong&gt; No surprises at the end of the month.&lt;/p&gt;

&lt;p&gt;If you do run out of credits mid-month, you can pay as you go at $0.04/credit. And from the org side, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toggle overage on/off to control costs&lt;/li&gt;
&lt;li&gt;Enable detailed usage metrics (saved to S3) to see where credits are going&lt;/li&gt;
&lt;/ul&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%2Fnbd80j2m5ds7vpzzgx4g.png" 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%2Fnbd80j2m5ds7vpzzgx4g.png" alt="cost overages" width="657" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cost isn't entirely predictable, but it's transparent. After a few weeks of use, I found the middle tier works well for our workflow. The time I save on documentation, code reviews, and understanding unfamiliar codebases more than justifies the cost. Your mileage may vary depending on how you work, but the visibility makes it easy to adjust.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prompts: Reusable Instructions
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Prompt: an input or instruction you give to the AI. It tells the AI what to do, what context to consider, and how to respond. Think of it as a mix between a command, a question, and a set of guidelines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In our daily work, we have recurring tasks. Not the simple &lt;em&gt;"refactor this"&lt;/em&gt; or &lt;em&gt;"make this more professional"&lt;/em&gt; requests -  (and even these could benefit from better prompting!) - I'm talking about complex, multi-step instructions that you'd otherwise repeat every time. That's where prompt files come in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Are Prompt Files?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompt files are markdown documents stored in your project that contain reusable instructions for the AI. They're written as &lt;strong&gt;behavior guides, not templates&lt;/strong&gt; for users to fill in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where They Live&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;code&gt;.kiro/prompts/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usage: Reference with &lt;code&gt;@your-prompt&lt;/code&gt; in CLI, or mention naturally in the IDE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to Structure Them&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Write prompts TO the AI, not FOR the user. Include context, approach, and expected behavior. Here's a basic structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Prompt Name&lt;/span&gt;

You are helping the user with [specific task].

&lt;span class="gu"&gt;## Your Approach&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; First, do this
&lt;span class="p"&gt;2.&lt;/span&gt; Then, do that
&lt;span class="p"&gt;3.&lt;/span&gt; Finally, conclude with this

&lt;span class="gu"&gt;## Communication Style&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Be clear and concise
&lt;span class="p"&gt;-&lt;/span&gt; Ask clarifying questions
&lt;span class="p"&gt;-&lt;/span&gt; Provide examples

&lt;span class="gu"&gt;## Example Interaction&lt;/span&gt;

User: "Help me debug this"
You: "Let me analyze the error. First, I'll check..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Prompts We Actually Use&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are a few we've built that save us time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Review&lt;/strong&gt;: Before opening a PR, we ask AI to review all committed changes. Catches obvious issues before bothering teammates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR Generation&lt;/strong&gt;: The agent analyzes committed changes and creates a detailed summary for the PR description. Gives reviewers context upfront.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Review&lt;/strong&gt;: When jumping into an unfamiliar repository, we ask Kiro for a project review. It summarizes structure, dependencies, main components, risks, and opportunities. Helps you decide where to focus first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Steering Files: Teaching Consistent Behaviour
&lt;/h2&gt;

&lt;p&gt;If prompts let you manually instruct the AI for specific tasks,  steering files teach it to behave consistently without repeating yourself every time.&lt;/p&gt;

&lt;p&gt;Steering files are markdown documents that live next to your code and provide context, conventions, and guidelines to AI assistants. Think of them as &lt;strong&gt;persistent documentation that automatically shapes how Kiro behaves across all your sessions&lt;/strong&gt;. Instead of telling the AI your team's conventions every time, you tell it once.&lt;/p&gt;

&lt;p&gt;Other tools use similar concepts with different names (like &lt;code&gt;.rules&lt;/code&gt; files). I must say I prefer the concept of &lt;em&gt;"steering"&lt;/em&gt; because these files &lt;strong&gt;guide&lt;/strong&gt; and influence behavior rather than enforce rigid constraints. They let the AI move fast within the boundaries you've defined.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Goes in Steering Files?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kiro can generate foundational steering files (product overview, tech stack, project structure) just by reviewing your project. After that, you can add custom steering for specific areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security guidelines&lt;/li&gt;
&lt;li&gt;Testing strategies&lt;/li&gt;
&lt;li&gt;Deployment procedures&lt;/li&gt;
&lt;li&gt;Code review standards&lt;/li&gt;
&lt;li&gt;Naming conventions&lt;/li&gt;
&lt;li&gt;Architecture principles&lt;/li&gt;
&lt;li&gt;Team communication protocols&lt;/li&gt;
&lt;/ul&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%2Fwgpfzwqv495ngkep6q3p.png" 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%2Fwgpfzwqv495ngkep6q3p.png" alt="creating steering files" width="650" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Human Benefit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have read a lot of negative comments about the verbosity of AI and the sprawl of ai-context markdown files, but personally, I believe &lt;strong&gt;Steering files are just as useful for humans as they are for AI&lt;/strong&gt;. They become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Living documentation that stays close to the code&lt;/li&gt;
&lt;li&gt;Onboarding guides for new team members&lt;/li&gt;
&lt;li&gt;Quick reference for project conventions&lt;/li&gt;
&lt;li&gt;Single source of truth for standards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more I use them, the less I need those manually written READMEs with tables of contents and multiple subpages that go stale after a few weeks. Now I keep a main README for humans, the &lt;code&gt;AGENTS.md&lt;/code&gt; file &lt;a href="https://kiro.dev/docs/steering/#agentsmd" rel="noopener noreferrer"&gt;for AI Agents&lt;/a&gt; and a couple of other entry points for humans consuming or contributing to the repository. But they mostly point to the steering files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro's Smart Loading Strategy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The "always on" nature of context files could be a problem. &lt;strong&gt;Load too much, and you'll burn through credits.&lt;/strong&gt; This is where Kiro stands out: it supports three loading strategies to keep context focused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always&lt;/strong&gt;: Loaded in every conversation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;inclusion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this for core project context that's always relevant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File-Based&lt;/strong&gt;: Loaded when specific files are open&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;inclusion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fileMatch&lt;/span&gt;
&lt;span class="na"&gt;fileMatchPattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.tf"&lt;/span&gt;
&lt;span class="na"&gt;fileMatchPattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/*.ts"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/*.tsx"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/tsconfig.*.json"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this for domain-specific guidance. When you open a Terraform file, the Terraform guide loads automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manual&lt;/strong&gt;: Loaded only when referenced&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;inclusion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;manual&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this for detailed guides you only need occasionally.&lt;br&gt;
This on-demand loading keeps context focused and prevents overwhelming the AI with irrelevant information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Organisation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can write content directly in the steering file or reference another file in your repo. I tend to put shared context under &lt;code&gt;.agents/context/&lt;/code&gt; so different AI tools can reference it. Each developer can then create pointers in their tool's settings (&lt;code&gt;.cursorrules&lt;/code&gt;, &lt;code&gt;.kiro/steering/&lt;/code&gt;, etc.). More on this approach in a later post.&lt;/p&gt;

&lt;p&gt;You can read more about steering files and their conventions in the &lt;a href="https://kiro.dev/docs/steering/#creating-custom-steering-files" rel="noopener noreferrer"&gt;Kiro documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  MCP Servers: Extending Capabilities
&lt;/h2&gt;

&lt;p&gt;I covered what MCP servers are in more detail in a &lt;a href="https://dev.to/dvddpl/i-didnt-get-mcp-until-i-built-one-20c5"&gt;previous post&lt;/a&gt;. The short version: they're a great way to extend your AI tool's capabilities, and they're easy to integrate into your workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why They Matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of course, I can browse AWS docs in one tab, check GitHub in another, switch to our observability platform to look at the latest incident, then jump to Jira to update a ticket. But &lt;strong&gt;every tab/tool switch&lt;/strong&gt; is a tiny context switch. And for me, that often &lt;strong&gt;leads to distractions&lt;/strong&gt;: I open Slack to check something, then see another urgent message, reply to that, and suddenly I'm asking myself: wait, why did I leave the IDE?  (Similarly to the &lt;a href="https://simple.wikipedia.org/wiki/Doorway_effect" rel="noopener noreferrer"&gt;Doorway Effect&lt;/a&gt;)&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%2Fwuig4mvj9nakizt58euf.png" 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%2Fwuig4mvj9nakizt58euf.png" alt="doorway effect" width="201" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If I can do all of that from the same window where I'm already working, I can stay focused and move faster. (and also, less strain on fingers and wrists to use the mouse or keyboard shortcuts to switch tabs).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm Using&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I keep several MCP servers installed but I pay attention to have them enabled only on demand. Here's what I use most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;New Relic&lt;/li&gt;
&lt;li&gt;Atlassian&lt;/li&gt;
&lt;li&gt;AWS API&lt;/li&gt;
&lt;li&gt;AWS Diagram&lt;/li&gt;
&lt;li&gt;AWS Terraform&lt;/li&gt;
&lt;li&gt;AWS EKS&lt;/li&gt;
&lt;li&gt;AWS Pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real Usage Examples&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of leaving the IDE to search AWS documentation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "How do I configure Lambda function URLs?"
Kiro: *searches AWS docs*
      *provides relevant documentation*
      *suggests implementation*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, I recently discovered I can manage tasks generated by SpecDriven Development with Kiro using the &lt;a href="https://github.com/MrLesk/Backlog.md" rel="noopener noreferrer"&gt;Backlog.md MCP&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Create a task for implementing XYZ"
Kiro: *creates task in Backlog.md*
      *links to relevant spec*
      *sets priority and acceptance criteria*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A Word of Caution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Be careful with how many MCP servers you have enabled. Too many can clutter your context and slow things down. The on-demand activation helps, but it's still worth being &lt;strong&gt;selective about what you install&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'll cover Backlog.md and spec-driven development in another post. For now, let's look at how agents and powers build on these foundations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Agents: Specialised Configurations
&lt;/h2&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%2Fsx0gw8bpk59ojijk4xnk.png" 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%2Fsx0gw8bpk59ojijk4xnk.png" alt="custom agents" width="310" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agents combine prompts, steering files, and MCP servers into specialised configurations for specific tasks. Think of them as roles you can switch between, each with its own context, tools, and behaviour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How They Work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents are defined as JSON files stored in &lt;code&gt;.kiro/agents/&lt;/code&gt; (either globally or per project). You can view available agents with &lt;code&gt;/agent list&lt;/code&gt; or switch between them with &lt;code&gt;/agent swap&lt;/code&gt;. (&lt;em&gt;only in kiro-cli&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;The magic is in the packaging. Instead of manually loading the right prompts, enabling the right MCP servers, and remembering which tools to use, you reference an agent and get everything configured automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Real Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's our PlatformSupportAgent (redacted for brevity) that helps colleagues get answers about our platform offering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://raw.githubusercontent.com/aws/amazon-q-developer-cli/refs/heads/main/schemas/agent-v1.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cloudplatform-support"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Answers questions about cloud platform using documentation, Terraform, GitHub, and AWS resources"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"quite descriptive prompt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aws-documentation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"terraform"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"fsRead"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"listDirectory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"fileSearch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"grepSearch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@aws-documentation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@terraform"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@github"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowedTools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"fsRead"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"listDirectory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fileSearch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grepSearch"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"toolsSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"file://.agents/context/iac-baseline.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"file://.agents/context/code-quality.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"file://README.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"file://AGENTS.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"file://docs/**/*.md"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This agent comes pre-configured with GitHub, AWS docs, and Terraform tools, has baseline standards always loaded, and maintains the support persona throughout the conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents vs. Prompts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You might wonder: why not just use prompts? Here's the difference:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts&lt;/strong&gt; (&lt;code&gt;.kiro/prompts/*.md&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reference with &lt;code&gt;@your-prompt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Injects instructions into the current conversation&lt;/li&gt;
&lt;li&gt;Use when you want to add specific methodology to your current agent&lt;/li&gt;
&lt;li&gt;More flexible, can combine with other prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Agents&lt;/strong&gt; (&lt;code&gt;.kiro/agents/*.json&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activate with &lt;code&gt;/agent swap your-agent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Switches to a completely different &lt;em&gt;persona&lt;/em&gt; with its own tools and context&lt;/li&gt;
&lt;li&gt;Use when the task requires specific resources, tools, and persistent context&lt;/li&gt;
&lt;li&gt;More powerful for complex, recurring workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the same task, I often create both. The prompt gives me flexibility to use it with any agent. The agent gives me a complete, pre-configured environment when I need the full setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Maintenance Challenge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What I don't love about agents: &lt;strong&gt;the prompt field in the JSON can get hard to read and maintain&lt;/strong&gt;. Because of this (and to improve reusability across AI tools), I often publish agents in both JSON and Markdown formats. The Markdown version is just a human-readable version of the same content. (that can also be fed to other AI tools, to achieve similar results - although without the MCP servers and tools).&lt;/p&gt;

&lt;p&gt;I automate this with Kiro Hooks, which we'll cover next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hooks: Automation
&lt;/h2&gt;

&lt;p&gt;Hooks execute commands or trigger the agent whenever specific events occur in your IDE. Think of them as automated workflows that respond to file changes, saves, or other IDE events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Use Hooks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used to finish writing code and then remember I needed to update the documentation. Or I'd move files around and forget to update links. Hooks remove that mental overhead by automating the repetitive parts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available Triggers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hooks can respond to several events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fileEdited&lt;/code&gt;: When you save a file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fileCreated&lt;/code&gt;: When you create a new file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fileDeleted&lt;/code&gt;: When you delete a file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agentStop&lt;/code&gt;: When an agent execution completes&lt;/li&gt;
&lt;li&gt;Plus more in Kiro CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What Hooks Can Do&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When triggered, hooks can either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invoke the agent with a specific prompt&lt;/li&gt;
&lt;li&gt;Run a shell command directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A Simple Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lint on Save"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fileEdited"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"patterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"*.ts"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"then"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"askAgent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Run linter and fix errors"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;My Real-World Hook&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the hook I mentioned above, that I use to automate Agents' readability. Whenever I create or edit an agent JSON file, this hook automatically generates a readable Markdown version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Auto-convert Agent JSON to Markdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fileEdited"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"patterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"**/agents/**/*.json"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"then"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"askAgent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Convert the edited agent JSON file to a markdown format. Create a corresponding .md file with the same name in the same directory. Include all agent properties in a readable format with sections for name, description, instructions, and any other relevant fields. Explain what tools and resources the agent has available"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps my agent documentation up to date without any manual work.&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%2F6uzg7h9uvabao01ymvtd.png" 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%2F6uzg7h9uvabao01ymvtd.png" alt="creating a hook" width="653" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I'm Cautious with Automatic Triggers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I haven't gone all-in on automatic hooks yet. In these early iterations, I'm rarely happy with the first result. I don't want hooks updating all my documentation just because I created a new piece of code that I'll definitely iterate on.&lt;/p&gt;

&lt;p&gt;But hooks are powerful for truly repetitive tasks. If you find yourself doing the same thing after every file save or commit, that's a good candidate for a hook. The &lt;a href="https://kiro.dev/docs/hooks/examples/#test-coverage-maintainer" rel="noopener noreferrer"&gt;Kiro documentation&lt;/a&gt; has more examples, including one for maintaining test coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiro Powers: Composable Functionality
&lt;/h2&gt;

&lt;p&gt;If Agents are a great way of preconfiguring prompts and MCP servers for specific scenarios, meet the next level: Kiro Powers (unfortunately, not available in the CLI yet). They package documentation, workflows, and MCP servers into reusable units. Like plugins that give your AI assistant specialised knowledge and capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why They're Useful&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of seeing dozens of individual MCP tools cluttering your configuration, you see a list of installed Powers. You activate them on demand, and they automatically enable their embedded MCP servers. This keeps your context clean while providing full access when you need it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Activate-Then-Use Pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Powers use a structured discovery approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Activate a Power to see what it offers&lt;/li&gt;
&lt;li&gt;Discover available tools, documentation, and guides&lt;/li&gt;
&lt;li&gt;Use specific capabilities as needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What's Inside a Power&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Powers include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation explaining what the Power does&lt;/li&gt;
&lt;li&gt;Steering files with step-by-step guides for common tasks&lt;/li&gt;
&lt;li&gt;Best practices from the team that built it&lt;/li&gt;
&lt;li&gt;Examples showing real usage patterns&lt;/li&gt;
&lt;li&gt;MCP servers that provide the actual functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A Real Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without a Power:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"How do I find our customized SQS Terraform module?"
→ Search GitHub manually
→ Find repository
→ Read README
→ Copy module path
→ Check version tags
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With our Platform Engineering Hub Power:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I need to add SQS to our project, what should I do?"
→ AI uses GitHub MCP via the Power to search our private CustomTerraformModules repository.
→ Gets README, examples, and usage
→ Provides complete answer instantly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Building My Own&lt;/strong&gt;&lt;br&gt;
Building your own Power is very easy - and guess what, a Kiro Power exist to guide you in the process! &lt;a href="https://github.com/kirodotdev/powers/tree/main/power-builder" rel="noopener noreferrer"&gt;check it out here&lt;/a&gt;&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%2F31one4jqeyq94ix512m2.png" 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%2F31one4jqeyq94ix512m2.png" alt="IPower Builder" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, this is what I just recently started playing around; starting from the &lt;strong&gt;CloudPlatform Support Agent&lt;/strong&gt; I mentioned above, I'm currently building a Platform Knowledge-Base Power for our team. The goal is to distribute guidelines and resources in a centralised place while providing MCP servers that know where to search in our Confluence and GitHub repositories. This way, engineers can ask the AI agent questions before reaching out to us on Slack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current Limitations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've noticed that Powers can't embed agents, prompts, hooks, or scripts (for obvious security reasons). My original goal was to use Powers to distribute a baseline of AI tools, but unless I convert everything to Markdown and document it within the Power's steering files, users won't see it.&lt;/p&gt;

&lt;p&gt;Kiro Powers give you a clean, composable system. Each Power stays focused on its domain, and you activate only what you need for the current task. I'm still experimenting with them and will likely have more to share in the coming weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Skills?
&lt;/h2&gt;

&lt;p&gt;Skills are a concept from Claude that have gained traction in the broader AI tooling community. Kiro doesn't have native skills support (that's what steering files are for), but you can still use them thanks to &lt;a href="https://skills.sh/" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Skills.sh makes it easy to browse, install, and update skills from a central repository. The installation process is straightforward, and skills get copied into your &lt;code&gt;.kiro/skills/&lt;/code&gt; folder (either globally or per project).&lt;/p&gt;

&lt;p&gt;I've started experimenting with &lt;a href="https://github.com/antonbabenko/terraform-skill/blob/master/SKILL.md" rel="noopener noreferrer"&gt;AWS Hero Anton Babenko's Terraform skill&lt;/a&gt; for infrastructure work, which is genuinely useful and well-crafted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Integration Challenge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's where I'm still figuring things out: skills can be quite large and often overlap with steering files. Unlike steering files, they don't have an inclusion method (always, fileMatch, or manual). This means they're always loaded, which can bloat your context.&lt;/p&gt;

&lt;p&gt;I'm still working through how to integrate skills smoothly with my existing steering file setup. The content is valuable, but the lack of conditional loading makes it tricky to manage alongside everything else.&lt;/p&gt;

&lt;p&gt;I'll likely write a follow-up post once I've spent more time with them and figured out a good workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;This post covered the core building blocks of an AI-powered workflow with Kiro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt; for reusable instructions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steering files&lt;/strong&gt; for consistent behavior and context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers&lt;/strong&gt; for extending capabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents&lt;/strong&gt; for specialized configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; for automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powers&lt;/strong&gt; for composable functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt; for community-driven guidance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each piece serves a specific purpose, and together they create a system that amplifies what you can accomplish in those fragmented windows of time between meetings.&lt;/p&gt;

&lt;p&gt;The setup takes effort. I won't pretend otherwise. But once you have these pieces in place, the productivity gains are real. Not because the AI writes perfect code (it doesn't), but because it helps you think faster, explore alternatives quicker, and stay focused when context switching would normally derail you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Team Collaboration&lt;/strong&gt;: How to work effectively when everyone uses different AI tools (Kiro, Cursor, Claude, Copilot), and how skills.sh fits into that picture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Native SDLC&lt;/strong&gt;: What it actually looks like in practice, including spec-driven development and the Backlog.md workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're experimenting with AI in your development workflow, I'd love to hear what's working for you. What tools are you using? What problems are you trying to solve?&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kiro Documentation&lt;/strong&gt;: &lt;a href="https://kiro.dev/docs" rel="noopener noreferrer"&gt;kiro.dev/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promptz Library&lt;/strong&gt;: &lt;a href="https://www.promptz.dev/library" rel="noopener noreferrer"&gt;promptz.dev/library&lt;/a&gt; - Community prompts and templates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promptz Agents&lt;/strong&gt;: &lt;a href="https://www.promptz.dev/agents" rel="noopener noreferrer"&gt;promptz.dev/agents&lt;/a&gt; - Community agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills.sh&lt;/strong&gt;: &lt;a href="https://skills.sh/" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt; - AI skills management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AGENTS.md Standard&lt;/strong&gt;: &lt;a href="https://gradually.ai/en/agents-md/" rel="noopener noreferrer"&gt;gradually.ai/en/agents-md&lt;/a&gt; - Emerging industry standard for AI context&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kiro</category>
      <category>aws</category>
      <category>vibecoding</category>
      <category>aidevelopment</category>
    </item>
    <item>
      <title>I Didn’t Get MCP Until I Built One</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Mon, 02 Feb 2026 08:11:00 +0000</pubDate>
      <link>https://forem.com/dvddpl/i-didnt-get-mcp-until-i-built-one-20c5</link>
      <guid>https://forem.com/dvddpl/i-didnt-get-mcp-until-i-built-one-20c5</guid>
      <description>&lt;p&gt;Eight months ago, I could barely tell you what an MCP server was.&lt;br&gt;&lt;br&gt;
I’d seen the term (&lt;strong&gt;Model Context Protocol&lt;/strong&gt;) floating around on LinkedIn posts and in our AWS Community Builders Slack. Everyone seemed excited about it, but I had no idea what it was or why I should care. It felt like something for &lt;em&gt;AI people&lt;/em&gt; - “Data Science and ML Engineers” - far removed from the daily grind of my team’s cloud infrastructure tasks and platform duties.&lt;/p&gt;

&lt;p&gt;I had tried to use some of the &lt;a href="https://awslabs.github.io/mcp/" rel="noopener noreferrer"&gt;AWS Labs MCP servers&lt;/a&gt; via Amazon Q, especially the documentation and pricing ones, but my experience wasn’t that exciting. They worked well, but I treated them like plugins - useful, but opaque. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I could use them; I couldn’t explain them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then, in November, &lt;a href="https://kiro.dev/blog/general-availability/" rel="noopener noreferrer"&gt;Kiro became publicly available&lt;/a&gt;, and I started exploring its features more extensively (more on that in future posts).&lt;/p&gt;

&lt;p&gt;Around the same time, I had the chance to participate in a Proof of Concept to build an MCP server. The initial idea was to expose our public API to AI tools and LLMs through an MCP server. Once proven, the goal was to move that into the product so that customers could use it too.&lt;/p&gt;

&lt;p&gt;Of course, as I dove deeper into the topic MCP servers gradually started to make sense.&lt;br&gt;&lt;br&gt;
MCP servers are similar to APIs, but &lt;em&gt;designed for AI agents. They allow them to communicate and utilise services and datasets outside their training data.&lt;/em&gt; to In this post, I’ll go through the basic concepts as I understood and learned them (by doing).&lt;/p&gt;

&lt;p&gt;This post isn’t a guide or tutorial. You can find excellent resources around, or just ask your AI tool of choice, and you’ll get plenty of clarifications.  It's a reflection on moving from &lt;em&gt;“I have no idea what this is”&lt;/em&gt; to &lt;em&gt;“I can build and deploy one.”&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem MCP Solves: The N×M Nightmare
&lt;/h2&gt;

&lt;p&gt;Let’s start with the problem, because that’s what made everything click for me.&lt;/p&gt;

&lt;p&gt;Large Language Models are powerful, but they are &lt;em&gt;frozen in time&lt;/em&gt;. (the time when they were trained with data).&lt;br&gt;&lt;br&gt;
They don’t know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the current state of your repositories&lt;/li&gt;
&lt;li&gt;what’s in your internal documentation&lt;/li&gt;
&lt;li&gt;the status of your Jira tickets&lt;/li&gt;
&lt;li&gt;the shape of your APIs or databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we want AI tools to be genuinely useful in real engineering workflows, we need a way to safely and consistently connect them to live, external systems.&lt;/p&gt;

&lt;p&gt;That’s where integrations come in, and that’s also where things get messy very quickly.&lt;/p&gt;

&lt;p&gt;So, imagine you're building integrations for AI tools. You want your assistant to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access your GitHub repositories&lt;/li&gt;
&lt;li&gt;Query your Jira tickets&lt;/li&gt;
&lt;li&gt;Search your company’s documentation&lt;/li&gt;
&lt;li&gt;Check your database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now imagine you have multiple AI tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Desktop&lt;/li&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;ChatGPT with plugins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Without a standard:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude needs a GitHub integration
&lt;/li&gt;
&lt;li&gt;Copilot needs a GitHub integration
&lt;/li&gt;
&lt;li&gt;Cursor needs a GitHub integration
&lt;/li&gt;
&lt;li&gt;ChatGPT needs a GitHub integration
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now multiply that by Jira, your docs, your database and the math is simple:   4 AI tools × 4 data sources = &lt;strong&gt;16 custom integrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each integration is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built differently
&lt;/li&gt;
&lt;li&gt;Maintained separately
&lt;/li&gt;
&lt;li&gt;Incompatible with other tools
&lt;/li&gt;
&lt;li&gt;Duplicated effort
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s completely unsustainable. Every AI tool needs its own integration with every data source. That’s &lt;strong&gt;N×M integrations&lt;/strong&gt;, where N = AI tools and M = data sources.  &lt;/p&gt;

&lt;p&gt;With this standard protocol, instead of writing endless client integrations for each vendor, you describe your capabilities once, and any compliant AI can consume them.&lt;br&gt;&lt;br&gt;
Now you have &lt;strong&gt;N + M components&lt;/strong&gt; instead of N×M integrations. The complexity shifts from &lt;strong&gt;O(N×M)&lt;/strong&gt; to &lt;strong&gt;O(N+M)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro" rel="noopener noreferrer"&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%2Fnjg4hedoi2f3akrpg49v.png" alt="MCP server standardized protocol" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MCP is the missing universal adapter between our data sources and AI-native tools.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;MCP is like USB-C for AI tools.&lt;/em&gt;&lt;br&gt;
This is the metaphor you will find basically everywhere, and for a good reason (so I won't try to unnecessarily and awkwardly find another one).&lt;/p&gt;

&lt;p&gt;Remember before USB? Every device had its own connector:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keyboards had PS/2 ports
&lt;/li&gt;
&lt;li&gt;Mice had serial ports
&lt;/li&gt;
&lt;li&gt;Printers had parallel ports
&lt;/li&gt;
&lt;li&gt;Cameras had proprietary connectors
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You needed different ports for everything, and devices only worked with specific computers.&lt;/p&gt;

&lt;p&gt;Then USB came along: &lt;strong&gt;one standard connector that works everywhere&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;MCP does the same thing for AI tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before MCP:&lt;/strong&gt; Every AI tool had custom integrations for every data source
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After MCP:&lt;/strong&gt; One standard protocol, any MCP server works with any MCP client
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build a GitHub MCP server once → it works with Claude, Copilot, Cursor, and any future MCP-compatible AI tool.&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%2Fkb792s06ismupiempr1g.png" 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%2Fkb792s06ismupiempr1g.png" alt="Before and After MCP" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What Actually Is an MCP Server?
&lt;/h2&gt;

&lt;p&gt;So, MCP is a standard. But &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro" rel="noopener noreferrer"&gt;what’s an &lt;em&gt;MCP server&lt;/em&gt;&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Simply put, an MCP server is a program that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connects to a data source (GitHub, database, API, etc.)&lt;/li&gt;
&lt;li&gt;Exposes that data through standardized “tools”&lt;/li&gt;
&lt;li&gt;Speaks the MCP protocol so any AI can use it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Basically, an MCP server is &lt;strong&gt;a wrapper&lt;/strong&gt;, very similar to an API, but instead of several REST endpoints, you have so-called &lt;em&gt;tools&lt;/em&gt;.&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%2Fn0jibsp0idrfzjwqibn3.png" 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%2Fn0jibsp0idrfzjwqibn3.png" alt="MCP" width="311" height="162"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Magic: Self-Describing Tools
&lt;/h3&gt;

&lt;p&gt;When an MCP server connects to an AI, it announces its capabilities.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_repositories"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Search GitHub repositories"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_file_contents"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Get contents of a file from a repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"repo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI now knows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What tools are available&lt;/li&gt;
&lt;li&gt;What each tool does&lt;/li&gt;
&lt;li&gt;What parameters they need&lt;/li&gt;
&lt;li&gt;How to call them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tools are self-documenting (&lt;a href="https://modelcontextprotocol.io/docs/learn/architecture#understanding-the-tool-discovery-response" rel="noopener noreferrer"&gt;docs here&lt;/a&gt;. But you still have to be careful.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tool Overload Problem
&lt;/h3&gt;

&lt;p&gt;As soon as I started understanding and enjoying MCP servers, I began adding more and more to my setup.&lt;br&gt;
But having too many MCP servers installed - each with multiple tools retrieved (self-described) at startup - creates an unexpected issue: &lt;strong&gt;too many tools can overwhelm the AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;5 MCP servers × 20 tools each = 100 tools available&lt;br&gt;
Every time you ask the AI a question, it needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load all 100 tool definitions&lt;/li&gt;
&lt;li&gt;Understand what each does&lt;/li&gt;
&lt;li&gt;Decide which to use&lt;/li&gt;
&lt;li&gt;Execute the right one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This causes &lt;strong&gt;context bloat&lt;/strong&gt; because tool definitions consume valuable context window space and often lower accuracy because the wrong tool ( especially if poorly named) could be picked&lt;/p&gt;

&lt;p&gt;With 100 tools, every request includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 tool names&lt;/li&gt;
&lt;li&gt;100 descriptions&lt;/li&gt;
&lt;li&gt;100 parameter schemas
= &lt;strong&gt;thousands of tokens before you even ask a question!&lt;/strong&gt;
That’s why it’s important to be intentional, both as a user and as a developer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  From the User Perspective
&lt;/h4&gt;

&lt;p&gt;*&lt;em&gt;Don’t install every MCP server you find. *&lt;/em&gt;&lt;br&gt;
Ask yourself:&lt;br&gt;
Do I actually need this?&lt;br&gt;
How often will I use these tools?&lt;br&gt;
Can I enable/disable it when needed?&lt;/p&gt;

&lt;p&gt;Example configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"awslabsaws-documentation-mcp-server"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;args&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"disabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;daily&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"disabledTools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"autoApprove"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"read_documentation"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"terraform-mcp-server"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;args&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"disabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;weekly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;use&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;demand&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"autoApprove"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Different agents can have different MCP setups: my CloudOps agent uses AWS documentation and Terraform MCP servers, while a frontend agent might use React and GitHub MCP servers.&lt;/p&gt;

&lt;p&gt;You can also autoApprove safe commands so the agent executes them automatically.&lt;/p&gt;

&lt;h4&gt;
  
  
  From the MCP Server Author’s Perspective
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Use Clear Tool Naming&lt;/strong&gt;: When building your own MCP servers, use namespaced names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bad&lt;/span&gt;
- search&lt;span class="o"&gt;()&lt;/span&gt;
- get&lt;span class="o"&gt;()&lt;/span&gt;
- list&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="c"&gt;# Good&lt;/span&gt;
- github_search_repositories&lt;span class="o"&gt;()&lt;/span&gt;
- github_get_file_contents&lt;span class="o"&gt;()&lt;/span&gt;
- github_list_pull_requests&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI can filter and understand domains faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lazy Loading with Resources&lt;/strong&gt;: Some MCP servers use resources instead of many tools. (&lt;a href="https://modelcontextprotocol.io/docs/learn/server-concepts#resources" rel="noopener noreferrer"&gt;docs here&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instead of 50 tools for different docs:&lt;/span&gt;
- get_lambda_docs&lt;span class="o"&gt;()&lt;/span&gt;
- get_s3_docs&lt;span class="o"&gt;()&lt;/span&gt;
- get_ec2_docs&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="c"&gt;# One tool + resources:&lt;/span&gt;
- read_documentation&lt;span class="o"&gt;(&lt;/span&gt;resource_uri&lt;span class="o"&gt;)&lt;/span&gt;
  Resources:
  - docs://aws/lambda
  - docs://aws/s3
  - docs://aws/ec2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resources are discovered on-demand, not loaded upfront.&lt;/p&gt;

&lt;p&gt;We’ll look deeper into best practices when we actually build our first MCP server.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Transport Protocols: stdio vs Streamable HTTP
&lt;/h2&gt;

&lt;p&gt;As I dug deeper, I learned that MCP servers can communicate in two ways. (&lt;a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/transports" rel="noopener noreferrer"&gt;docs here&lt;/a&gt;)&lt;br&gt;
Understanding this helped me choose the right setup for different use cases.&lt;/p&gt;
&lt;h3&gt;
  
  
  stdio (Standard Input/Output)
&lt;/h3&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs as a local process&lt;/li&gt;
&lt;li&gt;Communication via stdin/stdout (like terminal piping)&lt;/li&gt;
&lt;li&gt;The AI client spawns and manages the process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Configuration example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/allowed/files"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When to use stdio:&lt;/p&gt;

&lt;p&gt;✅ Local tools, file systems, git operations&lt;br&gt;
✅ Great for privacy (no network)&lt;br&gt;
✅ Simple and fast&lt;br&gt;
✅ Works offline&lt;/p&gt;

&lt;p&gt;Cons:&lt;br&gt;
👎 Installed locally per machine&lt;br&gt;
👎 Hard to share across teams&lt;/p&gt;
&lt;h3&gt;
  
  
  HTTP (Remote Server)
&lt;/h3&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs as a remote HTTP service&lt;/li&gt;
&lt;li&gt;Clients connect via URL + auth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Configuration example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"company-api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.company.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ${API_TOKEN}"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When to use HTTP:&lt;/p&gt;

&lt;p&gt;✅ Shared services or APIs&lt;br&gt;
✅ Team-wide/multi-user access&lt;br&gt;
✅ Centralized updates &amp;amp; scalability&lt;/p&gt;

&lt;p&gt;Cons:&lt;br&gt;
👎 Requires network and auth setup&lt;br&gt;
👎 Slightly more complex to operate&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ecosystem
&lt;/h2&gt;

&lt;p&gt;Once I understood MCP, I realized there’s an entire ecosystem growing fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only for AWS - there is already plenty of choice --&amp;gt; &lt;a href="https://awslabs.github.io/mcp/" rel="noopener noreferrer"&gt;AWS Labs MCP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hashicorp/terraform-mcp-server" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.atlassian.com/platform/remote-mcp-server" rel="noopener noreferrer"&gt;Atlassian&lt;/a&gt; (Jira and Confluence)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/github-mcp-server" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol/servers?tab=readme-ov-file" rel="noopener noreferrer"&gt;MCP Servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpservers.org/" rel="noopener noreferrer"&gt;Awesome MCP Servers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are plenty that can really be useful and boost how you use AI to work, but be careful and selective because you might find yourself in the first week you start using MCP servers with already a dozen installed! &lt;/p&gt;

&lt;h3&gt;
  
  
  Build your own
&lt;/h3&gt;

&lt;p&gt;And of course, you can also build your own; the barrier to entry is very low:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python (&lt;a href="https://gofastmcp.com/getting-started/welcome" rel="noopener noreferrer"&gt;FastMCP&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;with TypeScript (@modelcontextprotocol/sdk) or any language that speaks JSON-RPC over stdio or HTTP --&amp;gt; &lt;a href="https://dev.toMCP/SDK"&gt;https://modelcontextprotocol.io/docs/sdk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next posts, I’ll show how we built our internal POC to showcase the concept to colleagues and management:&lt;br&gt;
wrapping parts of our public API into an MCP server so AI tools could retrieve account information by simply chatting.&lt;/p&gt;

&lt;p&gt;I’ll admit I was initially intimidated (that &lt;strong&gt;imposter syndrome never really goes away&lt;/strong&gt;), but it turns out it’s not about “adding AI”, it’s about making your system AI-accessible.&lt;/p&gt;

&lt;p&gt;From here, we’ll dive into the actual implementation.&lt;br&gt;
As we’ll see, it’s easy to start, but moving from prototype to production takes care and design.&lt;br&gt;
We’re not fully there yet, but we already have it running internally via &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/agents-tools-runtime.html" rel="noopener noreferrer"&gt;AWS Agent Core Runtime&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before we go deeper into building MCP servers, I need to introduce the tool that made this exploration possible at all: &lt;a href="https://kiro.dev/" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt;.&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%2Fyaw1qzt1cm06fzjvgrj5.png" 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%2Fyaw1qzt1cm06fzjvgrj5.png" alt="Kiro" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the title of this series suggests, this journey happened &lt;strong&gt;&lt;em&gt;Vibecoding in between meetings&lt;/em&gt;&lt;/strong&gt;. Without the right AI setup, it simply wouldn’t have been possible to stay hands-on while juggling everything else.&lt;br&gt;
In the next post, I’ll walk through how I set up Kiro (both the CLI and the IDE) cover its core capabilities (hooks, steering, and powers), and share the MCP servers, skills, and prompts that genuinely changed how I work with AI agents.&lt;br&gt;
They didn’t just make the experience more enjoyable; they made my limited time far more effective.&lt;/p&gt;

&lt;p&gt;Stay tuned.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>kiro</category>
      <category>aws</category>
      <category>mcp</category>
    </item>
    <item>
      <title>No Time to Code: AI as Leverage for Engineering Leadership</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Mon, 26 Jan 2026 08:24:00 +0000</pubDate>
      <link>https://forem.com/dvddpl/no-time-to-code-ai-as-leverage-for-engineering-leadership-274i</link>
      <guid>https://forem.com/dvddpl/no-time-to-code-ai-as-leverage-for-engineering-leadership-274i</guid>
      <description>&lt;p&gt;Let’s be honest: nobody gets into engineering and aspires to climb the career ladder - whether on the technical or managerial track—because they &lt;strong&gt;love meetings&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We get into software engineering because we enjoy solving problems. And we do that with code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of course, at some point - especially for EMs, Directors, and above - the problems become less technical and more &lt;em&gt;strategic&lt;/em&gt; or people-oriented: how to lead the people who are solving technical problems.&lt;/p&gt;

&lt;p&gt;Yet, as we progress in our careers, the time to do exactly that—solving problems through coding—seems to shrink year after year. Hard skills appear less required or less frequently applied (even though they remain the foundation of your work), while more and more soft skills are demanded. And we need those soft skills to navigate meetings.&lt;/p&gt;

&lt;p&gt;Meetings for technical alignment, meetings for requirement specification, meetings for stakeholder management, meetings for  architecture design and reviews, and so on.&lt;br&gt;
Calendars fill up. Context switching becomes the norm. And quickly, you find yourself opening your IDE less and less—and when you do, it’s mostly to review other people’s code or to create documentation and diagrams.&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%2Fc80s9a0j1ts77no4v0pd.png" 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%2Fc80s9a0j1ts77no4v0pd.png" alt=" " width="800" height="678"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://sketchplanations.com/manager-time-maker-time" rel="noopener noreferrer"&gt;Makers time vs Managers time&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At some point, you might start asking yourself: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;when was the last time I actually built something end-to-end?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is one of the hardest truths of stepping up: &lt;strong&gt;Code becomes less important.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The expectation changes. You’re no longer measured by how much code you write, but by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how you connect teams and domains&lt;/li&gt;
&lt;li&gt;how you communicate with stakeholders&lt;/li&gt;
&lt;li&gt;how you share knowledge&lt;/li&gt;
&lt;li&gt;how you set direction and standards&lt;/li&gt;
&lt;li&gt;how you amplify impact across the organization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And at that point, it becomes clear that &lt;strong&gt;it was never really about the code&lt;/strong&gt; itself.&lt;br&gt;
It was about the problems you solved with it.&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%2Fb23umvf1s80be66gkt3i.png" 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%2Fb23umvf1s80be66gkt3i.png" alt="don't define yourself just as a coder" width="800" height="999"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://techleadjournal.dev/episodes/243/" rel="noopener noreferrer"&gt;Quote from this interesting episod of the Tech Lead Journal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At senior levels, you still solve highly technical problems - but differently:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You design systems, review architectures, reason about trade-offs, write RFCs and ADRs, guide others, and try to make decisions that will age well. For EMs especially, the focus shifts further toward &lt;strong&gt;delivery, team dynamics, and creating the conditions for teams to succeed&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Among all this &lt;em&gt;"talking about work"&lt;/em&gt;, the technical part often feels squeezed into the margins. So the question becomes: &lt;strong&gt;when do we actually &lt;em&gt;“do the work”&lt;/em&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Became Obsessed with Productivity and Simplicity
&lt;/h2&gt;

&lt;p&gt;I have a confession to make: I am &lt;strong&gt;kind of &lt;em&gt;lazy&lt;/em&gt;.&lt;/strong&gt; &lt;br&gt;
Not the type of laziness that makes me lie on the couch all day or shy away from responsibility and hard work. It’s a very specific kind of laziness.  Especially &lt;strong&gt;when I don’t like doing something, I try to become so good and so fast at it that I can get it over with and move on as quickly as possible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I never really loved coding for its own sake. I never found deep joy in typing brackets, semicolons, or chasing syntax errors. What I really hated were the headaches: trying to get a legacy project up and running, digging through outdated docs, obscure comments, convoluted logic, and unclear or inconsistent naming conventions.&lt;/p&gt;

&lt;p&gt;I hate avoidable complexity and cognitive overload. I hate doing the same task over and over again. &lt;/p&gt;

&lt;p&gt;Over time, that turned into an obsession with simplicity, quality, and productivity - not because I want to work less, but because I want to solve problems once and solve them well. And because I want to use my skills and brainpower for more important things. &lt;/p&gt;

&lt;p&gt;That mindset is exactly why I’m very open — almost eager — to experiment with AI.&lt;br&gt;
I didn’t jump blindly on the AI bandwagon. The hype does not carry me away, and I remain skeptical and cautious in many circumstances.&lt;/p&gt;

&lt;p&gt;But the potential to reduce the tedious, boring, error-prone work that consumes so much of our time is undeniable. And that’s not all.&lt;/p&gt;

&lt;p&gt;I genuinely believe AI can help &lt;em&gt;all&lt;/em&gt; engineers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Juniors, by providing structure and feedback&lt;/li&gt;
&lt;li&gt;ICs, by accelerating implementation and iteration&lt;/li&gt;
&lt;li&gt;Staff+ engineers and EMs, by reducing coordination and documentation overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different stages, different leverage points.&lt;/p&gt;

&lt;p&gt;For me, the real promise of AI isn’t “&lt;em&gt;write more code faster.&lt;/em&gt;”&lt;br&gt;
It’s enabling an AI-native SDLC that helps us &lt;strong&gt;think better, decide faster, and capture knowledge more effectively&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI as a Multiplier of the SDLC
&lt;/h2&gt;

&lt;p&gt;The Software Development Life Cycle (SDLC) has 6 core stages.&lt;/p&gt;

&lt;h3&gt;
  
  
  1️⃣ Requirement Analysis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Understand what needs to be built and why.&lt;br&gt;
&lt;strong&gt;Activities&lt;/strong&gt;: Gather business and technical requirements, define user stories or use cases, identify constraints and success criteria.&lt;br&gt;
&lt;strong&gt;Output&lt;/strong&gt;: Approved requirement specification or backlog.&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ System Design
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Define how the system will meet the requirements.&lt;br&gt;
&lt;strong&gt;Activities&lt;/strong&gt;: Architecture decisions (e.g., microservices, cloud topology), data modeling, API/interface definitions, security and scalability considerations.&lt;br&gt;
&lt;strong&gt;Output&lt;/strong&gt;: Design documents, architecture diagrams, and tech stack choices.&lt;/p&gt;

&lt;h3&gt;
  
  
  3️⃣ Implementation (Development)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Build the product according to the design.&lt;br&gt;
&lt;strong&gt;Activities&lt;/strong&gt;: Code development, unit testing, version control, continuous integration, peer review.&lt;br&gt;
&lt;strong&gt;Output&lt;/strong&gt;: Source code with passing unit tests; deployable build artifacts.&lt;/p&gt;

&lt;h3&gt;
  
  
  4️⃣ Testing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Validate that the system behaves as expected and meets acceptance criteria.&lt;br&gt;
&lt;strong&gt;Activities&lt;/strong&gt;: Integration, regression, performance, and user acceptance testing (automated and manual).&lt;br&gt;
&lt;strong&gt;Output&lt;/strong&gt;: Quality‑assured release candidate.&lt;/p&gt;

&lt;h3&gt;
  
  
  5️⃣ Deployment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Deliver the working system into its target environment (staging → production).&lt;br&gt;
&lt;strong&gt;Activities&lt;/strong&gt;: Infrastructure provisioning, configuration, CI/CD pipelines, rollback strategy, deployment validation.&lt;br&gt;
&lt;strong&gt;Output&lt;/strong&gt;: Production system live and monitored.&lt;/p&gt;

&lt;h3&gt;
  
  
  6️⃣ Maintenance &amp;amp; Operations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Keep the system stable, secure, and evolving.&lt;br&gt;
&lt;strong&gt;Activities&lt;/strong&gt;: Monitoring, incident response, patching, scaling, feature enhancements, collecting feedback for the next iteration.&lt;br&gt;
&lt;strong&gt;Output&lt;/strong&gt;: Updated, reliable system with continuous improvement loop.&lt;/p&gt;

&lt;p&gt;Each stage has specific activities and produces concrete artifacts. While often presented as a linear sequence, in reality these stages overlap, interleave, and repeat across multiple iterations.&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%2F3sqtabp1h6tvwybcqh1d.png" 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%2F3sqtabp1h6tvwybcqh1d.png" alt=" " width="397" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently, there’s been a lot of discussion about how AI can boost the SDLC — both by improving individual stages and by fundamentally reshaping the lifecycle itself. This is where the idea of an AI-Driven Development Life Cycle (AI-DLC) comes in.&lt;/p&gt;

&lt;p&gt;The AI-DLC is often simplified into three macro phases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inception&lt;/strong&gt;: What are we building, and why?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Construction&lt;/strong&gt;: How are we building it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt;: How do we ship and run it safely?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At each stage, the cycle repeats: &lt;strong&gt;&lt;em&gt;plan, clarify, execute, approve.&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
The partnership between humans and AI is strong - and necessary -with humans remaining the input source and control gate.&lt;/p&gt;

&lt;p&gt;Regardless of how your current development lifecycle looks, the key question isn’t the exact model. What really matters is how we leverage AI to do more, faster, and better - depending on seniority and on the level of zoom (a single feature, a bug fix, or a long-term product roadmap).&lt;/p&gt;

&lt;p&gt;While ICs tend to focus heavily on implementation, testing, and maintenance, Staff+ engineers and EMs have much higher stakes in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understanding the problem correctly&lt;/li&gt;
&lt;li&gt;designing the right architecture&lt;/li&gt;
&lt;li&gt;making and documenting good decisions&lt;/li&gt;
&lt;li&gt;sharing knowledge clearly and consistently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And this is where AI can have a disproportionate impact.&lt;/p&gt;

&lt;p&gt;AI can help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structure vague or incomplete problem statements&lt;/li&gt;
&lt;li&gt;explore architectural alternatives quickly&lt;/li&gt;
&lt;li&gt;surface trade-offs and challenge assumptions&lt;/li&gt;
&lt;li&gt;draft RFCs, ADRs, and best practices while context is still fresh&lt;/li&gt;
&lt;li&gt;keep documentation and diagrams up to date&lt;/li&gt;
&lt;li&gt;support learning when tackling unfamiliar (but not necessarily “new”) problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, AI can hallucinate. Yes, it needs steering. And yes, judgment still matters. But used critically, it dramatically speeds up learning, reduces friction, and lowers the cost of doing the right thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  From "No time to Code" to "AI-DLC"
&lt;/h2&gt;

&lt;p&gt;Although week after week I find myself further away from hands-on coding, I still love technical challenges. And it’s still my responsibility to steer my team toward building a high-quality platform for our engineering organization—meaning scalable and reliable cloud architectures, useful and easy-to-use modules, and clear documentation, best practices, and guidelines that empower engineers.&lt;br&gt;
Between roadmap alignment meetings, 1:1s, hiring, agile rituals, and incident response, I’m left with very little time to support my team technically or review code and documentation.&lt;/p&gt;

&lt;p&gt;So when an opportunity recently arose for my team to support our Data team in building and deploying a prototype MCP server integrating our API, I jumped on it. It was the perfect chance to start experimenting with an AI-native SDLC / AI-DLC while:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;staying technically sharp despite a packed calendar&lt;/li&gt;
&lt;li&gt;validating ideas through prototypes, not just discussions&lt;/li&gt;
&lt;li&gt;reducing overhead around documentation and alignment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This series documents that journey — not as a polished playbook, but as learning in public.&lt;/p&gt;

&lt;p&gt;In the next posts, I will start showing you how I set up my &lt;a href="https://kiro.dev/" rel="noopener noreferrer"&gt;AWS Kiro IDE&lt;/a&gt;, how a AI-native SDLC actually looks like day-to-day, and how I began applying it in a real proof of concept.&lt;/p&gt;

&lt;p&gt;More to come.&lt;/p&gt;




&lt;p&gt;Useful Resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/de/blogs/devops/ai-driven-development-life-cycle/" rel="noopener noreferrer"&gt;AI-Driven Development Life Cycle: Reimagining Software Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://builder.aws.com/content/376vNVPtBqlCvqIjHPub8iPBSxa/sdlc-who-meet-ai-dlc-the-new-build-loop" rel="noopener noreferrer"&gt;SDLC Who? Meet AI-DLC: The New Build Loop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/awslabs/aidlc-workflows" rel="noopener noreferrer"&gt;AI-DLC (AI-Driven Development Life Cycle)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/de/blogs/apn/transforming-the-software-development-lifecycle-sdlc-with-generative-ai/" rel="noopener noreferrer"&gt;Transforming the Software Development Lifecycle (SDLC) with Generative AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Other articles you might be interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/dvddpl/strive-for-simplicity-2131"&gt;Strive for simplicity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dvddpl/the-screw-and-the-hammer-love-the-problems-not-your-solutions-2i0a"&gt;The screw and the hammer: Love the problems, not your solutions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dvddpl/learn-how-to-ask-good-questions-be-aware-of-the-xy-problem-1ic3"&gt;Learn how to ask good questions. Be aware of the XY Problem.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Header Picture: Me at AWS Community Day Rome 2024 &lt;/p&gt;

</description>
      <category>engineeringmanager</category>
      <category>ai</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Road To Compliance: Will Your Internal Users Hate Your Platform Team?</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Sat, 10 Jan 2026 09:19:55 +0000</pubDate>
      <link>https://forem.com/dvddpl/road-to-compliance-will-your-internal-users-hate-your-platform-team-1jk5</link>
      <guid>https://forem.com/dvddpl/road-to-compliance-will-your-internal-users-hate-your-platform-team-1jk5</guid>
      <description>&lt;p&gt;Picture this: It's Thursday, 10:20 AM. You're the Engineering Manager of the Platform Team, and you've just called a "DevOps &amp;amp; Compliance Meeting." You announce new mandatory guidelines that must be implemented by next week, deployments will break without them, and no, this wasn't discussed with Product Managers. The room fills with frustrated voices: "Will this break our deployments?" "We already planned our sprint!" "Was this discussed with our PMs?!"&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%2Fzdu379hlv4f6lf4elxan.png" 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%2Fzdu379hlv4f6lf4elxan.png" alt="Compliance weekly meeting - cloud police"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sound familiar? This scenario plays out in engineering organizations everywhere (where security and platform teams often play the "&lt;em&gt;cloud police&lt;/em&gt;"). And it's exactly where we found ourselves.&lt;/p&gt;

&lt;p&gt;When I joined my current company to rebuild and grow the platform team, we were a cloud-native organization that had outgrown its single-account AWS setup. With 15 teams and ~80 engineers, we faced classic scaling challenges:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational Overhead&lt;/strong&gt;: When you scale your organization from a handful of developers working on a monolith to multiple autonomous teams, operational and organizational overhead multiplies—monitoring, roadmap alignment, interfaces and contracts, backward/forward compatibility across services and APIs, security, and deployment pipelines all become more complex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance Chaos&lt;/strong&gt;: How do you monitor compliance, enforce best practices, and attribute ownership and costs across a growing infrastructure?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Friction&lt;/strong&gt;: Every compliance initiative feels like extra work, new constraints, and broken workflows.&lt;/p&gt;

&lt;p&gt;The previous platform team had literally burned out trying to build too much with too few resources. They were ambitious — dreaming of an &lt;strong&gt;Internal Developer Platform&lt;/strong&gt;, a Service Catalog, a Cloud Center of Excellence. But fear of &lt;strong&gt;vendor lock-in&lt;/strong&gt; led to over-reliance on self-hosted solutions.  (I suggest this great post by Gregor Hophe about &lt;a href="https://martinfowler.com/articles/oss-lockin.html" rel="noopener noreferrer"&gt;lock-in&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting with the foundational choice of using Kubernetes to run our workloads (at least it was on AWS EKS), to basically everything else (image registries, access management, security scanning)—a plethora of self-hosted tools (Keycloak, Rancher, Longhorn, Harbor) had to be learned, configured, hosted, and maintained on our Kubernetes cluster. All of this burdened the small platform team, and they eventually collapsed under the weight of their own ambitions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am already strongly opinionated about Kubernetes - and that is the topic of another talk I co-hosted at several conferences last year too &lt;a href="https://dev.to/aws-builders/serverless-vs-kubernetes-the-final-showdown-why-we-decided-to-hold-this-talk-and-where-to-go-44ee"&gt;Serverless vs Kubernetes: the final showdown&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Building the Foundation
&lt;/h2&gt;

&lt;p&gt;We needed a fundamentally different approach. Our first step was establishing a proper multi-account landscape using AWS Organizations. This wasn't just about separation—it was about creating the foundation for everything that followed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🗄 Isolation&lt;/strong&gt;: Data, infrastructure, and access boundaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Security Controls&lt;/strong&gt;: Tailored policies for different applications
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 Quota Allocation&lt;/strong&gt;: Individual quotas for projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💰 Cost Allocation&lt;/strong&gt;: Separate billing and budgets by domain/team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To reduce operational overhead, we replaced self-hosted tools with AWS native services. This facilitated security and compliance while dramatically reducing the burden on our team.&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%2Fpjykmq91uzd9jw65kmg0.png" 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%2Fpjykmq91uzd9jw65kmg0.png" alt="self-hosted vs aws native"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Human Challenge
&lt;/h2&gt;

&lt;p&gt;Despite the obvious benefits to us and the security team, developers saw only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extra work&lt;/li&gt;
&lt;li&gt;New setups&lt;/li&gt;
&lt;li&gt;More constraints&lt;/li&gt;
&lt;li&gt;Broken routines&lt;/li&gt;
&lt;li&gt;Forced learning of new skills&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although frustration was building on our side as well (&lt;em&gt;why did everything seem so difficult for the developers, despite our goodwill and efforts in supporting them?&lt;/em&gt;), we couldn't ignore the fact that all these changes were genuinely difficult. We were the ones literally responsible for &lt;strong&gt;"engineering enablement"&lt;/strong&gt;, so we couldn't just tell people: "&lt;em&gt;We made this decision, here's the documentation, make those changes, live with it&lt;/em&gt;" especially when our documentation was overly detailed, extremely boring, and worse, often outdated.&lt;/p&gt;

&lt;p&gt;We knew how to solve the technical challenges, but how were we supposed to support our initiative without solving the cultural ones?&lt;/p&gt;

&lt;h2&gt;
  
  
  Tagging: A Deceptively Simple Problem
&lt;/h2&gt;

&lt;p&gt;We decided to revamp an old initiative that hadn't been particularly successful: tagging AWS resources. Per-se, this is a very trivial task, just add some key-value pairs to your resources. The reasons why tagging is crucial are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ownership Attribution&lt;/strong&gt;: Who owns this resource? Who should we contact when issues arise?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Allocation&lt;/strong&gt;: Which team or project should be billed for this resource?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Management&lt;/strong&gt;: IAM and resource policies can be scoped by owner tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident Response&lt;/strong&gt;: Quickly identify affected teams and applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Reporting&lt;/strong&gt;: Track resources by environment, sensitivity, and regulatory requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Early on, we made the mistake of treating tagging as "just metadata," assuming teams would adopt it once the rules were defined. That didn't work. Tagging only becomes effective when clearly connected to outcomes developers actually care about, like cost visibility, ownership, and faster incident resolution.&lt;/p&gt;

&lt;p&gt;We started small by defining a minimal, opinionated set of required tags and making them easy to apply through infrastructure-as-code templates and platform defaults. Instead of enforcing everything upfront, we focused on visibility first: showing teams where tags were missing, what that meant in terms of cost and accountability, and how to fix it with minimal effort.&lt;/p&gt;

&lt;p&gt;Over time, we gradually introduced stronger guardrails using Tag Policies and Service Control Policies, but only after teams understood the value and had the right tooling in place. The result was much better adoption, fewer exceptions, and a shared understanding that tagging wasn't "platform bureaucracy," but an enabler for governance and FinOps.&lt;/p&gt;

&lt;p&gt;Let me dive into the technical details that made this possible. Understanding the differences between these AWS services is crucial for implementing effective compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tag Policies vs. Service Control Policies: Understanding the Difference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS Organizations Tag Policies: The Standardization Layer
&lt;/h3&gt;

&lt;p&gt;Tag Policies help you standardize tags across your organization by defining allowed keys and values:&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%2F2t5cnf0jcpasy6yvd7m1.png" 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%2F2t5cnf0jcpasy6yvd7m1.png" alt="tag policies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Tag Policies do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define standardized tag keys across the organization&lt;/li&gt;
&lt;li&gt;Specify allowed values for each tag&lt;/li&gt;
&lt;li&gt;Validate tag values during resource creation&lt;/li&gt;
&lt;li&gt;Provide compliance reporting on tag usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Critical limitation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They validate values but &lt;strong&gt;don't prevent resource creation without tags&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Resources can still be created with missing tags&lt;/li&gt;
&lt;li&gt;They're about standardization, not enforcement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Service Control Policies (SCPs): The Prevention Layer
&lt;/h3&gt;

&lt;p&gt;SCPs provide hard enforcement by preventing actions that don't meet your requirements:&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%2Fixo1dibxfy1la9xraxag.png" 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%2Fixo1dibxfy1la9xraxag.png" alt="SCPs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What SCPs do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevent resource creation without required tags&lt;/li&gt;
&lt;li&gt;Apply at account-level or OU-level&lt;/li&gt;
&lt;li&gt;Cannot be overridden by any user or role in the account&lt;/li&gt;
&lt;li&gt;Provide true enforcement of compliance policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Critical challenge:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can break deployments if not carefully implemented&lt;/li&gt;
&lt;li&gt;Requires thorough testing before activation&lt;/li&gt;
&lt;li&gt;Should only be enabled after teams are informed and prepared&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  The Key Difference: Validation vs. Prevention
&lt;/h4&gt;

&lt;p&gt;Here's the crucial distinction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tag Policies&lt;/strong&gt; say: "&lt;em&gt;If you're going to use the 'Environment' tag, it must be one of these values: production, staging, development  (not _prod&lt;/em&gt;, not &lt;em&gt;live&lt;/em&gt;, not &lt;em&gt;test&lt;/em&gt;)"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Control Policies&lt;/strong&gt; say: "You cannot create an EC2 instance unless it has an 'Environment' tag."&lt;/p&gt;

&lt;p&gt;This was all good and effective. But if we had simply rolled out those policies—informing teams a couple of sprints ahead and warning them that deployments would break without proper tags — we knew chaos would break loose. Teams were already stretched thin with product deadlines and feature commitments. They had little time, and even less interest, in making changes that didn't directly contribute to their goals. The tagging requirement would inevitably be forgotten, postponed, and only remembered when deployments failed at the worst possible moment.&lt;/p&gt;

&lt;p&gt;Avoiding this scenario was the main cultural and collaborative change we wanted to introduce (compared to the previous team's approach).&lt;/p&gt;

&lt;h2&gt;
  
  
  Inform Before You Enforce
&lt;/h2&gt;

&lt;p&gt;So instead of jumping straight to enforcement, we needed a different approach: &lt;strong&gt;detect untagged resources first, then inform teams about what needed to change and why.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The good news? AWS provides separate tools for informing and enforcing compliance. We could use &lt;strong&gt;Security Hub Resource Tagging Standard&lt;/strong&gt; to detect issues and give teams visibility, then only later enforce the rules through policies once everyone was on board.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Security Hub Resource Tagging Standard: The Detection Layer
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;AWS Security Hub Resource Tagging Standard&lt;/strong&gt; is a foundational security standard that became our compliance visibility engine. Here's what it actually does:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Capabilities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically discovers and evaluates resources across all AWS accounts&lt;/li&gt;
&lt;li&gt;Checks for the presence of required tags on resources&lt;/li&gt;
&lt;li&gt;Generates findings for non-compliant resources&lt;/li&gt;
&lt;li&gt;Provides compliance scoring and trending over time
&lt;strong&gt;What it doesn't do:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It doesn't prevent resource creation&lt;/li&gt;
&lt;li&gt;It doesn't validate tag values (only presence)&lt;/li&gt;
&lt;li&gt;It doesn't enforce anything—it only detects and reports&lt;/li&gt;
&lt;/ul&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%2Fsxpvotvrd4s9zzcgb0wb.png" 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%2Fsxpvotvrd4s9zzcgb0wb.png" alt="Security Hub Tagging STandard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was perfect for our "inform before enforce" strategy. We could see the compliance landscape without breaking anyone's deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Hub Tagging Standard&lt;/strong&gt; says: "Here are all the resources that don't have the required tags."&lt;/p&gt;

&lt;p&gt;Understanding the differences between Tagging Standard, Tagging Policies, and SCPs is essential for implementing a phased compliance approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Three-Layer Governance Strategy
&lt;/h2&gt;

&lt;p&gt;We implemented a comprehensive tagging governance strategy using these three complementary services:&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: Tag Policies (Standardization)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: Prevent tag chaos and inconsistency&lt;/li&gt;
&lt;li&gt;Define allowed tag keys and values&lt;/li&gt;
&lt;li&gt;Ensure consistency across the organization&lt;/li&gt;
&lt;li&gt;Validate values when tags are present&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Layer 2: Security Hub + Config (Detection &amp;amp; Reporting)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: Provide visibility and inform teams&lt;/li&gt;
&lt;li&gt;Continuously monitor compliance&lt;/li&gt;
&lt;li&gt;Generate findings for non-compliant resources&lt;/li&gt;
&lt;li&gt;Track compliance trends over time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Layer 3: Service Control Policies (Prevention)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: Ensure compliance for critical resources&lt;/li&gt;
&lt;li&gt;Prevent resource creation without required tags&lt;/li&gt;
&lt;li&gt;Hard enforcement at the account/OU level&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We activated these layers in sequence, not all at once.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Soft Enforcement Process: Detection Without Disruption
&lt;/h2&gt;

&lt;p&gt;Following the principle  &lt;strong&gt;don't block deployments—detect and inform instead.&lt;/strong&gt; we ended up not just using Tag Policies, SCPs, and Security Hub out of the box, but building a custom serverless solution that leveraged these services along with AWS Config, Lambda, EventBridge, SQS, and Chatbot to create two complementary enforcement mechanisms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution 1: Real-Time Detection and Notification
&lt;/h3&gt;

&lt;p&gt;Instead of blocking the deployment of untagged resources with SCPs, we allow them to be created but detect them immediately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AWS Config&lt;/strong&gt; monitors all resource creation events in real-time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EventBridge&lt;/strong&gt; filters for "ConfigurationItemChanged" events with "ResourceDiscovered" status, checking for missing mandatory tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda&lt;/strong&gt; processes each finding to identify the owner by correlating:

&lt;ul&gt;
&lt;li&gt;CloudTrail events&lt;/li&gt;
&lt;li&gt;CreatedBy tags&lt;/li&gt;
&lt;li&gt;Resource naming patterns&lt;/li&gt;
&lt;li&gt;CI/CD infrastructure metadata (GitHub Actions runs, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQS&lt;/strong&gt; buffers the findings to aggregate multiple resources from the same deployment (avoiding Slack spam)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Chatbot&lt;/strong&gt; sends a friendly but firm Slack notification to the responsible team: "Hey, we saw what you just deployed! It's missing tags, but we're letting it through for now. Here's how to fix it..."&lt;/li&gt;
&lt;/ol&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%2Fuafefsy1ysdbzebov562.png" 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%2Fuafefsy1ysdbzebov562.png" alt="there are rules"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The processing interval is carefully tuned — fast enough to provide timely feedback, but slow enough to batch related resources from the same CI/CD run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution 2: Weekly Progress Reporting
&lt;/h3&gt;

&lt;p&gt;For existing infrastructure and tracking overall progress, we built a separate reporting pipeline:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;EventBridge&lt;/strong&gt; triggers a Lambda on a weekly schedule&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda&lt;/strong&gt; fetches all Security Hub findings related to tagging compliance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noise filtering&lt;/strong&gt; removes:

&lt;ul&gt;
&lt;li&gt;AWS-managed resources&lt;/li&gt;
&lt;li&gt;Temporary resources (spot instances, auto-scaling test instances)&lt;/li&gt;
&lt;li&gt;Resources in exempted accounts (sandbox, development)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregation&lt;/strong&gt; groups findings by team and calculates compliance metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQS&lt;/strong&gt; buffers the aggregated reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report generator&lt;/strong&gt; creates:

&lt;ul&gt;
&lt;li&gt;Jira tickets for teams to plan into their sprints [well.. actually were are not there yet!]&lt;/li&gt;
&lt;li&gt;Slack messages celebrating progress and thanking collaborative teams&lt;/li&gt;
&lt;li&gt;Gentle pokes for teams falling behind&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Decoupling real-time monitoring from weekly reports gives teams a grace period&lt;/strong&gt;. They can quickly add tags after deployment but before the weekly report runs.&lt;/p&gt;

&lt;p&gt;This is soft enforcement — it doesn't slow down development, but it makes non-compliance visible and trackable. Teams can work &lt;strong&gt;"eventually compliant"&lt;/strong&gt; by planning the automatically generated tickets into their regular sprints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Previous Efforts Failed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Loss of focus&lt;/strong&gt; on either goals or people&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over-engineering&lt;/strong&gt; compliance controls without considering team experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not listening&lt;/strong&gt; enough and imposing too much&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Works Instead
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus on urgent and high-impact items&lt;/strong&gt; first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define clear purpose&lt;/strong&gt; and iterate based on feedback&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combine automation, communication, and empathy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mix soft and hard enforcement&lt;/strong&gt; strategically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make compliance visible and measurable&lt;/strong&gt; without breaking workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Phased Rollout That Actually Worked
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Monitor Only (Security Hub)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collect baseline compliance data&lt;/li&gt;
&lt;li&gt;Identify patterns and common violations&lt;/li&gt;
&lt;li&gt;Build team awareness through reporting&lt;/li&gt;
&lt;li&gt;Start with a minimal set of required tags (3-4 tags max)&lt;/li&gt;
&lt;li&gt;Gradually iterate and expand Tag Policies based on feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Soft Enforcement (Notifications)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy real-time Slack notifications for new violations&lt;/li&gt;
&lt;li&gt;Launch weekly progress reports and Jira ticket creation&lt;/li&gt;
&lt;li&gt;Refine Tag Policies to add more allowed values as teams requested them&lt;/li&gt;
&lt;li&gt;Iterate on tag requirements based on actual usage patterns&lt;/li&gt;
&lt;li&gt;Continue to adjust and improve the tag schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: Selective Hard Enforcement (SCPs)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activate SCPs only for critical resources in production accounts&lt;/li&gt;
&lt;li&gt;Keep development/sandbox accounts with soft enforcement only&lt;/li&gt;
&lt;li&gt;Gradual expansion based on compliance rates&lt;/li&gt;
&lt;li&gt;Final iteration on Tag Policies to lock in the standardized schema&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Insights from Our Journey
&lt;/h2&gt;

&lt;p&gt;Our tagging compliance initiative taught us valuable lessons that apply to any internal compliance effort—not just tagging. Here's what we discovered:&lt;/p&gt;

&lt;p&gt;Our approach has shifted compliance from a source of friction toward a more collaborative effort:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proactive Communication&lt;/strong&gt;: Teams now receive actionable, timely feedback when resources are created without proper tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visible Progress&lt;/strong&gt;: Weekly reports show improvement over time, celebrating wins and identifying areas needing attention
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Resistance&lt;/strong&gt;: Informing before enforcing and empowering team champions has helped build trust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ongoing Journey&lt;/strong&gt;: Compliance is an ongoing process, not a one-time project—we're still iterating and improving&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The technical implementation was the easy part. The hard part? The human factors. Here's what our experience highlighted:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Empower Team Champions
&lt;/h4&gt;

&lt;p&gt;Instead of imposing rules from the top, empower champions within product teams to carry ownership of compliance topics. This scales your influence and reduces resistance.&lt;br&gt;
(We're still learning how to identify and support these champions effectively. It's not a one-and-done activity—it requires ongoing investment and relationship building.)&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Communication and Trust
&lt;/h4&gt;

&lt;p&gt;Share your goals openly and adjust your approach as priorities shift. Make your communication style collaborative, not prescriptive. This means regular check-ins, transparent roadmaps, and being willing to say "we got this wrong" when feedback reveals issues.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Quick Wins and Momentum
&lt;/h4&gt;

&lt;p&gt;Start with quick wins, build momentum, and iterate with patience and empathy. As Robin Sharma says: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Change is hard at first, messy in the middle, and gorgeous at the end."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(We're still in the "messy middle" for many initiatives. Progress isn't linear, and that's okay.)&lt;/p&gt;
&lt;h4&gt;
  
  
  4. Tour of Duty Model
&lt;/h4&gt;

&lt;p&gt;Involve representatives from engineering teams early through temporary rotations. Engineers join the platform team for a fixed period (or vice-versa), providing direct feedback while spreading platform knowledge back to their home teams.&lt;br&gt;
This creates empathy in both directions — platform engineers understand product pressures, and product engineers understand platform constraints.&lt;/p&gt;
&lt;h2&gt;
  
  
  A Framework You Can Use
&lt;/h2&gt;

&lt;p&gt;Our biggest realisation was how much the human factors mattered more than the technical implementation. The AWS services worked as expected (in a matter of days of development). The hard part was - and continues to be - building trust, communicating effectively, and maintaining empathy when teams push back.&lt;/p&gt;

&lt;p&gt;Our Minimum Viable Governance framework can be applied to any internal compliance initiative—security policies, cost controls, access management, or anything else:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define clear purpose&lt;/strong&gt; and communicate it openly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assess urgency vs. impact&lt;/strong&gt; to prioritize efforts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inform before you enforce&lt;/strong&gt; using automated systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure and communicate progress&lt;/strong&gt; regularly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate based on feedback&lt;/strong&gt; from your internal users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empower team champions&lt;/strong&gt; to drive adoption&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This isn't just about tagging. It's about how platform teams can drive any compliance initiative without becoming "the cloud police."&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion: Compliance as a Collaborative Journey
&lt;/h2&gt;

&lt;p&gt;The question isn't whether your internal users will hate your Platform Team — it's whether you'll give them reasons to.&lt;br&gt;
The real work (for Platform Teams, DevEx teams, or even Security teams ) is understanding that compliance is fundamentally a people problem, not (only) a technology problem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your internal users are your customers too. Treat them with the same care you'd give external customers, and they'll become your biggest advocates rather than your biggest obstacles.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  About This Post
&lt;/h2&gt;

&lt;p&gt;This blog post is a written adaptation of my conference talk "Road to Compliance: Will Your Internal Users Hate Your Platform Team?" which I presented at several conferences throughout 2024 and 2025.&lt;/p&gt;

&lt;p&gt;I wanted to document both our compliance journey and the content of the talk in written form, making it easier to reference and share with others facing similar challenges. While the live presentations included interactive discussions and Q&amp;amp;A sessions that brought additional insights, this post captures the core narrative, technical implementation details, and lessons learned from our experience.&lt;/p&gt;

&lt;p&gt;If you prefer video format, you can watch recordings of the talk here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/qFXo_j07dyE?si=vBhQZuWodgNKOSeG" rel="noopener noreferrer"&gt;AWS Community Day Italy April 2025 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/5kdlCG6OgVw?si=DZhl1Xd22IMpsi_2" rel="noopener noreferrer"&gt;Come To Code September 2025 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devsummit.infoq.com/presentation/munich2025/road-compliance-will-your-internal-users-hate-your-platform-team" rel="noopener noreferrer"&gt;InfoQ Munich October 2025 - video coming soon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/5kdlCG6OgVw"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Feel free to reach out if you'd like to discuss platform engineering, compliance strategies, or building better developer experiences!&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources and Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/securityhub/latest/userguide/tagging-standard.html" rel="noopener noreferrer"&gt;AWS Security Hub Resource Tagging Standard Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_tag-policies.html" rel="noopener noreferrer"&gt;AWS Organizations Tag Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html" rel="noopener noreferrer"&gt;Service Control Policies Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-cloudwatch-events.html" rel="noopener noreferrer"&gt;Managing Security Hub Findings with EventBridge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>compliance</category>
      <category>aws</category>
      <category>serverless</category>
      <category>publicspeaking</category>
    </item>
    <item>
      <title>The Culture Map: Book review and reflections from an EM Leading International Teams</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Tue, 06 Jan 2026 07:17:23 +0000</pubDate>
      <link>https://forem.com/dvddpl/the-culture-map-book-review-and-reflections-from-an-em-leading-international-teams-4hb</link>
      <guid>https://forem.com/dvddpl/the-culture-map-book-review-and-reflections-from-an-em-leading-international-teams-4hb</guid>
      <description>&lt;p&gt;I’ve just finished reading &lt;a href="https://www.amazon.com/Culture-Map-INTL-ED-Decoding/dp/1610392760" rel="noopener noreferrer"&gt;The Culture Map: Breaking Through the Invisible Boundaries of Global Business by Erin Meyer&lt;/a&gt;, and I absolutely loved it because it finally explained my past 10+ years of international teamwork in a way that made me think: "&lt;em&gt;oh… so THAT’s what was going on&lt;/em&gt;".&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%2Fuvlzt14f2mai7vro3oj8.png" 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%2Fuvlzt14f2mai7vro3oj8.png" alt="book cover"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m currently an Engineering Manager leading a fully remote platform engineering team based in Germany, with team members from Germany, India, and Tunisia (and myself being Italian). Previously, I led a fully distributed team comprising colleagues from Egypt, Jordan, Ukraine, Turkey, and Brazil (a few were in Germany, living as expats, therefore with at least some exposure to German culture and international environment). And before that, I was working as Software Engineer in teams with people from Albania, Russia, Spain, Scotland and US. &lt;/p&gt;

&lt;p&gt;Looking back, The Culture Map gave language, structure, and explanations to many situations that had previously caused confusion, frustration, and unnecessary friction.&lt;/p&gt;

&lt;p&gt;This post is both a short summary of the book’s core ideas and a personal reflection on what I learned, sometimes the hard way, about leading across cultures.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Eight Scales of the Culture Map
&lt;/h2&gt;

&lt;p&gt;Erin Meyer describes culture not as a set of stereotypes, but as &lt;strong&gt;relative&lt;/strong&gt; positioning across eight behavioural scales. Every culture sits somewhere on each scale, and misunderstandings often arise when we assume others are positioned where we are.&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%2Fd7pmmveb09sqgd09wzx1.png" 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%2Fd7pmmveb09sqgd09wzx1.png" alt="example positioning on the culture map scales"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Very briefly:&lt;/p&gt;

&lt;h3&gt;
  
  
  Communicating: Low-context vs. High-context
&lt;/h3&gt;

&lt;p&gt;How much is said explicitly vs. implicitly.&lt;br&gt;
Some cultures rely heavily on context, shared understanding, and what is not said; others value clarity, precision, and explicitness.  &lt;/p&gt;
&lt;h3&gt;
  
  
  Evaluating: Direct vs. Indirect negative feedback
&lt;/h3&gt;

&lt;p&gt;How feedback, especially critical feedback, is given and most importantly, how comfortable people are with blunt criticism. &lt;/p&gt;
&lt;h3&gt;
  
  
  Persuading – Principles-first vs. Applications-first
&lt;/h3&gt;

&lt;p&gt;How people build arguments: starting from theory and concepts, or from practical examples and concrete use cases.&lt;/p&gt;
&lt;h3&gt;
  
  
  Leading – Egalitarian vs. Hierarchical
&lt;/h3&gt;

&lt;p&gt;How power distance shows up in teams, decision-making, and expectations toward managers.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deciding: Consensual vs. Top-down
&lt;/h3&gt;

&lt;p&gt;Who decides, and how much input is expected.&lt;/p&gt;
&lt;h3&gt;
  
  
  Trusting: Task-based vs. Relationship-based
&lt;/h3&gt;

&lt;p&gt;Whether trust is built primarily through reliability and delivery, or through personal relationships and time spent together.&lt;br&gt;
(by the way, speaking of performance and trust - here's a great video  by Simon Sinek) &lt;br&gt;


  &lt;iframe src="https://www.youtube.com/embed/kJdXjtSnZTI"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h3&gt;
  
  
  Disagreeing: Confrontational vs. Avoids confrontation
&lt;/h3&gt;

&lt;p&gt;How openly people challenge ideas, debate, and express (and react to) disagreement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduling: Linear-time vs. Flexible-time
&lt;/h3&gt;

&lt;p&gt;How people relate to time, deadlines, agendas, and plans.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Individually, none of these are good or bad. Problems arise when we unconsciously assume our position on the scale is “normal” and everything else is wrong - when we treat our way  (explicit over implicit, structured over flexible, confrontational instead of harmony-seeking, task-focused instead of relationship-driven) as the only reasonable one, and everyone else must therefore be just rude, lazy, unreliable, dishonest, disorganised.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why This Book Was Eye-Opening for Me
&lt;/h2&gt;

&lt;p&gt;Reading this book felt like replaying old team interactions - so precisely that it was at times funny and embarrassing.&lt;br&gt;
Many situations that had previously frustrated me, or others,  were not about competence, motivation, or personality. They were about &lt;strong&gt;cultural mismatches we never made explicit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What makes this especially interesting in my case is my own cultural mix.&lt;/p&gt;

&lt;p&gt;I’m Italian (from the north, which already comes with footnotes), but I’ve lived for 18 months between Australia and New Zealand, and I’ve been living and working (with international teams) in Germany for over 13 years. In many ways, I’ve become &lt;em&gt;more German than Germans&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I value clear scheduling and planning&lt;/li&gt;
&lt;li&gt;I’m comfortable with direct disagreement&lt;/li&gt;
&lt;li&gt;I trust through delivery and reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yet… the Italian side still shows up loudly, sometimes literally.&lt;/p&gt;

&lt;h2&gt;
  
  
  I got that! Do you think I am stupid?
&lt;/h2&gt;

&lt;p&gt;One of the first scales where I laughed out loud was high-context vs. low-context communication; because the example in the book described exactly how I (Italian, relatively high-context) tend to react when working with people from lower-context cultures like Germany or the US.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Stop stating the obvious! We talked about that,  you don’t need to repeat it three times and then send me a follow-up email.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I find low-context communication overly specific, verbose, and sometimes even condescending or patronising, stating the obvious, adding excessive detail, recapping things that were clearly already understood (at least in my head).&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%2Fksdhcwb57vk4e5j4u6qq.png" 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%2Fksdhcwb57vk4e5j4u6qq.png" alt="high-vs-low context"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When dealing with Americans and Germans I often found this style boring and unnecessary.&lt;br&gt;
And yet with colleagues from Brazil, India or Giordan I often found myself thinking or asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Why didn’t you ask immediately if it was unclear?”&lt;br&gt;
“How could you miss the requirements so badly?”&lt;br&gt;
“We talked about this! didn’t you get the decision we made in the meeting?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From my perspective, it was obvious. From theirs, it wasn’t and they were often waiting for signals, confirmation, or shared context that I assumed was already there.&lt;br&gt;
What I thought was clear, was, in fact, just implicit while what I perceived as over-communication was often just safety.&lt;/p&gt;

&lt;p&gt;Understanding this scale helps adjust in both directions: being more explicit than feels natural to me, without assuming others are being pedantic or mistrustful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest Feedback shock
&lt;/h2&gt;

&lt;p&gt;I consider myself a fairly direct person, and I’m generally very open to criticism. But… in Italy we usually soften feedback, sometimes a lot. We dance around it. We add context, empathy, and occasionally so many disclaimers that the actual message risks getting lost entirely.&lt;/p&gt;

&lt;p&gt;Germans, on the other hand, often separate ideas from people with almost surgical precision.&lt;/p&gt;

&lt;p&gt;I still remember one of my first code design review meetings in Germany. I presented a solution and asked for feedback:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What do you think of it?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A German colleague looked at it for a moment and then very calmly said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Oh. That’s a silly idea. I don’t agree with that.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No smile. No softener. No “but maybe we could…”&lt;/p&gt;

&lt;p&gt;At that moment, I felt embarrassed and quite angry at that unnecessary rudeness. Over time, though, I learned to appreciate this style. There is &lt;strong&gt;no sugar-coating,&lt;/strong&gt; no backstabbing, and no “everything is fine” in the meeting followed by complaints afterwards. &lt;strong&gt;You know exactly where you stand.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of course, being polite, constructive, and specific still matters everywhere. But without cultural awareness, it’s very easy to feel personally attacked or to unintentionally attack others, when in reality, it’s just a different way of delivering feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Winging It
&lt;/h2&gt;

&lt;p&gt;Another chapter that felt painfully accurate: scheduling and meetings.&lt;br&gt;
My meeting style was ( often still is ) very Mediterranean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No agenda, just a vague title/topic of discussion.&lt;/li&gt;
&lt;li&gt;Let the discussion flow&lt;/li&gt;
&lt;li&gt;See where the conversation takes us&lt;/li&gt;
&lt;li&gt;end when it feels right&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That worked well with some colleagues but from germans I also received very clear feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calendar invites without an agenda (with time slots!) were confusing&lt;/li&gt;
&lt;li&gt;Meetings that “derailed” were frustrating&lt;/li&gt;
&lt;li&gt;Decisions and next steps were unclear&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I still value some flexibility, but again,  adapting to the context and being aligned on the expectations makes meetings dramatically more effective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disagreement and Expressiveness
&lt;/h2&gt;

&lt;p&gt;One of the most mind-blowing chapters for me was about disagreeing and expressiveness and this is where I’ve had the most trouble in the past (and sometimes still do).&lt;/p&gt;

&lt;p&gt;As an Italian, I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use my hands a lot&lt;/li&gt;
&lt;li&gt;Change tone and facial expressions&lt;/li&gt;
&lt;li&gt;Get passionate when discussing ideas&lt;/li&gt;
&lt;/ul&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%2Ft8ao0ysvqgr1vrk5fs3o.gif" 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%2Ft8ao0ysvqgr1vrk5fs3o.gif" alt="italian expressiveness"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To me, this means: &lt;em&gt;&lt;strong&gt;I care about the topic.&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
To others, it sometimes means: &lt;em&gt;I am furious and attacking them personally.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’ve had people (from Germany, UK or Russia) tell me later they were surprised that two minutes after a heated discussion, I was perfectly calm and even joking, with the same person I had the &lt;em&gt;conflict&lt;/em&gt; with.&lt;br&gt;
What felt like a lively debate about ideas to me felt like a distressing argument for others.&lt;/p&gt;

&lt;p&gt;This can even become more complex:&lt;/p&gt;

&lt;p&gt;Colleagues from Brazil or some Arab cultures may be even more expressive than Italians but handle confrontation very differently.&lt;/p&gt;

&lt;p&gt;Colleagues from India or East Asian cultures may find open disagreement overwhelming or inappropriate.&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%2F0mjjipj5q1ha0c2k2mvn.png" 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%2F0mjjipj5q1ha0c2k2mvn.png" alt="expressiveness vs confrontation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I recently experienced this again while traveling in Thailand. I was surprised and honestly annoyed by &lt;strong&gt;how impossible it is get a clear “no.”&lt;/strong&gt; Instead, refusals were phrased in ways that sounded like a “yes,” which was incredibly confusing to me.&lt;/p&gt;

&lt;p&gt;The book helped me see that this wasn’t dishonesty or avoidance but a deeply ingrained cultural approach to harmony and face-saving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same Same, But very different
&lt;/h2&gt;

&lt;p&gt;The main takeaway of the book is that &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are all the same and we are all very different.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Individual personality matters a lot. But cultural traits absolutely play a role, often subconsciously.&lt;/p&gt;

&lt;p&gt;Leading international teams feels to me like another level of &lt;strong&gt;situational leadership&lt;/strong&gt;: understand, adapt, and make the implicit explicit.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Situational leadership is the idea that there is no single “best” leadership style. Effective leaders continuously adapt their approach (&lt;strong&gt;directing, coaching, supporting, delegating&lt;/strong&gt;) based on context, the people involved, their experience, the situation, and the environment.&lt;br&gt;
Leading international teams simply adds another dimension to this: culture. What motivates, reassures, or challenges someone in one cultural context may confuse or discourage someone in another. The core skill, then, is not knowing all cultures perfectly, but being curious, adaptable, and willing to adjust your default behavior.&lt;/p&gt;
&lt;/blockquote&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%2Fu3x27qmuvpb9kf7v66si.png" 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%2Fu3x27qmuvpb9kf7v66si.png" alt="situational leadership"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This also means practising humility, especially when pointing out the idiosyncrasies of other cultures, while acknowledging our own.&lt;/p&gt;

&lt;p&gt;"They" are not&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rigid: they value structure&lt;/li&gt;
&lt;li&gt;Disorganised: they operate in flexible time&lt;/li&gt;
&lt;li&gt;Unreliable: they prioritize relationships&lt;/li&gt;
&lt;li&gt;Confrontational: they separate ideas from people&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Labelling people based on our own cultural lens is easy but dangerous.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Awareness to Practice
&lt;/h2&gt;

&lt;p&gt;Awareness alone is not enough. What really matters is collectively discussing and agreeing on how we work together. This book showed me that &lt;strong&gt;talking about these differences explicitly as a team&lt;/strong&gt; is crucial.&lt;/p&gt;

&lt;p&gt;I’ve used Team Canvases (sometimes called  Team Charters) many times to define vision, purpose, roles, and stakeholders. But I never thought of using them to align on &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Communication styles&lt;/li&gt;
&lt;li&gt;Feedback expectations&lt;/li&gt;
&lt;li&gt;Meeting norms&lt;/li&gt;
&lt;li&gt;Decision-making&lt;/li&gt;
&lt;li&gt;Disagreement and escalation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although recently, I’ve also introduced Manual of Me / Personal Readmes to support onboarding and mutual understanding. Now I see how well these practices complement the ideas from The Culture Map.&lt;/p&gt;

&lt;p&gt;I think in the near future I will start introducing in 1:1s the book and the 8 dimensions of the culture map and then have a team session to discuss altogheter and position ourselves on the culture map.   I found a great &lt;a href="https://miro.com/de/templates/culture-map-workshop-template/" rel="noopener noreferrer"&gt;Miro Template to facilitate the session&lt;/a&gt; and I will likely update this post with some sort of form/cheat sheet to facilitate the discussion.   &lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The Culture Map is an outstanding book that should be on the shelf of anyone working &lt;strong&gt;with or within&lt;/strong&gt; international teams.&lt;/p&gt;

&lt;p&gt;It doesn’t give simple answers but it provides us with a shared language to talk about differences without judgment.&lt;/p&gt;

&lt;p&gt;And sometimes, that alone can save you from yet another meeting where everyone leaves slightly confused, mildly offended, and convinced the others are just… weird.&lt;/p&gt;

&lt;p&gt;Highly recommended.&lt;/p&gt;

</description>
      <category>leadership</category>
      <category>bookscorner</category>
      <category>growthmindset</category>
      <category>collaboration</category>
    </item>
    <item>
      <title>Vibecoding in Between Meetings: Learning MCP Servers and Building a PoC ( with AWS Kiro)</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Fri, 19 Dec 2025 03:19:52 +0000</pubDate>
      <link>https://forem.com/dvddpl/vibecoding-in-between-meetings-learning-mcp-servers-and-building-a-poc-with-aws-kiro-dkm</link>
      <guid>https://forem.com/dvddpl/vibecoding-in-between-meetings-learning-mcp-servers-and-building-a-poc-with-aws-kiro-dkm</guid>
      <description>&lt;p&gt;A few weeks ago, an opportunity came up for my team to collaborate with our datascience team on a small prototype: &lt;strong&gt;building and deploying an MCP server&lt;/strong&gt;. Nothing massive. No big roadmap commitment. Just a chance to explore something new and see if it could be useful.&lt;/p&gt;

&lt;p&gt;I took it. Not only because the topic was interesting, but because it gave me an excuse to do something I don’t get to do often anymore: &lt;strong&gt;get my hands dirty again.&lt;/strong&gt;&lt;br&gt;
I wanted to learn how MCP servers actually work, what capabilities AWS AgentCore offers (and what / alternatives exist) and whether this whole &lt;em&gt;AI-native development&lt;/em&gt; hype holds outside inspirational talks and LinkedIn influencers' posts.&lt;/p&gt;

&lt;p&gt;It also felt like a good opportunity to experiment with an &lt;strong&gt;AI-native SDLC&lt;/strong&gt; in practice, not just as a concept, but as a way of working.&lt;br&gt;
I used AI to structure my learning, bootstrap experiments, and iterate on ideas quickly. Partly for myself, and partly to understand how this could help drive AI adoption more broadly across our organisation.&lt;/p&gt;

&lt;p&gt;This experience sparked two ideas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This would make a good conference talk&lt;/li&gt;
&lt;li&gt;I should write about it while it’s still fresh, messy, and honest and create a serie of posts where I &lt;strong&gt;learn in public&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Talk (Rough, Temporary Abstract)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Vibecoding in Between Meetings: Building &amp;amp; Deploying MCP Servers with Kiro and Agent Core Runtime&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Engineering Managers and Staff+ engineers often share the same fate: back-to-back meetings while the builder inside silently screams. This talk explores how adopting an AI-Native SDLC helped me reclaim my building time—allowing me to learn a new topic, structure my exploration, and build a proof of concept in the gaps between meetings.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We’ll go from zero to deployed: starting with a simple stdio MCP server, evolving it into an HTTP MCP server, validating everything with the MCP UI Inspector, and finally deploying it on AWS using Agent Core Runtime. Along the way, we’ll lean on &lt;strong&gt;Kiro&lt;/strong&gt; agents, personas, and prompts as well as MCP servers, to accelerate learning loops, automate documentation, and capture architectural decisions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m hoping to bring this talk to a conference sometime next year. This series is, in many ways, the raw material for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where We Are Right Now
&lt;/h2&gt;

&lt;p&gt;We’ve just wrapped up phase one of the proof of concept:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A first stdio MCP server&lt;/li&gt;
&lt;li&gt;its HTTP version, run locally on docker and tested with MCP Inspector &lt;/li&gt;
&lt;li&gt;then deployed on our AWS infrastructure with &lt;strong&gt;AgentCore Runtime&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a solid foundation—but there’s a lot we haven’t explored yet. AgentCore has more components we need to understand. Costs and operational pitfalls need to be evaluated. And most importantly, we need to figure out how (or if) this fits into our actual product.&lt;/p&gt;

&lt;p&gt;Which is why this series isn’t a fixed plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Coming (Subject to Change)
&lt;/h2&gt;

&lt;p&gt;Here’s the rough structure I’m starting with. The content and even the number of posts may change as development continues over the next month or two.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;From “&lt;em&gt;No Time to Build&lt;/em&gt;” to an AI-Native SDLC&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Getting Started with Kiro: Setup, Powers, and Steering the AI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP Servers Explained: The Missing Layer Between AI and Your Systems&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vibecoding a First MCP Server: Building a stdio MCP for Internal Use&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From stdio to HTTP: Evolving an MCP Server with FastMCP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From Local to the Cloud: Running MCP Servers on AgentCore Runtime&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beyond the Runtime: Gateway, Identity, and Memory in Agent Core&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some posts may split. Others may merge. New ones might appear as we uncover things we didn’t expect especially around integration, security, and cost.&lt;/p&gt;

&lt;p&gt;If you’re an Engineering Manager, a Staff+ engineer, or anyone trying to stay technically sharp despite spending your days trapped in meetings, I hope you find this series interesting and useful. My goal isn’t to present perfect solutions: it’s to show how (if?) &lt;strong&gt;AI can really become a Multiplier&lt;/strong&gt; - helping us learn faster, validate earlier, and building again, even when time is scarce.&lt;/p&gt;

&lt;p&gt;Let’s see where this goes.&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%2F03wsgb00b04uxw53csks.png" 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%2F03wsgb00b04uxw53csks.png" alt="coding with AI" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ainativedevelopment</category>
      <category>mcpservers</category>
      <category>aws</category>
      <category>agenticai</category>
    </item>
    <item>
      <title>My 2025 Year in Review - Conferences, Community, and Growth as an AWS Community Builder and Leader</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Tue, 16 Dec 2025 13:58:32 +0000</pubDate>
      <link>https://forem.com/aws-builders/my-2025-year-in-review-conferences-community-and-growth-as-an-aws-community-builder-and-leader-4kjn</link>
      <guid>https://forem.com/aws-builders/my-2025-year-in-review-conferences-community-and-growth-as-an-aws-community-builder-and-leader-4kjn</guid>
      <description>&lt;p&gt;2025 has been an intense, fulfilling, and transformative year for me — as an Engineering Manager, public speaker, and AWS Community Builder, filled with conferences, community contributions, flights, new experiences, and meaningful connections.&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%2Fa9alvwtqgtfj40hwie68.png" 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%2Fa9alvwtqgtfj40hwie68.png" alt="aws-poland-audience-banner" width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has also been a year of growth: as a leader, as a communicator, and as part of a global technical community that energises me every day.&lt;/p&gt;

&lt;p&gt;Below is my look back at the journey.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Kicking Off the Year in Milan - AWS Community Day Italy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The conference season started on &lt;strong&gt;2 April 2025&lt;/strong&gt;, when I flew to my original hometown, Milan, to speak for the second time at &lt;strong&gt;AWS Community Day Italy&lt;/strong&gt;.&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%2Fb6mteeedc3h7mxn01whm.png" 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%2Fb6mteeedc3h7mxn01whm.png" alt="aws-milan-audience" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There, I presented: &lt;strong&gt;&lt;em&gt;“Road to Compliance: Will Your Internal Users Hate Your Platform Team?”&lt;/em&gt;&lt;/strong&gt; a talk where I shared the journey of my team at sevdesk: how we implemented internal governance, operational guardrails, and FinOps in a way that &lt;em&gt;didn’t&lt;/em&gt; create frustration or friction with engineering teams.&lt;/p&gt;

&lt;p&gt;Enforcing rules consistently while still supporting autonomy is a delicate balance. The challenge is never purely technical - empathy, communication, and a customer-centric mindset play an essential role.&lt;/p&gt;

&lt;p&gt;We covered how services like &lt;strong&gt;AWS Security Hub, AWS Config, SCPs, and Tagging Policies&lt;/strong&gt; help automate compliance and reduce risk, while preserving trust and collaboration inside the company.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;AWS Summit Hamburg - Something Different&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;5 June&lt;/strong&gt;, I supported the selection of speakers for the &lt;strong&gt;Community Stage at AWS Summit Hamburg&lt;/strong&gt;.&lt;br&gt;
My own talk didn’t make it this year - which honestly happens to all of us - so I embraced a new challenge instead.&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%2Fos05ttmxop1h3jm1zzvo.png" 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%2Fos05ttmxop1h3jm1zzvo.png" alt="aws community lounge" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I worked at the &lt;strong&gt;AWS Community Builders booth&lt;/strong&gt;, talking to attendees about the program, sharing my experience, and explaining why it’s such a powerful career accelerator.  (by the way - applications for 2026 will open soon - check here for &lt;a href="https://builder.aws.com/content/35c9eBOBVhurX9sjp3YEyMtbOxU/future-aws-community-builder-step-by-step-guide" rel="noopener noreferrer"&gt;a great guide about how-to&lt;/a&gt;)&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%2F5ewdfpttkgzlftfxm7yv.png" 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%2F5ewdfpttkgzlftfxm7yv.png" alt="aws summit hh moderator" width="800" height="943"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And then I stepped onto a different stage entirely:&lt;br&gt;
for the first time, I put on the mic and headphones to &lt;strong&gt;introduce another speaker and moderate the Q&amp;amp;A&lt;/strong&gt;.&lt;br&gt;
It felt awkward not hearing myself or the audience, but incredibly fun and rewarding.&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%2Fuvpb3xm8b2rtlxyxudcl.png" 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%2Fuvpb3xm8b2rtlxyxudcl.png" alt="aws audience" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  AWS Community Day Poland and AWS community Day Netherlands
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;18 September in Warsaw&lt;/strong&gt;, at &lt;strong&gt;AWS Community Day Poland&lt;/strong&gt;, I presented (with Tiago Bilou) &lt;strong&gt;Serverless vs Kubernetes — The Final Showdown&lt;/strong&gt;:&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%2Fq9mifjww3ljmc0dsk6c2.png" 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%2Fq9mifjww3ljmc0dsk6c2.png" alt="aws - poland" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A lively, no-holds-barred debate about two polarising cloud approaches.&lt;br&gt;
We talked about complexity, scalability, costs, security, legacy modernization, and event-driven architectures.&lt;br&gt;
The room, set in a cinema, was &lt;em&gt;packed&lt;/em&gt;, around 350 people, despite other big-name speakers presenting at the same time.&lt;br&gt;
I wrote &lt;a href="https://dev.to/aws-builders/serverless-vs-kubernetes-the-final-showdown-why-we-decided-to-hold-this-talk-and-where-to-go-44ee"&gt;a post about the talk&lt;/a&gt; and why such a debate was a great learning experience.&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%2F5k64rhnbc38l34l082ut.png" 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%2F5k64rhnbc38l34l082ut.png" alt="aws-poland-audience" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few days later, on &lt;strong&gt;24 September&lt;/strong&gt;, I brought the same talk (this time with Damiano Giorgi) to &lt;strong&gt;AWS Community Day NL in Utrecht&lt;/strong&gt; - again in a cinema, again in front of a huge, energetic audience.&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%2Fq56sio9ndp72zn3sp3ob.png" 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%2Fq56sio9ndp72zn3sp3ob.png" alt="aws - netherlands" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Come to Code - A Conference Like No Other&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;From Utrecht, I flew straight to  Basilicata in Italy for &lt;strong&gt;Come to Code&lt;/strong&gt;, where I gave my &lt;strong&gt;&lt;em&gt;“Road to Compliance: Will Your Internal Users Hate Your Platform Team?”&lt;/em&gt;&lt;/strong&gt; talk again.&lt;/p&gt;

&lt;p&gt;But the event itself deserves a special mention.&lt;/p&gt;

&lt;p&gt;This conference was magical.&lt;br&gt;
Maybe because it lasted two and a half days, giving us time to truly connect. Maybe because of the shared lunches, the drawing and crochet workshops 🧶, the walk in the woods, the retro gaming corner (including ChatGPT on a Commodore 64!), or the live concerts in the town square.&lt;br&gt;
Maybe because speaking in my native language hit differently.&lt;/p&gt;

&lt;p&gt;Everything was perfect - pizza nights, a Bavarian dinner, the “Cloud Taboo” game, the AWS Builder Cards, Lucanian food and drinks, music, laughs, deep conversations with other Engineering Managers, and the huge passion of 180 people who travelled to a small southern Italian mountain town on a &lt;em&gt;weekend&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The organisers deserve infinite applause for the logistics, the hospitality, and the heart they put into every detail.&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%2Ftbzvn1h8k82bfl211s5a.png" 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%2Ftbzvn1h8k82bfl211s5a.png" alt="come to code " width="800" height="834"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;AWS Community Day DACH - Behind the Scenes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;7 October&lt;/strong&gt;, I sadly could not attend AWS Community Day DACH - too many conferences this year and packed into a few weeks.&lt;br&gt;
However, as part of the &lt;a href="https://www.aws-community.de/team" rel="noopener noreferrer"&gt;AWS Community DACH Association Booster Club&lt;/a&gt; I again joined the selection committee for talks.&lt;/p&gt;

&lt;p&gt;My own submission wasn’t selected this time, but the process is always inspiring, fair, and full of incredibly well-crafted abstracts.&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%2Fme2btd8ugfpowkxn9v48.png" 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%2Fme2btd8ugfpowkxn9v48.png" alt="Sessionize Call for Paper evaluation" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;InfoQ Dev Summit Munich - Beyond AWS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;16 October&lt;/strong&gt;, I presented again my &lt;strong&gt;&lt;em&gt;“Road to Compliance: Will Your Internal Users Hate Your Platform Team?”&lt;/em&gt;&lt;/strong&gt; talk at &lt;strong&gt;InfoQ Dev Summit Munich&lt;/strong&gt;, a highly professional, multi-platform conference — not just AWS-centric.&lt;/p&gt;

&lt;p&gt;A highlight was moderating the &lt;strong&gt;“Birds of a Feather”&lt;/strong&gt; discussion/panel on Platform Engineering, which was a brand-new experience for me.&lt;/p&gt;

&lt;p&gt;On the train back to Hamburg, I wrote &lt;a href="https://dev.to/dvddpl/reflections-from-infoq-munich-2025-platforms-people-and-the-path-to-sovereignty-33ob"&gt;a blog post summarising my impressions and the talks I attended&lt;/a&gt;.&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%2Fvm6cnlojyep6vplzm9su.png" 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%2Fvm6cnlojyep6vplzm9su.png" alt="Info Q stage" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Closing the Conference Year at DevFest Hamburg&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;My last event of the year was &lt;strong&gt;14 November&lt;/strong&gt;, back home in Hamburg.&lt;/p&gt;

&lt;p&gt;With Tiago Bilou, I delivered &lt;strong&gt;“Serverless vs Kubernetes — The Final Showdown”&lt;/strong&gt; at &lt;strong&gt;DevFest Hamburg&lt;/strong&gt;—on the Container Stage, in front of an audience mostly focused on Google Cloud.&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%2Foubhjvi8dk1520uq6fhg.png" 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%2Foubhjvi8dk1520uq6fhg.png" alt="dev fest stage" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It truly felt like an &lt;em&gt;away game&lt;/em&gt;.&lt;br&gt;
But architecture principles are cloud-agnostic, and we were welcomed with great curiosity and engagement.&lt;/p&gt;

&lt;p&gt;The engineering community is inclusive everywhere — no matter the cloud provider.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Feature on The Serverless Advocate
&lt;/h2&gt;

&lt;p&gt;I was also featured in the &lt;strong&gt;Serverless Advocate Newsletter&lt;/strong&gt; by Lee Gilmore, in the &lt;strong&gt;“Ask the Expert”&lt;/strong&gt; section, where I shared experience, tips, and practical advice for engineers working with serverless.&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%2F0nc7f9mh2jfmfhnxmj2o.png" 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%2F0nc7f9mh2jfmfhnxmj2o.png" alt="Serverless Advocate Newsletter" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing Less, But Writing Deeper
&lt;/h2&gt;

&lt;p&gt;This year I didn’t publish as many technical articles - partly because the Engineering Manager role limits deep hands-on exploration, and partly because the conference season was incredibly busy.&lt;/p&gt;

&lt;p&gt;But I did write pieces I’m proud of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A follow-up to an old post about being a &lt;strong&gt;Multiplier&lt;/strong&gt;—one of the reasons I became an EM and Community Builder.&lt;a href="https://dev.to/dvddpl/be-the-rising-tide-the-multiplying-effect-of-lifting-and-pushing-others-n1h"&gt;🌊 Be the Rising Tide: The Multiplying Effect of Lifting (and Pushing) Others&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A reflection on &lt;strong&gt;imposter syndrome, vulnerability, and personal growth&lt;/strong&gt;, inspired by moments where I cried at work—and why that’s not weakness, but honesty and humanity.
&lt;a href="https://dev.to/dvddpl/discomfort-isnt-the-enemy-lessons-from-3-times-i-cried-at-work-h51"&gt;Discomfort isn’t the enemy: Lessons from 3 times I cried at work&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Internal Impact - Building Communities at Work
&lt;/h2&gt;

&lt;p&gt;Not directly part of AWS Community Builders, but still related to sharing knowledge:&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%2F5j4uxrh6wpt1ytbo87y5.png" 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%2F5j4uxrh6wpt1ytbo87y5.png" alt="sevdesk stage" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I gave a talk on &lt;strong&gt;Observability and Incident Management&lt;/strong&gt; at our company onsite in March: &lt;em&gt;“From DevOoops to SRE.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;I launched internal &lt;strong&gt;Guilds and Tech Communities&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;With support from the AWS Enterprise RAMP-UP program, I organised workshops for our engineers on &lt;strong&gt;Amazon Q&lt;/strong&gt;, &lt;strong&gt;SQS &amp;amp; EventBridge&lt;/strong&gt;, and &lt;strong&gt;Microfrontends&lt;/strong&gt;, delivered by AWS experts.&lt;/li&gt;
&lt;/ul&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%2Fpnixwhg58mzcwshvb4yk.png" 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%2Fpnixwhg58mzcwshvb4yk.png" alt="Puria AWS Expert Amazon Q" width="800" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These were some of the contributions I’m most proud of.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Speaking Goals for 2025 — and The Reality
&lt;/h2&gt;

&lt;p&gt;I started the year with two goals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Speak at 6 conferences.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speak at least once outside AWS-focused events, ideally on leadership topics.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I achieved the first goal — though only barely.&lt;br&gt;
Until August, I thought I’d miss it.&lt;br&gt;
Then September and October arrived with &lt;strong&gt;4 conferences in 30 days&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I sincerely hope conference organisers coordinate better in the future — autumn is becoming impossibly crowded!&lt;br&gt;
I had to decline 4 accepted CFPs and withdraw from 5 evaluations because of scheduling conflicts. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Just as a reminder for anyone struggling with CFPs: I was &lt;strong&gt;rejected by 15 events&lt;/strong&gt; this year.&lt;br&gt;
Keep refining your abstracts. Make them personal, relevant, and clear. &lt;strong&gt;Rejection is part of the process&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My second goal — speaking about leadership — didn’t happen.&lt;br&gt;
My talk on &lt;strong&gt;DORA Metrics and high-performing teams&lt;/strong&gt; didn’t get accepted this year.&lt;br&gt;
But I’ll keep improving it and try again in 2026.&lt;/p&gt;




&lt;h1&gt;
  
  
  Looking Back - And Ahead
&lt;/h1&gt;

&lt;p&gt;2025 was exhausting, energising, emotional, and unforgettable.&lt;br&gt;
It reminded me why &lt;strong&gt;I love being part of the AWS Community&lt;/strong&gt; and the broader engineering world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sharing knowledge makes us all better.&lt;/li&gt;
&lt;li&gt;Speaking publicly creates connections that last.&lt;/li&gt;
&lt;li&gt;Helping others grow amplifies our own growth.&lt;/li&gt;
&lt;li&gt;And community - real community - happens when people bring passion, vulnerability, curiosity, and kindness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s to another year of learning, building, speaking, and lifting others. And to the AWS Community Builders program, which continues to be an incredible catalyst for personal and professional growth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;See you in 2026.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>awscommunitybuilder</category>
      <category>yearlyretrospective</category>
      <category>aws</category>
      <category>publicspeaking</category>
    </item>
    <item>
      <title>From Nagging to Holding People Accountable</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Mon, 15 Dec 2025 07:36:00 +0000</pubDate>
      <link>https://forem.com/dvddpl/from-nagging-to-holding-people-accountable-3dfj</link>
      <guid>https://forem.com/dvddpl/from-nagging-to-holding-people-accountable-3dfj</guid>
      <description>&lt;p&gt;One of the many great things about meeting people at conferences and networking is that the inspiration doesn’t stop when the event ends. It continues later, while scrolling through my LinkedIn feed: sometimes it’s just a thought, a leadership gem, or an engineering tip. Sometimes it’s a thoughtful blog post about a hot topic (recently: overly-present &lt;a href="https://docs.aws.amazon.com/aws-mcp/latest/userguide/what-is-mcp-server.html" rel="noopener noreferrer"&gt;MCP servers&lt;/a&gt;, or &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html" rel="noopener noreferrer"&gt;Lambda durable functions&lt;/a&gt;). Often, it’s a reading suggestion.&lt;/p&gt;

&lt;p&gt;I love books and I read a lot (still not as much as I’d like and I’m actively working on reducing my screen time in favour of good old paper). I almost never read literature or novels; my shelves are mostly filled with books on communication, leadership, productivity, goals, engineering, or &lt;a href="https://dev.to/dvddpl/what-s-your-push-30b5"&gt;the journeys of athletes and adventurers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So when I came across &lt;strong&gt;Crucial Accountability: Tools for Resolving Violated Expectations, Broken Commitments, and Bad Behavior&lt;/strong&gt; by Patterson, Grenny, McMillan, Switzler, and Kerry on LinkedIn, &lt;a href="https://www.amazon.de/-/en/Crucial-Accountability-Resolving-Expectations-Commitments/dp/0071829318" rel="noopener noreferrer"&gt;I bought it immediately&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="instagram-position"&gt;
  &lt;iframe id="instagram-liquid-tag" src="https://www.instagram.com/p/DSAKeE2jGF3/embed/captioned/"&gt;
  &lt;/iframe&gt;
  
&lt;/div&gt;




&lt;h2&gt;
  
  
  Unspoken Expectations, Repeated Demands
&lt;/h2&gt;

&lt;p&gt;I’m ambitious, demanding, and hold a pretty high bar — for quality and speed. I’m also direct, sometimes &lt;em&gt;too direct&lt;/em&gt;, immediately pointing out what hasn’t met that standard. This “&lt;em&gt;radical candor&lt;/em&gt;” doesn’t always land the way I intend.&lt;br&gt;
Sometimes I walk away frustrated, unheard, and feeling I am becoming a serial nagger — at work as at home with my teenagers. Resentment builds, and conversations become less effective over time.&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%2F4erci7jesqgevijheykz.png" 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%2F4erci7jesqgevijheykz.png" alt="angry EM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So yes, the book’s back cover spoke directly to me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Broken promises, missed deadlines, poor behavior — they don’t just make others’ lives miserable; they can sap up to 50 percent of organizational performance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What I really wanted to learn was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How can I express expectations without sounding judgmental?&lt;/li&gt;
&lt;li&gt;How can I create safety and show that I care — not only about goals and commitments, but also about people?&lt;/li&gt;
&lt;li&gt;How can I hold others accountable and protect the relationship?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  From Silence or Violence to Skill
&lt;/h2&gt;

&lt;p&gt;The authors highlight a common accountability trap: when things go wrong, people often swing between silence (avoiding the issue to preserve harmony) and violence (pushing too hard and escalating tension). &lt;br&gt;
Neither works. Silence breeds resentment. Violence triggers defensiveness or shutdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Accountability: (CPR)
&lt;/h2&gt;

&lt;p&gt;The book defines accountability as something that should happen &lt;strong&gt;“early, often, and skillfully.&lt;/strong&gt;”&lt;/p&gt;

&lt;p&gt;Everything starts with understanding what kind of accountability problem you’re dealing with. &lt;br&gt;
The authors' &lt;strong&gt;CPR model (Content, Pattern, Relationship)&lt;/strong&gt; offers a helpful lens for diagnosing what kind of problem you’re facing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content&lt;/strong&gt;: A single instance of a missed expectation (“You missed yesterday’s deadline.”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern&lt;/strong&gt;: A recurring problem (“This is the third missed deadline this month.”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relationship&lt;/strong&gt;: When trust or reliability is at stake (“When deadlines are missed, it’s hard for me to rely on you.”)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key rule: start with the lowest level needed (Content → Pattern → Relationship) and escalate only if the problem persists.&lt;/p&gt;

&lt;p&gt;This was a big insight for me. If you jump straight to Pattern or Relationship on a first occurrence, &lt;em&gt;you risk overreacting and appearing unfair or aggressive&lt;/em&gt;. On the other hand, if you ignore patterns, resentment builds until the relationship itself is at risk.&lt;/p&gt;

&lt;p&gt;It also reinforced how important it is to address issues early, before they pile up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Master Your Story
&lt;/h2&gt;

&lt;p&gt;When a promise is broken — especially repeatedly — we tend to turn the other person into &lt;strong&gt;the villain&lt;/strong&gt; of the story. We tell ourselves stories that label them: &lt;em&gt;they’re just lazy or selfish, they don’t care, they’re simply incapable&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;“Mastering your stories” means separating facts from assumptions ( from the stories we tell ourselves) and choosing explanations that keep us curious rather than judgmental.&lt;/p&gt;

&lt;p&gt;It’s about telling the whole story, not just our part of it.&lt;br&gt;
Instead of starting from blame, we gather facts and enter the conversation with &lt;strong&gt;genuine curiosity&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What actually happened?&lt;/li&gt;
&lt;li&gt;What might I be missing?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This shift alone changes the tone of the conversation dramatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Describe the Gap
&lt;/h2&gt;

&lt;p&gt;To hold people accountable, they must clearly understand the expectation and the gap.&lt;/p&gt;

&lt;p&gt;That means describing, without labels or judgment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What was expected&lt;/li&gt;
&lt;li&gt;What actually happened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No vagueness. No character assessments. Just observable facts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contrasting: Saying What You Don’t Mean
&lt;/h2&gt;

&lt;p&gt;One tool I found extremely useful — and one I rarely use — is contrasting - a technique to defuse defensiveness.&lt;/p&gt;

&lt;p&gt;I used to avoid it because &lt;strong&gt;it feel like I am justifying myself&lt;/strong&gt;, that I am approaching the conversation walking on egg-shells, or worse, that I am anticipating what people would then use against me as an excuse.&lt;br&gt;
But contrasting is powerful when used well:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’m not saying you’re unreliable. I am saying this deadline was important, and missing it put the project at risk.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This simple structure reduces fight-or-flight responses and keeps dialogue open even when things are tense.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 Sources of Influence
&lt;/h2&gt;

&lt;p&gt;This was the most eye-opening part of the book for me.&lt;/p&gt;

&lt;p&gt;If someone isn’t performing, at least one source of influence is failing. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your job isn’t to blame, it’s to diagnose and fix.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The six sources fall into two categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Motivation (Do they want to?)&lt;/li&gt;
&lt;li&gt;Ability ( Can they? )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each category has three dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personal&lt;/li&gt;
&lt;li&gt;Social&lt;/li&gt;
&lt;li&gt;Structural&lt;/li&gt;
&lt;/ul&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%2Fl7963yxtgijthl6y5zbs.png" 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%2Fl7963yxtgijthl6y5zbs.png" alt="6 sources of influence"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Examples that really resonated with me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If others routinely miss deadlines too, it makes sense this feels optional.”&lt;br&gt;
“If speed is rewarded more than accuracy, this behavior is being encouraged.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I always knew multiple factors were at play—peer pressure, incentives, organizational values — but this framework gave me a concrete way to &lt;strong&gt;ask better questions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Understanding whether it’s a motivation or ability issue (and at which level) helps tailor the solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Make it Easy&lt;/strong&gt;: Remove barriers and assume good intent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it Motivating&lt;/strong&gt;: Clarify impact, purpose, and feedback loops.&lt;/li&gt;
&lt;/ul&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%2F13ksx0f9u4ojuy13f4nw.png" 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%2F13ksx0f9u4ojuy13f4nw.png" alt="something came up"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It reminded me of the “blameless postmortem” mindset: &lt;em&gt;if the system allowed the error, the problem lies in the system&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agree on a plan (WWWF)
&lt;/h2&gt;

&lt;p&gt;After the conversation, we want improvement. Behavior change doesn’t happen without clarity.&lt;br&gt;
To move from talk to action, the authors propose a clean framework that made me laugh at first. The acronym is WWWF. I initially read it as WTF — because honestly, sometimes my inner voice still says:  &lt;em&gt;"Wtf, just do your part!"&lt;/em&gt;&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%2Ftv86fyty4kwby0bssnu4.png" 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%2Ftv86fyty4kwby0bssnu4.png" alt="do your fucking job"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;WWWF:  Who will do What by When —and how you’ll Follow up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s simple, explicit, and powerful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stay Focused and Flexible
&lt;/h2&gt;

&lt;p&gt;This might be my personal mantra. It sounds contradictory, but it’s often the key to success: the magic lies in balancing focus (&lt;strong&gt;keeping commitments&lt;/strong&gt;) and flexibility (&lt;strong&gt;adapting wisely when priorities shift&lt;/strong&gt;). &lt;br&gt;
People often justify broken commitments with &lt;em&gt;“something more urgent came up.”&lt;/em&gt; That’s not laziness but lack of clarity about priorities.&lt;br&gt;
People think they are being flexible by prioritising something else, and in teams like mine - plagued by low capacity and constant firefighting - they are being kind and helpful (willing to help and unblock others).&lt;/p&gt;

&lt;p&gt;The solution isn’t just better tools (Eisenhower Matrix, impact/effort charts), but also a simple agreement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If something comes up, come to me first. Then we decide together whether it’s time to be focused—or flexible.&lt;/p&gt;
&lt;/blockquote&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%2Fhwfildac70gfgamd430b.png" 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%2Fhwfildac70gfgamd430b.png" alt="Impact/Urgency"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Focus and flexibility also matter for the person holding the conversation. &lt;strong&gt;If new information emerges, adapt&lt;/strong&gt;. Maybe there’s a bigger problem to solve first. Maybe you need to pause and come back later to restore safety and avoid derailment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hold others accountable by addressing gaps early, focusing on facts, diagnosing motivation vs. ability, and ending with clear commitments — while maintaining mutual respect.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s the essence of Crucial Accountability.&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%2F4u0qlehz3ub2h2uvt0u4.png" 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%2F4u0qlehz3ub2h2uvt0u4.png" alt="crucial conversations model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real value, though, lies in how practical it is.  I really enjoyed the last section of the book, which walks through concrete scenarios and how to handle them. The chapter titled “No &lt;em&gt;Yeah, But..._s” made me smile — I had that exact thought many times while reading: _All good, yeah… but this won’t work with my teen, or with that low performer I once managed&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The self-assessments helped me see where I am and where I can improve, and I appreciated the additional free resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cruciallearning.com/resource-center/" rel="noopener noreferrer"&gt;resource center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@CrucialLearning" rel="noopener noreferrer"&gt;youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The book also connects beautifully with other books I’ve read in recent years:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Radical Candor - Be a Kick-Ass Boss Without Losing Your Humanity&lt;/strong&gt; (balancing care and challenge - the traps of obnoxious aggression and ruinous empathy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nonviolent Communication: A Language of Life&lt;/strong&gt; (expressing needs without blame)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 4 Stages of Psychological Safety&lt;/strong&gt; by Timothy R Clark (contrasting, flexibility, curiosity)&lt;/li&gt;
&lt;/ul&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%2F11pm1loatvokbl3mu05c.png" 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%2F11pm1loatvokbl3mu05c.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This book didn’t just give me tools — it gave me language, structure, and a mirror. I read it, underlined it, circled entire sections,  added bookmarks and folded corners so that I can go back to it when I need it.  When my books look like that in the end, it's the mark of a truly useful read.&lt;/p&gt;




&lt;p&gt;Other articles you might like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/dvddpl/be-the-rising-tide-the-multiplying-effect-of-lifting-and-pushing-others-n1h"&gt;Be the Rising Tide: The Multiplying Effect of Lifting (and Pushing) Others&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dvddpl/am-i-doing-the-best-i-can-thoughts-about-talent-mediocrity-expectations-and-success-1g6d"&gt;Am I doing the best I can? Thoughts about talent, mediocrity, expectations and success&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dvddpl/what-s-your-push-30b5"&gt;What's your push?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dvddpl/discomfort-isnt-the-enemy-lessons-from-3-times-i-cried-at-work-h51"&gt;Discomfort isn’t the enemy: Lessons from 3 times I cried at work&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>growthmindset</category>
      <category>readingsuggestions</category>
      <category>leadership</category>
      <category>accountability</category>
    </item>
    <item>
      <title>Am I doing the best I can? Thoughts about talent, mediocrity, expectations and success.</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Mon, 24 Nov 2025 07:14:00 +0000</pubDate>
      <link>https://forem.com/dvddpl/am-i-doing-the-best-i-can-thoughts-about-talent-mediocrity-expectations-and-success-1g6d</link>
      <guid>https://forem.com/dvddpl/am-i-doing-the-best-i-can-thoughts-about-talent-mediocrity-expectations-and-success-1g6d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“È bravo, ma non si impegna.” ( “&lt;em&gt;He is very smart, but if he put in more effort, he could achieve so much more.&lt;/em&gt;” )&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This sentence followed me for my entire childhood.&lt;br&gt;
I was a good student: good grades, good results, never the best, but good. And I studied. A lot, in my opinion. &lt;br&gt;
Yet the feedback always carried that same message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You could have gotten an A… if only you had worked harder.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes I even got worse grades than classmates who had identical results because they “worked hard”, so they were rewarded, while &lt;strong&gt;my work was discounted and attributed to “talent.”&lt;/strong&gt;&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%2F47mn0a3jlqlv3kzz2yvh.png" 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%2F47mn0a3jlqlv3kzz2yvh.png" alt="hard work beats talent when talent doesn't work hard" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can’t say whether those comments shaped who I am today, or whether something deeper was already there. Pushing me to always do something more - although I always knew I could put in more effort.&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%2F8a1nu60unsb3qwmblkr7.png" 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%2F8a1nu60unsb3qwmblkr7.png" alt="over clouds" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But the reason I didn’t give “everything” is simple:&lt;br&gt;
&lt;strong&gt;Good enough was, simply, good enough.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Somewhere in my head, there has always been a calculation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the right effort/result ratio that still allows me to enjoy life?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If studying one hour gives me a B and 30 minutes of play… why study 90 minutes to get an A and lose that joy?&lt;/p&gt;

&lt;p&gt;This is something I’ve realised even more since becoming a father ( and while reflecting on my climbing goals).&lt;/p&gt;

&lt;p&gt;I could definitely climb harder - if I gave up some joy.&lt;br&gt;
Climb 20 minutes more each session instead of enjoying a beer with my climbing partners.&lt;br&gt;
Skip a fun climbing day in favour of painful, boring weight lifting and stretching.&lt;br&gt;
Avoid indulging in food and alcohol.&lt;br&gt;
But… &lt;strong&gt;would all that be worth it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My son recently got the same remark (&lt;em&gt;he's good but could put in some more effort&lt;/em&gt;) from his teachers, and he also stopped getting on the podium in climbing competitions.&lt;/p&gt;

&lt;p&gt;He’s still top 10 in Germany - but he achieves that with the &lt;em&gt;right&lt;/em&gt; amount of effort, while staying a happy, social kid, who alongside hard trainings and competitions, plays an instrument, does well in school, and has friends and a life.&lt;/p&gt;

&lt;p&gt;Some children sacrifice everything for one goal. Some parents push their kids to &lt;strong&gt;go all in on a single bet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;He doesn’t. I didn’t. &lt;br&gt;
And I’m not sure that’s a flaw.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proudly Mediocre
&lt;/h2&gt;

&lt;p&gt;Recently I stumbled upon a short reel by Mauro Corona - climber, writer, sculptor - talking about being &lt;em&gt;“proud of being mediocre.”&lt;/em&gt;&lt;br&gt;
He says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“To excel at one thing, I would have had to throw away years of my life…&lt;br&gt;
And I only have one of those.&lt;br&gt;
So I ended up being mediocre — but I did everything I loved doing.”&lt;/p&gt;
&lt;/blockquote&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%2Fvcnj46c3qcey7xghwe9d.png" 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%2Fvcnj46c3qcey7xghwe9d.png" alt="Mauro Corona" width="279" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/shorts/xZoHHmvtJy0" rel="noopener noreferrer"&gt;Here the video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And suddenly everything clicked.&lt;/p&gt;

&lt;p&gt;Life is too short to sacrifice variety for perfection, being mediocre at 10 things can be more valuable than being the best at one. Because &lt;strong&gt;diverse experiences compound into something far richer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And let’s be clear,  Mauro Corona is &lt;strong&gt;anything but mediocre!&lt;/strong&gt; He is an incredible man, with a strong character and lots of stories. &lt;br&gt;
He just consciously &lt;strong&gt;chose breadth over obsession.&lt;/strong&gt;&lt;br&gt;
And so, in a way, did I.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Then Comes the Other Voice: “You Could Do More.”
&lt;/h2&gt;

&lt;p&gt;Despite everything, that teacher’s voice still echoes somewhere:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You could do more.”&lt;br&gt;
“You should do more.”&lt;br&gt;
“You’re not doing enough.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And this connects to something else that often bothers me: &lt;strong&gt;untapped potential.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That awareness that if you want to excel at something, you must commit fully. And if you don't put in 110%, it feels like a pity!&lt;/p&gt;

&lt;h2&gt;
  
  
  The responsibility of luck
&lt;/h2&gt;

&lt;p&gt;This conflict became even clearer when I read the book:&lt;br&gt;
“I Must Do That, Because I Can.” (Devo perche’ posso)  by the mountaineer Simone Moro.&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%2Frxd49xdzv0chtandhros.png" 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%2Frxd49xdzv0chtandhros.png" alt="devo perche posso" width="340" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If life gives you the gift of talent, opportunity, and luck, you feel a duty to honour it by doing something meaningful with it.&lt;br&gt;
If chances are handed to you, you must &lt;strong&gt;catch them&lt;/strong&gt;.&lt;br&gt;
You have a responsibility &lt;strong&gt;not to waste them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This resonates deeply with me:&lt;/p&gt;

&lt;p&gt;I know I am lucky.&lt;br&gt;
Lucky to have opportunities, resources, health, support, the ability to learn and grow.&lt;br&gt;
Lucky to have challenges worth pursuing.&lt;/p&gt;

&lt;p&gt;And this is where the tension lives: I know I have untapped potential and I could accomplish much more - therefore &lt;strong&gt;I feel grateful and guilty at the same time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But then I remind myself that giving 90% across multiple domains is not wasting my potential. It is choosing a full, rich, multidimensional life.&lt;/p&gt;

&lt;p&gt;Still, these thoughts push me, especially at work and in parenting.&lt;br&gt;
I set a high bar for myself and, admittedly, for others too. With the downside that I often end up &lt;strong&gt;frustrated, disappointed, and exhausted&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints, Expectations, and Excellence
&lt;/h2&gt;

&lt;p&gt;An ex-colleague who was leaving for “greener pastures” told me something that made me think, about &lt;strong&gt;ambition, agency and acceptance&lt;/strong&gt;. About understanding that no matter how high my expectations are, I operate within real constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much time I have&lt;/li&gt;
&lt;li&gt;How many resources are available&lt;/li&gt;
&lt;li&gt;How much support and collaboration I can expect&lt;/li&gt;
&lt;li&gt;How quickly others can deliver their part&lt;/li&gt;
&lt;li&gt;How much of the system can I realistically influence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe the version of excellence I envision is not what the current context requires.&lt;br&gt;
Maybe what I could achieve in ideal conditions is irrelevant; what I could achieve at full potential is not what is needed now. &lt;br&gt;
Maybe it’s not even desired.&lt;/p&gt;

&lt;p&gt;Accumulating frustration about “what could be” is pointless and damaging; the resentment is visible and it impacts morale and performance, mine and others’.&lt;/p&gt;

&lt;h2&gt;
  
  
  Love It, Change It, or Leave It
&lt;/h2&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%2Fs1c7whsom25er9c7n7vd.png" 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%2Fs1c7whsom25er9c7n7vd.png" alt="Love it change it leave it" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am not someone who gives up easily. I try to change things first.&lt;br&gt;
But I also need to focus on what I can control, what I can influence, and what I must accept.&lt;br&gt;
Until I manage to change a situation, the choice is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Love it — or leave it.&lt;/li&gt;
&lt;li&gt;Focus on what I can control.&lt;/li&gt;
&lt;li&gt;Influence what I can influence.&lt;/li&gt;
&lt;li&gt;Let go of the rest.&lt;/li&gt;
&lt;/ul&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%2F0ianp3sy1i5ioa1gk0fw.png" 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%2F0ianp3sy1i5ioa1gk0fw.png" alt="circle of control" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if I choose not to leave — not now, or not ever — then the healthiest thing I can do is love it as it is, not as it would be under perfect conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning constraints into catalysts
&lt;/h2&gt;

&lt;p&gt;Focusing on what I can do within real constraints allows me to &lt;strong&gt;acknowledge effort and success&lt;/strong&gt;, instead of always staring at the gap.&lt;br&gt;
To be proud of what I accomplish within the actual boundaries I face — not imaginary ones.&lt;/p&gt;

&lt;p&gt;Constraints force priority.&lt;br&gt;
Constraints sharpen focus.&lt;br&gt;
Constraints make expectations realistic.&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%2Fle0vc5z7ne9xtwy0zbdl.png" 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%2Fle0vc5z7ne9xtwy0zbdl.png" alt="AWS Exec Leaders Summit Hamburg 2025" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They become not the reason I underperform, but the reason I choose the right things to perform on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Maybe excellence isn’t doing everything at 110%, but choosing where 90% is actually impactful.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And here’s something I say with humility, not arrogance - with gratitude rather than pride:&lt;br&gt;
I know that even when I operate at 80–90%, it often looks like “a lot” from the outside.&lt;br&gt;
Not because I’m exceptional, but because my baseline has been shaped by years of habits, curiosity, and luck — luck in the opportunities I've had, the people who supported me, and the challenges that pushed me.&lt;br&gt;
That’s exactly why I must stay mindful of expectations: &lt;strong&gt;What feels natural to me isn’t necessarily fair, realistic, or healthy to expect from others.&lt;/strong&gt;&lt;br&gt;
And as a leader I’ve learned (almost) that expecting permanent 110% from myself or others is unsustainable.&lt;/p&gt;

&lt;p&gt;It hurts morale.&lt;br&gt;
It hurts quality.&lt;br&gt;
It hurts people.&lt;/p&gt;

&lt;p&gt;Learning to choose my effort deliberately has made me more effective, not less ambitious.&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%2Fa9alvwtqgtfj40hwie68.png" 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%2Fa9alvwtqgtfj40hwie68.png" alt="conference" width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am grateful for the chances life has given me.&lt;br&gt;
I do feel the responsibility to honour them.&lt;br&gt;
Therefore, I constantly push myself — sometimes too far, sometimes not far enough. But it's fine, as long as I keep on growing. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’m proud of being many things&lt;/strong&gt; — a software engineer, a climber, a father, a community builder, a leader, a writer, a public speaker and a curious human — even if I’m not world-class in any single discipline.&lt;br&gt;
Mediocre snowboarder, mediocre engineer, mediocre climber — maybe.&lt;br&gt;
But I got to be all of them.&lt;br&gt;
And that breadth has shaped me far more meaningfully than mastery of one.&lt;br&gt;
All those experiences compound, and choosing a full, multi-dimensional life is the most honest way I can honour the luck I was given.&lt;br&gt;
Not by squeezing every drop of potential into a single pursuit, but by living widely, intentionally, gratefully.&lt;/p&gt;

&lt;p&gt;Maybe that’s my version of excellence.&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%2Fjbg1vwl48vrchvh73ech.png" 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%2Fjbg1vwl48vrchvh73ech.png" alt="Floating" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Other related articles:&lt;br&gt;
&lt;a href="https://dev.to/dvddpl/maybe-you-should-start-listening-to-that-voice-telling-you-that-you-suck-2i49"&gt;Maybe you should start listening to that voice telling you that YOU SUCK!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/dvddpl/be-the-rising-tide-the-multiplying-effect-of-lifting-and-pushing-others-n1h"&gt;Be the Rising Tide: The Multiplying Effect of Lifting (and Pushing) Others&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/dvddpl/discomfort-isnt-the-enemy-lessons-from-3-times-i-cried-at-work-h51"&gt;Discomfort isn't the enemy&lt;/a&gt;&lt;/p&gt;

</description>
      <category>personalgrowth</category>
      <category>talent</category>
      <category>growthmindset</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Serverless vs Kubernetes: The Final Showdown - Why we decided to hold this talk and where to go from here</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Wed, 19 Nov 2025 08:45:00 +0000</pubDate>
      <link>https://forem.com/aws-builders/serverless-vs-kubernetes-the-final-showdown-why-we-decided-to-hold-this-talk-and-where-to-go-44ee</link>
      <guid>https://forem.com/aws-builders/serverless-vs-kubernetes-the-final-showdown-why-we-decided-to-hold-this-talk-and-where-to-go-44ee</guid>
      <description>&lt;p&gt;In the past 8 years, I mostly built serverless applications,  then joined a company running its workloads on Kubernetes. The transition for me was hard, and since I stayed in contact with an old ex-colleague who on the other end, spent his career building on containers and on-premise k8s in particular I often reached out to him to understand Kubernetes, and more than occasionally, rant about it.&lt;br&gt;&lt;br&gt;
In response, he shared his frustrating experiences in attempting to run serverless applications - both from cold starts and costs perspectives.&lt;/p&gt;

&lt;p&gt;That's how we came to the idea of writing a Talk about this and presenting it at Conferences.&lt;/p&gt;

&lt;p&gt;Every engineering team has heard, or been part of, the endless “Serverless vs. Kubernetes” debate. Strong opinions are thrown around, memes circulate on LinkedIn, and blanket statements spread like wildfire. And like all stereotypes, they are &lt;em&gt;true and false at the same time&lt;/em&gt;.&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%2Fwxzc2qeeaj5fvbs8k5uj.png" 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%2Fwxzc2qeeaj5fvbs8k5uj.png" alt="never trust a blanket statement" width="300" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The truth? Much of the conversation is oversimplified, emotionally charged, and disconnected from the reality teams face when building and operating software at scale.&lt;/p&gt;

&lt;p&gt;Our talk, and this article, is our attempt to bring nuance back into the discussion.&lt;/p&gt;

&lt;p&gt;Too often we watch people compare these two paradigms the way you’d compare &lt;strong&gt;Car-Sharing to owning a car&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both models are valid. Both are powerful. And neither can replace the other across all use cases.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The real question is not &lt;em&gt;“Which one is better?”&lt;/em&gt; but &lt;em&gt;Which one is better for this workload, with this team, in this organisation, at this time?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In our talk we go through several aspects and try to debunk them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Control vs. Complexity
&lt;/h2&gt;

&lt;p&gt;Kubernetes gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;precise control over deployments&lt;/li&gt;
&lt;li&gt;resource scheduling (CPU, GPU, affinity rules)&lt;/li&gt;
&lt;li&gt;hybrid/on-prem/cloud consistency&lt;/li&gt;
&lt;li&gt;advanced rollout patterns and self-healing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Serverless gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;minimal configuration&lt;/li&gt;
&lt;li&gt;"infrastructure you don't manage"&lt;/li&gt;
&lt;li&gt;the fastest path to shipping business logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But control comes with cost:&lt;br&gt;
A typical Kubernetes stack isn’t just k8s. It’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ingress controller&lt;/li&gt;
&lt;li&gt;Service mesh&lt;/li&gt;
&lt;li&gt;Metrics stack&lt;/li&gt;
&lt;li&gt;Logging stack&lt;/li&gt;
&lt;li&gt;Secrets manager&lt;/li&gt;
&lt;li&gt;Autoscalers (HPA, VPA, CA, Karpenter...)&lt;/li&gt;
&lt;li&gt;Backup tools&lt;/li&gt;
&lt;li&gt;Certificate management&lt;/li&gt;
&lt;li&gt;Policy/OPA&lt;/li&gt;
&lt;li&gt;CI/CD integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you don't just have to tame the Kubernetes beast; you also need to understand and manage an ecosystem of several critical open-source tools.&lt;/p&gt;

&lt;p&gt;Serverless shifts much of this burden to AWS (or GCP/Azure), leveraging the shared responsibility/fate model.&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%2Fcyo2ee2o8athscu5xr1z.png" 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%2Fcyo2ee2o8athscu5xr1z.png" alt="Shared responsibility model" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automagical scaling
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Serverless:  “I don’t want to be bothered.”&lt;br&gt;
K8S: “We’re a large org; we &lt;em&gt;must&lt;/em&gt; be bothered.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Scalability in K8S works with  Autoscalers (HPA, VPA, CA, Karpenter, EKS Automode), but each solves a different slice of the scaling problem. And each introduces configuration overhead.&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%2F7150c836lmfk4abp9axs.png" 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%2F7150c836lmfk4abp9axs.png" alt="Autoscaling in K8S" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Serverless scalability feels magical until you hit concurrency quotas or encounter cold starts. &lt;br&gt;
Because Lambda does have constraints in reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Account/Regional concurrency limit&lt;/li&gt;
&lt;li&gt;Scaling rate = 1,000 new execution environments every 10 seconds&lt;/li&gt;
&lt;li&gt;Requests per second limit (10k RPS per 10 seconds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and you indeed to understand how they work and how to use &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reserved concurrency&lt;/li&gt;
&lt;li&gt;Provisioned concurrency&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost is too often misunderstood
&lt;/h2&gt;

&lt;p&gt;When comparing serverless and K8S on high-volume apps (~4B requests/month) it &lt;em&gt;seems&lt;/em&gt; obvious who the winner is. By the thousands ( of $$$ ).&lt;/p&gt;

&lt;p&gt;But the key missing factor is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The most expensive resource isn’t compute. It’s people.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;platform engineers&lt;/li&gt;
&lt;li&gt;k8s experts&lt;/li&gt;
&lt;li&gt;observability specialists&lt;/li&gt;
&lt;li&gt;SRE practices&lt;/li&gt;
&lt;li&gt;on-call rotations&lt;/li&gt;
&lt;li&gt;tooling ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…you &lt;em&gt;must&lt;/em&gt; include those in your cost model.&lt;/p&gt;

&lt;p&gt;A Kubernetes cluster may be cheaper than Lambda…&lt;br&gt;
but is it cheaper than hiring two expert platform engineers?&lt;/p&gt;

&lt;p&gt;I would rather pay for 2 more engineers developing our business logic and adding value to the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Long-Running Processes and Application Modernisation
&lt;/h2&gt;

&lt;p&gt;Most detractors of serverless usually then mention Lambda’s 15-minute timeout and Lift &amp;amp; Shift as deal-breakers.&lt;/p&gt;

&lt;p&gt;But this assumes you build long-running &lt;em&gt;monolithic&lt;/em&gt; workloads.&lt;br&gt;
while Serverless is, for me, primarily a mindset.  Once you start seeing things from a Serverless perspective, things look different and you might not even &lt;em&gt;have&lt;/em&gt; such problems. &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%2F4a0b1xk52g74k06yxqd9.png" 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%2F4a0b1xk52g74k06yxqd9.png" alt="colorful lego monolith" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because serverless offers alternative patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task chunking&lt;/li&gt;
&lt;li&gt;SQS fan-out&lt;/li&gt;
&lt;li&gt;Event-driven pipelines&lt;/li&gt;
&lt;li&gt;Step Functions (with workflows lasting &lt;strong&gt;up to a year&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Checkpointing/state transition events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And because Lift and Shift does not address the architectural and technical challenges that are pushing your organisation into modernisation.   Serverless and the &lt;a href="https://martinfowler.com/bliki/StranglerFigApplication.html" rel="noopener noreferrer"&gt;Strangler Fig pattern&lt;/a&gt; do!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Gateway + Lambda façade&lt;/li&gt;
&lt;li&gt;Gradually carve out endpoints&lt;/li&gt;
&lt;li&gt;Migrate at your own pace&lt;/li&gt;
&lt;li&gt;Avoid rewriting the entire system upfront&lt;/li&gt;
&lt;/ul&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%2F9jcmj92art3v4ipbpg6y.png" 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%2F9jcmj92art3v4ipbpg6y.png" alt="Strangler Fig" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Serverless modernization is incremental.&lt;br&gt;
Kubernetes modernization is infrastructural.&lt;/p&gt;

&lt;p&gt;Different problems, different solutions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;So… How Do You Choose?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Organizational factors trump technical ones.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You should ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What is our current team capable of supporting?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is our priority speed, cost, stability, or control?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the budget constraints ( predictability vs cost per transaction )&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the company priorities, direction and budget ( &lt;strong&gt;survival, growth, innovation&lt;/strong&gt; )?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fmhwb249efy7jj8tdrrri.png" 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%2Fmhwb249efy7jj8tdrrri.png" alt="Project Paradox" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The smartest teams don’t argue over technology choices.&lt;br&gt;
They ask: &lt;strong&gt;“Which architecture best serves our workload &lt;em&gt;and&lt;/em&gt; our organization right now?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And instead of fighting over paradigms, we should be learning from each other—teams that build scalable serverless systems and teams that run rock-solid Kubernetes platforms.&lt;/p&gt;

&lt;p&gt;Both worlds have powerful ideas worth sharing.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;Your turn: Help us expand the conversation&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;I don't want to go too much into detail because I don't want to spoil the talk, as I hope after presenting it already at AWS Community Day Poland and Netherlands, as well as DevFest Hamburg, I hope we will be able to visit many other conferences in 2026.&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%2Fcwkhatgz7zwldd3gnzye.png" 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%2Fcwkhatgz7zwldd3gnzye.png" alt="Talk Q&amp;amp;A" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But since the talk sparked a lot of interest during these conferences, I would like refine and deepen it further.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Which technical aspects would &lt;em&gt;you&lt;/em&gt; like us to explore next?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes autoscaling internals&lt;/li&gt;
&lt;li&gt;Hybrid architectures (EKS + serverless)&lt;/li&gt;
&lt;li&gt;Evolutionary architectures&lt;/li&gt;
&lt;li&gt;EDA patterns and Migrating from monolith to event-driven?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or maybe you disagree with something we said.&lt;br&gt;
Perfect — tell us!&lt;/p&gt;

&lt;p&gt;Drop your thoughts, critiques, and questions.&lt;br&gt;
Your input will help shape &lt;strong&gt;Version 2&lt;/strong&gt; of our talk.&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>kubernetes</category>
      <category>publicspeaking</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Know your tendencies - Questioning yourself (and others)- The 4 Tendencies Framework</title>
      <dc:creator>Davide de Paolis</dc:creator>
      <pubDate>Wed, 22 Oct 2025 15:50:54 +0000</pubDate>
      <link>https://forem.com/dvddpl/know-your-tendencies-questioning-yourself-and-others-the-4-tendencies-framework-1afg</link>
      <guid>https://forem.com/dvddpl/know-your-tendencies-questioning-yourself-and-others-the-4-tendencies-framework-1afg</guid>
      <description>&lt;p&gt;Recently, our People &amp;amp; Culture team shared something in our &lt;strong&gt;Learning Nuggets&lt;/strong&gt; Slack channel: &lt;a href="https://gretchenrubin.com/quiz/the-four-tendencies-quiz/" rel="noopener noreferrer"&gt;“The Four Tendencies” quiz&lt;/a&gt;, a framework by Gretchen Rubin that explores how people respond to expectations.&lt;/p&gt;

&lt;p&gt;The premise is straightforward: we all face external expectations (from others) and internal expectations (from ourselves). The way we respond to these defines which of the four tendencies we belong to:&lt;/p&gt;

&lt;h3&gt;
  
  
  Upholders
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I do what others expect of me—and what I expect from myself.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They meet both outer and inner expectations with discipline and consistency. Their motto: &lt;em&gt;“Discipline is my freedom.”&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Obligers
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I do what I have to do. I don’t want to let others down, but I may let myself down.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They readily meet outer expectations but struggle with self-imposed ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Questioners
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I do what I think is best, according to my judgment. If it doesn’t make sense, I won’t do it.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They turn all expectations into inner ones. They comply, if you can convince them why.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rebels
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I do what I want, in my own way. If you try to make me do something, even if I try to make myself do it, I’m less likely to do it.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They resist both outer and inner expectations alike.&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%2Fcatig00nzjdpst71xrjt.png" 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%2Fcatig00nzjdpst71xrjt.png" alt="the Four tendencies" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Result ( No Surprise!)
&lt;/h2&gt;

&lt;p&gt;When I took the quiz, the result didn’t surprise me.&lt;br&gt;
To some extent, I somehow longed and feared coming out as a Rebel, but the description of the Questioner fit almost perfectly.&lt;/p&gt;

&lt;p&gt;I don’t suffer from &lt;strong&gt;analysis paralysis&lt;/strong&gt; (anymore): I’ve learned to embrace the &lt;a href="https://www.amazon.jobs/content/en/our-workplace/leadership-principles" rel="noopener noreferrer"&gt;AWS Leadership Principle&lt;/a&gt; &lt;em&gt;“Bias for Action.”&lt;/em&gt; I also love the quote by Dr. Ellen Langer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Rather than waste your time being stressed over making the right decision, make the decision right.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That resonates deeply with how I approach both work and life.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Questioner
&lt;/h2&gt;

&lt;p&gt;The more I read about this tendency, the more I recognised myself in it, sometimes smiling, sometimes grimacing.&lt;/p&gt;

&lt;p&gt;Questioners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Value logic, reason, research, and fairness above all else.&lt;/li&gt;
&lt;li&gt;Question all expectations and comply only if they believe the reasoning is sound.&lt;/li&gt;
&lt;li&gt;Trust authority only when they respect the authority’s expertise.&lt;/li&gt;
&lt;li&gt;Can appear uncooperative or defiant because of their relentless questioning.&lt;/li&gt;
&lt;li&gt;Hate arbitrary rules (“Five garments per fitting room” drives them mad).&lt;/li&gt;
&lt;li&gt;Often dislike being questioned themselves.&lt;/li&gt;
&lt;li&gt;Sometimes struggle to delegate because they doubt others will act with enough urgency or thoughtfulness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was spot on, and I absolutely loved the line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“They wake up and think, ‘What needs to get done today—and why?’”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s exactly how my brain starts every morning.&lt;br&gt;
But a few of these points really made me pause and think.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Disliking being questioned (yes, the irony)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When someone challenges my decision, there’s an instant internal reaction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Do you think I didn’t research? Do you think I’m talking without thinking? Do you think I am stupid?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s not arrogance, but a reflex, a consequence of my awareness of how much thought I put into my own decisions.&lt;/p&gt;

&lt;p&gt;I am open to feedback, and I can change my mind quickly when proven wrong. But I realise that this initial defensiveness can make me seem less open than I actually am. It’s something I need to pay attention to, especially my tone ( and likely my facial expressions).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Authority and Expertise&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I follow authority only if I trust its expertise — and for me, that usually means &lt;em&gt;technical&lt;/em&gt; expertise.&lt;br&gt;
That’s been one of my biggest leadership challenges.&lt;br&gt;
Sometimes I still feel I need to prove my technical ability to deserve respect, even though my role now is no longer about being the most technical person in the room.&lt;/p&gt;

&lt;p&gt;Learning that influence and impact don’t always require technical authority, literally letting go of that has been an ongoing process.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Delegation and Trust&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I sometimes hesitate to delegate decision-making because I worry others won’t have the same bias for action.&lt;br&gt;
And yes, I’ve been burned before by &lt;strong&gt;people who&lt;/strong&gt; took ages to decide, or &lt;strong&gt;made poor choices after endless deliberation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But I’m learning that leadership isn’t about optimising every decision, it’s about enabling others to grow, even if that means tolerating inefficiency in the short term.&lt;/p&gt;

&lt;p&gt;And that (as arrogant as it may sound), as David Farley said in &lt;a href="https://www.youtube.com/watch?v=jMpCF0Z623s" rel="noopener noreferrer"&gt;this amazing and inspiring talk&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Allow team members freedom to do a worse job than you would&lt;/p&gt;
&lt;/blockquote&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%2F2vbda5jisp03h4pb9mo3.png" 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%2F2vbda5jisp03h4pb9mo3.png" alt="allow worse job" width="672" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I know these kinds of tests are far from being scientifically rigorous; they’re as valid as horoscopes.&lt;br&gt;
We answer based on how we see ourselves (or how we want to see ourselves), and the results are kind of blanket statements - they can always be true at some point for someone.&lt;/p&gt;

&lt;p&gt;Still, I love what they provoke: reflection.&lt;br&gt;
They make me see myself and others through slightly different lenses.&lt;br&gt;
(If you’ve ever read &lt;strong&gt;“&lt;a href="https://www.amazon.de/Surrounded-Idiots-Behavior-Effectively-Communicate" rel="noopener noreferrer"&gt;Surrounded by Idiots&lt;/a&gt;”&lt;/strong&gt;, you know the value of such frameworks when used as mirrors, not labels)&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%2Fqh2bchvfjtjzvmp79fzg.png" 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%2Fqh2bchvfjtjzvmp79fzg.png" alt="surrounded by idiots" width="181" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Growth and Acceptance
&lt;/h2&gt;

&lt;p&gt;One line from Gretchen Rubin’s website resonated deeply because it feels like the essence of growth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We can accept ourselves and also expect more from ourselves.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I often get frustrated by the oversimplified messages in personal growth, self-help or mental health content that say: &lt;em&gt;“Just accept yourself as you are.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yes, acceptance matters. But acceptance doesn’t mean stagnation.&lt;br&gt;
&lt;strong&gt;I accept who I am today, and I’m also committed to improving&lt;/strong&gt; not because I think I’m bad, but because &lt;strong&gt;I strongly believe in getting better&lt;/strong&gt;. &lt;br&gt;
The desire to improve does not always come from insecurity, a negative feeling of inferiority or guilt  (although I also wrote about that in my post &lt;a href="https://dev.to/dvddpl/maybe-you-should-start-listening-to-that-voice-telling-you-that-you-suck-2i49"&gt;Maybe you should start listening to that voice telling you that YOU SUCK!&lt;/a&gt;, it can simply be inspired by what we see around us. &lt;/p&gt;

&lt;p&gt;Probably I have been strongly shaped by the sports I have always practiced in my life: skateboarding, snowboarding, slacklining, climbing. Sport where &lt;strong&gt;failure is a constant&lt;/strong&gt;, where progress comes from repetition, discipline, and yes, a bit of pain. You master one move, then immediately start working on the next, harder one.&lt;br&gt;
And you start learning that failure is giving up, or not even trying, not not achieving your goal. You will, at some point, and right around the corner, there will be a new challenge. &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%2F0370bdgltkmi84zp4aha.png" 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%2F0370bdgltkmi84zp4aha.png" alt="the real failure is not to try" width="201" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, understanding that we can always improve, it's not self-rejection, it's evolution.&lt;/p&gt;

&lt;p&gt;Maybe personality frameworks like The Four Tendencies aren’t about boxing ourselves in.&lt;br&gt;
Maybe they’re about understanding the forces that drive us, so we can work with them, not against them.&lt;/p&gt;

&lt;p&gt;And as a lifelong Questioner, that’s enough reason for me.&lt;/p&gt;

</description>
      <category>personalgrowth</category>
      <category>mentalhealth</category>
      <category>growthmindset</category>
      <category>leadership</category>
    </item>
  </channel>
</rss>
