<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shuwen</title>
    <description>The latest articles on DEV Community by Shuwen (@sherwinwater).</description>
    <link>https://dev.to/sherwinwater</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%2F559229%2F262c5a0a-025d-4d3f-ba74-5f4fa173fb2e.png</url>
      <title>DEV Community: Shuwen</title>
      <link>https://dev.to/sherwinwater</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sherwinwater"/>
    <language>en</language>
    <item>
      <title>Why We Do Indexing: Not Just for Speed, but for Cost and Hardware Reality</title>
      <dc:creator>Shuwen</dc:creator>
      <pubDate>Tue, 30 Dec 2025 19:31:42 +0000</pubDate>
      <link>https://dev.to/sherwinwater/why-we-do-indexing-not-just-for-speed-but-for-cost-and-hardware-reality-3pg5</link>
      <guid>https://dev.to/sherwinwater/why-we-do-indexing-not-just-for-speed-but-for-cost-and-hardware-reality-3pg5</guid>
      <description>&lt;p&gt;As software engineers, we are often asked a very common interview question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why do we use database indexing?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The standard answer is familiar to all of us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To make queries faster&lt;/li&gt;
&lt;li&gt;To reduce time complexity from &lt;strong&gt;O(n)&lt;/strong&gt; to &lt;strong&gt;O(log n)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;By using data structures such as &lt;strong&gt;B-trees&lt;/strong&gt; or &lt;strong&gt;B+-trees&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;At the cost of extra storage and maintenance during insert, update, and delete operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this is correct.&lt;/p&gt;

&lt;p&gt;But this answer is &lt;strong&gt;incomplete&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is a deeper reason behind indexing—one that becomes obvious only when you work with &lt;strong&gt;real production systems&lt;/strong&gt;, &lt;strong&gt;cloud databases&lt;/strong&gt;, and &lt;strong&gt;billing dashboards&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem: Disk I/O, Not CPU
&lt;/h2&gt;

&lt;p&gt;At the end of the day, databases store data on &lt;strong&gt;disk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Even in modern systems with caching and memory layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory access happens in &lt;strong&gt;nanoseconds&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Disk access happens in &lt;strong&gt;milliseconds&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That difference is &lt;strong&gt;millions of times slower&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When a query does &lt;strong&gt;not&lt;/strong&gt; use an index, the database often has no choice but to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scan a large number of rows&lt;/li&gt;
&lt;li&gt;Read many data pages from disk&lt;/li&gt;
&lt;li&gt;Perform repeated I/O operations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where performance collapses—not because of algorithms, but because of &lt;strong&gt;physical disk access&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Indexing Is an I/O Optimization
&lt;/h2&gt;

&lt;p&gt;Indexes allow the database engine to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jump directly to relevant data pages&lt;/li&gt;
&lt;li&gt;Read far fewer disk blocks&lt;/li&gt;
&lt;li&gt;Avoid full table scans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This results in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer disk reads&lt;/li&gt;
&lt;li&gt;Better cache utilization&lt;/li&gt;
&lt;li&gt;Lower latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Indexing primarily reduces disk I/O, not just CPU work.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Speed is the &lt;em&gt;symptom&lt;/em&gt;.&lt;br&gt;
Reduced I/O is the &lt;em&gt;cause&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Disk Has a Lifespan and a Cost
&lt;/h2&gt;

&lt;p&gt;Every disk read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consumes I/O bandwidth&lt;/li&gt;
&lt;li&gt;Adds wear to storage devices (especially SSD-based systems)&lt;/li&gt;
&lt;li&gt;Competes with other workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In traditional on-prem systems, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardware degradation&lt;/li&gt;
&lt;li&gt;Capacity planning problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In cloud systems, it means something very concrete:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Money.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Cloud Databases Charge for I/O
&lt;/h2&gt;

&lt;p&gt;Managed databases such as &lt;strong&gt;Amazon Aurora&lt;/strong&gt; charge based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Compute&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I/O requests&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Behind the scenes, every disk read is counted.&lt;/p&gt;

&lt;p&gt;So when a poorly indexed query:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scans millions of rows&lt;/li&gt;
&lt;li&gt;Performs unnecessary disk reads&lt;/li&gt;
&lt;li&gt;Runs repeatedly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are not just slowing down the system—you are &lt;strong&gt;directly increasing your cloud bill&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Realistic Example
&lt;/h2&gt;

&lt;p&gt;Imagine a legacy system with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimal or missing indexes&lt;/li&gt;
&lt;li&gt;Heavy reporting queries&lt;/li&gt;
&lt;li&gt;High read traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suppose it generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;100 billion I/O requests per month&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that scale, even a tiny per-request cost becomes massive.&lt;/p&gt;

&lt;p&gt;Now introduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proper indexing&lt;/li&gt;
&lt;li&gt;Query optimization&lt;/li&gt;
&lt;li&gt;Better access patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If indexing reduces disk reads by &lt;strong&gt;80–90%&lt;/strong&gt;, then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query latency drops&lt;/li&gt;
&lt;li&gt;System stability improves&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud cost drops dramatically&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not theoretical.&lt;br&gt;
This happens all the time in real production systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Yes, Indexes Have a Cost — and That’s OK
&lt;/h2&gt;

&lt;p&gt;Indexes do introduce trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extra storage&lt;/li&gt;
&lt;li&gt;Slower writes&lt;/li&gt;
&lt;li&gt;Maintenance overhead during INSERT, UPDATE, and DELETE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in most production systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads vastly outnumber writes&lt;/li&gt;
&lt;li&gt;Disk I/O is the dominant bottleneck&lt;/li&gt;
&lt;li&gt;Cloud billing is tied to I/O&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these environments, indexing is almost always the right trade-off.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Better Answer to “Why Do We Use Indexing?”
&lt;/h2&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Indexing makes queries faster.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A more accurate answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Indexing reduces disk I/O, which improves performance, extends hardware lifespan, and significantly lowers cloud costs.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;Indexing exists because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disk access is slow&lt;/li&gt;
&lt;li&gt;Disk access is expensive&lt;/li&gt;
&lt;li&gt;Disk access is limited&lt;/li&gt;
&lt;li&gt;Disk access is billed in the cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Speed is just the &lt;strong&gt;visible benefit&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;Cost and hardware reality are the real reasons.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Credits &amp;amp; References
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept inspiration and database fundamentals:&lt;/strong&gt;&lt;br&gt;
Berkeley CS186 – &lt;em&gt;Introduction to Database Systems&lt;/em&gt;&lt;br&gt;
University of California, Berkeley&lt;br&gt;
&lt;a href="https://cs186berkeley.net/" rel="noopener noreferrer"&gt;https://cs186berkeley.net/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indexing</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Real Software Architecture Lives in the Mind</title>
      <dc:creator>Shuwen</dc:creator>
      <pubDate>Tue, 30 Dec 2025 19:29:42 +0000</pubDate>
      <link>https://dev.to/sherwinwater/the-real-software-architecture-lives-in-the-mind-8fe</link>
      <guid>https://dev.to/sherwinwater/the-real-software-architecture-lives-in-the-mind-8fe</guid>
      <description>&lt;h2&gt;
  
  
  Why software problems are not code problems
&lt;/h2&gt;

&lt;p&gt;Most software systems don’t fail. They survive.&lt;br&gt;&lt;br&gt;
They keep running, keep serving users, keep appearing “stable” — while quietly becoming more expensive, more fragile, and more feared every year.&lt;/p&gt;

&lt;p&gt;Teams complain about legacy code, bad architecture, and messy systems, but rarely ask the harder question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do we keep building software that works, yet nobody dares to change?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is uncomfortable, because it has less to do with frameworks or patterns, and much more to do with how we think while building software in the first place.&lt;/p&gt;




&lt;h2&gt;
  
  
  When We Talk About Software Problems
&lt;/h2&gt;

&lt;p&gt;When we talk about software problems, we usually talk about code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Messy code
&lt;/li&gt;
&lt;li&gt;Legacy code
&lt;/li&gt;
&lt;li&gt;Bad architecture
&lt;/li&gt;
&lt;li&gt;Systems nobody dares to touch
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We complain about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;projects that “work” but cost a lot to run
&lt;/li&gt;
&lt;li&gt;systems that are slow to change
&lt;/li&gt;
&lt;li&gt;services that survive for years without improving
&lt;/li&gt;
&lt;li&gt;teams that keep adding code but never make things better
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These problems are everywhere.&lt;/p&gt;

&lt;p&gt;And the question we rarely ask is not &lt;em&gt;how to fix them&lt;/em&gt;, but:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do we keep creating systems like this in the first place?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real Story From a Real System (Story #1)
&lt;/h2&gt;

&lt;p&gt;There was a system built more than ten years ago.&lt;/p&gt;

&lt;p&gt;At the time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the company owned its own data center
&lt;/li&gt;
&lt;li&gt;traffic was small
&lt;/li&gt;
&lt;li&gt;database access was cheap and unlimited
&lt;/li&gt;
&lt;li&gt;the team was small and under pressure to deliver fast
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the system grew naturally — but without structure.&lt;/p&gt;

&lt;p&gt;To move faster:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;logic went into one file
&lt;/li&gt;
&lt;li&gt;database queries were written freely
&lt;/li&gt;
&lt;li&gt;business rules, control flow, and data access mixed together
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;that one file became over 8,000 lines
&lt;/li&gt;
&lt;li&gt;nested conditions were everywhere
&lt;/li&gt;
&lt;li&gt;class names only the original author understood
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And still — it worked.&lt;/p&gt;

&lt;p&gt;Years later, the company moved to AWS.&lt;br&gt;&lt;br&gt;
The database became Aurora.&lt;br&gt;&lt;br&gt;
Every query now had a price.&lt;/p&gt;

&lt;p&gt;Nothing in the business logic changed.&lt;br&gt;&lt;br&gt;
But suddenly, the system started showing up on the monthly bill.&lt;/p&gt;

&lt;p&gt;Hundreds of dollars.&lt;br&gt;&lt;br&gt;
Then thousands.&lt;/p&gt;

&lt;p&gt;Everyone knew:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We could reduce this cost a lot.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But nobody touched the code.&lt;/p&gt;

&lt;p&gt;It wasn’t because the team didn’t know SQL.&lt;br&gt;&lt;br&gt;
It wasn’t because they didn’t know optimization.&lt;br&gt;&lt;br&gt;
It was because the system was &lt;strong&gt;too risky to change&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The system survived — not because it was good,&lt;br&gt;&lt;br&gt;
but because it was &lt;strong&gt;hard to kill&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Real Story (Story #2)
&lt;/h2&gt;

&lt;p&gt;I’ve also seen a different kind of system.&lt;/p&gt;

&lt;p&gt;It looked “clean” on the surface.&lt;/p&gt;

&lt;p&gt;There were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;controllers
&lt;/li&gt;
&lt;li&gt;services
&lt;/li&gt;
&lt;li&gt;repositories
&lt;/li&gt;
&lt;li&gt;interfaces
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each folder was organized.&lt;br&gt;&lt;br&gt;
Each layer had its place.&lt;/p&gt;

&lt;p&gt;But when a new feature was requested, something strange happened.&lt;/p&gt;

&lt;p&gt;Developers spent days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tracing logic across files
&lt;/li&gt;
&lt;li&gt;jumping between layers
&lt;/li&gt;
&lt;li&gt;trying to understand where the real business rules lived
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing was obviously wrong.&lt;br&gt;&lt;br&gt;
But nothing was obviously clear either.&lt;/p&gt;

&lt;p&gt;To add a feature, the easiest solution was always:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Let’s just add another service file.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the number of files grew
&lt;/li&gt;
&lt;li&gt;duplication increased
&lt;/li&gt;
&lt;li&gt;behavior became implicit, not explicit
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, the system worked.&lt;br&gt;&lt;br&gt;
Again, nobody dared to refactor deeply.&lt;/p&gt;

&lt;p&gt;So we have to ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do systems that “work” so often become systems we fear?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Easy Answers (And Why They Are Wrong)
&lt;/h2&gt;

&lt;p&gt;People usually give simple explanations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“They didn’t know design patterns.”
&lt;/li&gt;
&lt;li&gt;“They didn’t follow clean architecture.”
&lt;/li&gt;
&lt;li&gt;“They didn’t know SOLID principles.”
&lt;/li&gt;
&lt;li&gt;“They didn’t write tests.”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These answers are comfortable — and mostly wrong.&lt;/p&gt;

&lt;p&gt;I’ve seen teams that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;knew SOLID
&lt;/li&gt;
&lt;li&gt;knew clean architecture
&lt;/li&gt;
&lt;li&gt;knew patterns
&lt;/li&gt;
&lt;li&gt;organized folders correctly
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And still produced systems that were hard to change.&lt;/p&gt;

&lt;p&gt;So the problem is not knowledge.&lt;br&gt;&lt;br&gt;
And it’s not a missing pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Root Cause: The Software Engineering Mind
&lt;/h2&gt;

&lt;p&gt;At some point, I realized something important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture does not come first.
&lt;/li&gt;
&lt;li&gt;Design principles do not come first.
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The engineering mind comes first.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good or messy systems are not created by accident.&lt;br&gt;&lt;br&gt;
They are created by how people think while building them.&lt;/p&gt;

&lt;p&gt;Two developers can face:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the same requirements
&lt;/li&gt;
&lt;li&gt;the same deadlines
&lt;/li&gt;
&lt;li&gt;the same pressure
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One creates something that evolves.&lt;br&gt;&lt;br&gt;
The other creates something that freezes.&lt;/p&gt;

&lt;p&gt;The difference is not skill.&lt;br&gt;&lt;br&gt;
It’s not experience.&lt;br&gt;&lt;br&gt;
It’s not tools.&lt;/p&gt;

&lt;p&gt;It’s the &lt;strong&gt;mind behind the decisions&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Software Is Invisible — That Changes Everything
&lt;/h2&gt;

&lt;p&gt;Unlike hardware, software is invisible.&lt;/p&gt;

&lt;p&gt;You can’t:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;touch it
&lt;/li&gt;
&lt;li&gt;weigh it
&lt;/li&gt;
&lt;li&gt;feel its quality immediately
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A piece of software can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run correctly
&lt;/li&gt;
&lt;li&gt;pass tests
&lt;/li&gt;
&lt;li&gt;serve users
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cost too much to operate
&lt;/li&gt;
&lt;li&gt;require too many people to maintain
&lt;/li&gt;
&lt;li&gt;slow down every future change
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real cost appears late:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in cloud bills
&lt;/li&gt;
&lt;li&gt;in on-call pain
&lt;/li&gt;
&lt;li&gt;in slow delivery
&lt;/li&gt;
&lt;li&gt;in burned-out teams
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the damage is invisible,&lt;br&gt;&lt;br&gt;
&lt;strong&gt;the engineering mind matters more than the code itself&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is the Software Engineering Mind? (In Practice)
&lt;/h2&gt;

&lt;p&gt;This is not about being perfect.&lt;br&gt;&lt;br&gt;
It’s not about knowing all the answers.&lt;/p&gt;

&lt;p&gt;From my experience, the software engineering mind shows up in a few very concrete ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Thinking Beyond “It Works”
&lt;/h3&gt;

&lt;p&gt;A developer stops at:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It works.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An engineer keeps going:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How will this run at scale?
&lt;/li&gt;
&lt;li&gt;How will this change?
&lt;/li&gt;
&lt;li&gt;What will this cost — not just today, but later?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why some systems quietly become expensive,&lt;br&gt;&lt;br&gt;
while others stay manageable.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Treating Software as a Craft, Not a Task
&lt;/h3&gt;

&lt;p&gt;With this mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shortcuts are taken consciously, not blindly
&lt;/li&gt;
&lt;li&gt;clarity is valued even when nobody asks for it
&lt;/li&gt;
&lt;li&gt;responsibility extends beyond the ticket
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like a craftsman:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you know shortcuts exist
&lt;/li&gt;
&lt;li&gt;but you also know what they cost
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mindset doesn’t slow teams down.&lt;br&gt;&lt;br&gt;
It prevents teams from getting stuck.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Respecting Invisibility
&lt;/h3&gt;

&lt;p&gt;Engineers with this mind understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;complexity hides
&lt;/li&gt;
&lt;li&gt;problems accumulate quietly
&lt;/li&gt;
&lt;li&gt;systems don’t fail immediately — they decay
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So they design with humility.&lt;br&gt;&lt;br&gt;
They expect change.&lt;br&gt;&lt;br&gt;
They leave room for replacement.&lt;/p&gt;

&lt;p&gt;This is why their systems are easier to refactor — or shut down.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Seeking Problems, Not Just Solving Tasks
&lt;/h3&gt;

&lt;p&gt;Some people solve exactly what is asked.&lt;/p&gt;

&lt;p&gt;Others ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“What will hurt later?”
&lt;/li&gt;
&lt;li&gt;“What are we afraid to touch?”
&lt;/li&gt;
&lt;li&gt;“Why is this part so fragile?”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Legacy systems are rarely created by one bad decision.&lt;br&gt;&lt;br&gt;
They are created when &lt;strong&gt;no one looks for problems early&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rethinking “Good” and “Bad” Code
&lt;/h2&gt;

&lt;p&gt;I don’t like labeling code as “good” or “bad”.&lt;br&gt;&lt;br&gt;
That’s too simple.&lt;/p&gt;

&lt;p&gt;A better distinction is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some code &lt;strong&gt;invites change&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Some code &lt;strong&gt;resists change&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good systems are not immortal.&lt;br&gt;&lt;br&gt;
They are easy to replace.&lt;/p&gt;

&lt;p&gt;Bad systems don’t survive because they are strong.&lt;br&gt;&lt;br&gt;
They survive because they &lt;strong&gt;cannot be changed safely&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the paradox:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hardest systems to kill are often the worst ones.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  From Developer to Engineer
&lt;/h2&gt;

&lt;p&gt;Becoming a great engineer is not about memorizing patterns.&lt;br&gt;&lt;br&gt;
It’s not about copying architectures from books.&lt;/p&gt;

&lt;p&gt;It’s about developing a mind that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sees beyond today’s task
&lt;/li&gt;
&lt;li&gt;respects long-term cost
&lt;/li&gt;
&lt;li&gt;treats software as a living system
&lt;/li&gt;
&lt;li&gt;owns consequences, not just output
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;even imperfect designs improve over time
&lt;/li&gt;
&lt;li&gt;even legacy systems become better
&lt;/li&gt;
&lt;li&gt;even unknown problems find solutions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no framework saves you
&lt;/li&gt;
&lt;li&gt;no architecture survives
&lt;/li&gt;
&lt;li&gt;no amount of knowledge prevents decay
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Good software does not come from knowing the right answers.&lt;/p&gt;

&lt;p&gt;It comes from having the mind that knows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to ask better questions
&lt;/li&gt;
&lt;li&gt;how to find solutions when none are obvious
&lt;/li&gt;
&lt;li&gt;how to build things that can change — or disappear — when needed
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between writing code&lt;br&gt;&lt;br&gt;
and practicing software engineering.&lt;/p&gt;

&lt;p&gt;And that mind is what truly separates&lt;br&gt;&lt;br&gt;
&lt;strong&gt;a good developer from a great engineer&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How to Learn as a Software Engineer: Lessons from The Pragmatic Programmer</title>
      <dc:creator>Shuwen</dc:creator>
      <pubDate>Sun, 21 Dec 2025 20:53:03 +0000</pubDate>
      <link>https://dev.to/sherwinwater/reading-notesthe-pragmatic-programmer-2gm5</link>
      <guid>https://dev.to/sherwinwater/reading-notesthe-pragmatic-programmer-2gm5</guid>
      <description>&lt;p&gt;I’ve known about &lt;em&gt;The Pragmatic Programmer&lt;/em&gt; for a long time, but I only read it recently. To be honest, it truly deserves its reputation as a classic. Even though the book was written years ago, many of its ideas still feel surprisingly relevant today—especially the parts about how software engineers learn and grow. Below is my own summary and reflection on what I learned from the book, with a focus on the learning mindset rather than specific languages or tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Treat Learning as a Core Professional Skill
&lt;/h2&gt;

&lt;p&gt;The book’s central idea is simple but strict:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Your knowledge has a half-life.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you stop learning, your value decays.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Software engineering isn’t about mastering &lt;em&gt;one&lt;/em&gt; stack. It’s about &lt;strong&gt;continuously adapting&lt;/strong&gt; as tools, paradigms, and expectations change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key mindset:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning is not optional
&lt;/li&gt;
&lt;li&gt;Learning is part of the job, not a hobby
&lt;/li&gt;
&lt;li&gt;Curiosity is a professional responsibility
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Build a Personal Knowledge Portfolio
&lt;/h2&gt;

&lt;p&gt;Just like financial investments, your skills need &lt;strong&gt;diversification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The book recommends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t over-specialize too early
&lt;/li&gt;
&lt;li&gt;Avoid being “the X-only engineer”
&lt;/li&gt;
&lt;li&gt;Regularly invest in new areas
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples of diversification:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One new programming language per year
&lt;/li&gt;
&lt;li&gt;Different paradigms (OO, FP, procedural, event-driven)
&lt;/li&gt;
&lt;li&gt;Domains outside your daily work (databases, networking, security, UX)
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;A good engineer is &lt;strong&gt;T-shaped&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
deep in one area, broad across many.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Learn by Doing, Not by Collecting Information
&lt;/h2&gt;

&lt;p&gt;Reading alone doesn’t count as learning.&lt;/p&gt;

&lt;p&gt;The book emphasizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Experimentation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototyping&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hands-on practice&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I read about X”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Prefer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I built a small thing with X”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Concrete advice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write throwaway prototypes
&lt;/li&gt;
&lt;li&gt;Build toy versions of real systems
&lt;/li&gt;
&lt;li&gt;Re-implement small tools to understand them
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This aligns strongly with your own habit of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building tracing demos
&lt;/li&gt;
&lt;li&gt;Refactoring real production services
&lt;/li&gt;
&lt;li&gt;Writing tests to understand behavior
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re already practicing this philosophy well.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Learn How to Learn (Meta-Learning)
&lt;/h2&gt;

&lt;p&gt;One of the most important points in the book:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Technology changes, learning skills don’t.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Good engineers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Know how to break down unfamiliar systems
&lt;/li&gt;
&lt;li&gt;Can quickly form mental models
&lt;/li&gt;
&lt;li&gt;Ask better questions over time
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Techniques encouraged:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read source code
&lt;/li&gt;
&lt;li&gt;Debug other people’s systems
&lt;/li&gt;
&lt;li&gt;Trace data and control flow
&lt;/li&gt;
&lt;li&gt;Use logs, traces, and experiments as learning tools
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly why observability (logs, metrics, tracing) is framed as a &lt;em&gt;learning amplifier&lt;/em&gt;, not just a debugging tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Read Widely — Not Just Code
&lt;/h2&gt;

&lt;p&gt;The book strongly discourages tunnel vision.&lt;/p&gt;

&lt;p&gt;Recommended learning sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code (yours and others’)
&lt;/li&gt;
&lt;li&gt;Technical books
&lt;/li&gt;
&lt;li&gt;Design papers
&lt;/li&gt;
&lt;li&gt;Postmortems
&lt;/li&gt;
&lt;li&gt;Non-technical books (psychology, systems thinking, communication)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why?&lt;br&gt;&lt;br&gt;
Because software engineering is &lt;strong&gt;human systems + technical systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your interest in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture
&lt;/li&gt;
&lt;li&gt;Leadership
&lt;/li&gt;
&lt;li&gt;Clean design
&lt;/li&gt;
&lt;li&gt;Organizational impact
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;fits perfectly with this advice.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Learn Continuously in Small, Regular Batches
&lt;/h2&gt;

&lt;p&gt;Don’t wait for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Free time”
&lt;/li&gt;
&lt;li&gt;A new job
&lt;/li&gt;
&lt;li&gt;A crisis
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn a little every day
&lt;/li&gt;
&lt;li&gt;20–30 minutes consistently beats cramming
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mirrors the book’s preference for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sustainable habits
&lt;/li&gt;
&lt;li&gt;Incremental growth
&lt;/li&gt;
&lt;li&gt;Long-term thinking
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Teach What You Learn
&lt;/h2&gt;

&lt;p&gt;A subtle but powerful idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Teaching is a forcing function for understanding.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The book encourages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing
&lt;/li&gt;
&lt;li&gt;Blogging
&lt;/li&gt;
&lt;li&gt;Explaining concepts to others
&lt;/li&gt;
&lt;li&gt;Reviewing code thoughtfully
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your habit of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing Medium articles
&lt;/li&gt;
&lt;li&gt;Creating structured notes
&lt;/li&gt;
&lt;li&gt;Turning experience into documentation
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;is exactly what the book would recommend.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Be Humble, but Confident
&lt;/h2&gt;

&lt;p&gt;Finally, the learning mindset is emotional as much as technical.&lt;/p&gt;

&lt;p&gt;The book encourages engineers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Admit when they don’t know
&lt;/li&gt;
&lt;li&gt;Be comfortable being a beginner again
&lt;/li&gt;
&lt;li&gt;Avoid ego-driven attachment to tools
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Growth comes from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Curiosity &amp;gt; pride
&lt;/li&gt;
&lt;li&gt;Adaptability &amp;gt; certainty
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  One-Sentence Summary
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A great software engineer grows by continuously learning, experimenting, teaching, and adapting—treating knowledge as a living system, not a fixed achievement.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>learning</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Learning as a Software Engineer Is Not About Reading — It’s About Applying</title>
      <dc:creator>Shuwen</dc:creator>
      <pubDate>Sun, 21 Dec 2025 20:50:07 +0000</pubDate>
      <link>https://dev.to/sherwinwater/learning-as-a-software-engineer-is-not-about-reading-its-about-applying-2i9</link>
      <guid>https://dev.to/sherwinwater/learning-as-a-software-engineer-is-not-about-reading-its-about-applying-2i9</guid>
      <description>&lt;p&gt;I’ve read many software engineering books over the years, but one idea keeps repeating itself in different forms:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Learning only matters when it changes how you work.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This idea appears clearly in &lt;em&gt;:contentReference[oaicite:0]{index=0}&lt;/em&gt;, and it shows up again—from a different angle—in &lt;em&gt;:contentReference[oaicite:1]{index=1}&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Recently, while working on a real production system, I realized I wasn’t just reading these ideas anymore—I was actively &lt;strong&gt;applying them&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Reading to Doing: What Changed in My Daily Work
&lt;/h2&gt;

&lt;p&gt;Over the past months, I’ve been refactoring and evolving a system that spans multiple microservices. Instead of adding features blindly, I started applying what I had learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactoring services using &lt;strong&gt;Clean / Hexagonal Architecture&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Separating &lt;strong&gt;domain logic from infrastructure&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Introducing &lt;strong&gt;distributed tracing&lt;/strong&gt; to make invisible dependencies visible&lt;/li&gt;
&lt;li&gt;Designing around &lt;strong&gt;use cases&lt;/strong&gt;, not frameworks&lt;/li&gt;
&lt;li&gt;Treating observability as a &lt;strong&gt;learning tool&lt;/strong&gt;, not just a debugging aid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these came from copying code snippets from a book.&lt;/p&gt;

&lt;p&gt;They came from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading&lt;/li&gt;
&lt;li&gt;Reflecting&lt;/li&gt;
&lt;li&gt;Applying&lt;/li&gt;
&lt;li&gt;Observing results&lt;/li&gt;
&lt;li&gt;Adjusting again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly what &lt;em&gt;The Pragmatic Programmer&lt;/em&gt; emphasizes:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;knowledge has value only when it is exercised.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Clean Architecture Was Not the Goal — Understanding Was
&lt;/h2&gt;

&lt;p&gt;When I first read about Clean Architecture, it sounded elegant. But elegance alone doesn’t survive contact with production systems.&lt;/p&gt;

&lt;p&gt;The real value appeared only when I applied it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce coupling between services&lt;/li&gt;
&lt;li&gt;Make refactoring safer&lt;/li&gt;
&lt;li&gt;Improve testability&lt;/li&gt;
&lt;li&gt;Clarify ownership of business rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, architecture stopped being a diagram.&lt;br&gt;&lt;br&gt;
It became a &lt;strong&gt;tool for thinking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That shift—from concept to practice—is learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tracing: Learning the System by Observing It
&lt;/h2&gt;

&lt;p&gt;Another turning point was introducing distributed tracing.&lt;/p&gt;

&lt;p&gt;Before tracing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debugging meant guessing&lt;/li&gt;
&lt;li&gt;Logs were fragmented&lt;/li&gt;
&lt;li&gt;Cross-service failures felt like finding a needle in a haystack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After tracing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service dependencies became visible&lt;/li&gt;
&lt;li&gt;Execution paths were explicit&lt;/li&gt;
&lt;li&gt;Failures told a story&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tracing didn’t just help debugging—it &lt;strong&gt;taught me how the system actually behaves&lt;/strong&gt;, not how I assumed it behaved.&lt;/p&gt;

&lt;p&gt;Observability became a way to &lt;em&gt;learn the system&lt;/em&gt;, not just fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Broad Knowledge Matters More Than We Think
&lt;/h2&gt;

&lt;p&gt;This brings me to a personal experience that changed how I think about seniority.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Plumber Story
&lt;/h3&gt;

&lt;p&gt;Several months ago, we had a water-dripping issue in our house.&lt;br&gt;&lt;br&gt;
We hired a plumber.&lt;/p&gt;

&lt;p&gt;He drilled holes, checked pipes, and looked everywhere &lt;strong&gt;inside&lt;/strong&gt; the house—but found nothing. No solution.&lt;/p&gt;

&lt;p&gt;Later, on a rainy night, we noticed water dripping along the bricks. The real issue was outside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rusted nails on the roof&lt;/li&gt;
&lt;li&gt;Water entering from above&lt;/li&gt;
&lt;li&gt;Gravity doing the rest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The plumber wasn’t incompetent.&lt;br&gt;&lt;br&gt;
He was &lt;strong&gt;too narrow&lt;/strong&gt; in perspective.&lt;/p&gt;

&lt;p&gt;An experienced plumber might have asked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Does this only happen when it rains?”&lt;/li&gt;
&lt;li&gt;“Could the source be outside?”&lt;/li&gt;
&lt;li&gt;“Let’s check the roof first.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That moment immediately reminded me of &lt;em&gt;Staff Engineer&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Staff Engineer Mindset: Depth + Breadth
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Staff Engineer&lt;/em&gt; makes a simple but powerful point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A staff engineer is deep in one or two areas,&lt;br&gt;&lt;br&gt;
but broad enough to see the whole system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s the difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixing symptoms
&lt;/li&gt;
&lt;li&gt;Understanding systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In software, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep expertise in your core domain&lt;/li&gt;
&lt;li&gt;Broad understanding of:

&lt;ul&gt;
&lt;li&gt;Infrastructure&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Data flow&lt;/li&gt;
&lt;li&gt;Human and organizational workflows&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Without breadth, we drill holes in the wrong place.&lt;/p&gt;




&lt;h2&gt;
  
  
  Continuous Learning Is About Expanding Vision
&lt;/h2&gt;

&lt;p&gt;Looking back, I realized something important:&lt;/p&gt;

&lt;p&gt;I didn’t become better by reading more.&lt;br&gt;&lt;br&gt;
I became better by &lt;strong&gt;connecting what I read to real problems&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture books helped me refactor safely&lt;/li&gt;
&lt;li&gt;Observability taught me how systems actually fail&lt;/li&gt;
&lt;li&gt;Broader technical exposure helped me ask better questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is continuous learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not chasing trends&lt;/li&gt;
&lt;li&gt;Not memorizing tools&lt;/li&gt;
&lt;li&gt;But expanding how you &lt;strong&gt;see problems&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;A strong software engineer is not defined by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many books they read&lt;/li&gt;
&lt;li&gt;How many frameworks they know&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How they adapt what they learn&lt;/li&gt;
&lt;li&gt;How they apply it to real systems&lt;/li&gt;
&lt;li&gt;How wide their perspective becomes over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just like an experienced plumber,&lt;br&gt;&lt;br&gt;
the best engineers don’t just know &lt;em&gt;where to drill&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;They know &lt;strong&gt;where not to&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>learning</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Clean Architecture Design Flow: A Practical Guide to Diagrams That Actually Help</title>
      <dc:creator>Shuwen</dc:creator>
      <pubDate>Sat, 20 Dec 2025 20:06:01 +0000</pubDate>
      <link>https://dev.to/sherwinwater/clean-architecture-design-flow-a-practical-guide-to-diagrams-that-actually-help-12ke</link>
      <guid>https://dev.to/sherwinwater/clean-architecture-design-flow-a-practical-guide-to-diagrams-that-actually-help-12ke</guid>
      <description>&lt;p&gt;When I applied Clean Architecture in a new project, I treated it as an &lt;strong&gt;engineering process&lt;/strong&gt;, not a refactor-after-the-fact exercise.&lt;/p&gt;

&lt;p&gt;Instead of starting with frameworks or package structures, I began by &lt;strong&gt;explicitly identifying the system’s use cases&lt;/strong&gt; and modeling their workflows at a high level. These early diagrams helped me reason about execution flow, failure paths, and—most importantly—where architectural boundaries should live.&lt;/p&gt;

&lt;p&gt;Only after those boundaries were clear did I open IntelliJ and start coding.&lt;/p&gt;

&lt;p&gt;This allowed architecture to &lt;strong&gt;guide implementation&lt;/strong&gt;, instead of being constantly corrected by it. &lt;/p&gt;




&lt;h2&gt;
  
  
  What I Did (Concrete Steps)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Identified and named core application &lt;strong&gt;use cases&lt;/strong&gt; (business workflows)&lt;/li&gt;
&lt;li&gt;Drew &lt;strong&gt;use case&lt;/strong&gt; and &lt;strong&gt;sequence diagrams&lt;/strong&gt; to understand execution flow&lt;/li&gt;
&lt;li&gt;Used diagrams to identify &lt;strong&gt;core vs. infrastructure boundaries&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Created the project skeleton in IntelliJ based on those boundaries&lt;/li&gt;
&lt;li&gt;Defined &lt;strong&gt;interfaces (ports)&lt;/strong&gt; in the core&lt;/li&gt;
&lt;li&gt;Implemented &lt;strong&gt;adapters&lt;/strong&gt; (REST, persistence, messaging) against ports&lt;/li&gt;
&lt;li&gt;Updated high-level diagrams and shared them with the team&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  When to Draw Diagrams, What to Draw, and Why
&lt;/h1&gt;

&lt;p&gt;If you’ve ever felt overwhelmed by UML diagrams that look impressive but don’t help you build better software, this guide is for you.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;lightweight, practical design flow&lt;/strong&gt; for projects using Clean Architecture (Hexagonal Architecture). The goal is to make system intent explicit, reduce cognitive load, and keep diagrams useful—not decorative.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Guiding Principle
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diagrams are thinking tools, not documentation artifacts.&lt;/strong&gt;&lt;br&gt;
Draw them to make decisions.&lt;br&gt;
Stop drawing when the code becomes clearer than the diagram.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Stage 0 — Problem Framing (No Diagrams Yet)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Goal
&lt;/h3&gt;

&lt;p&gt;Understand &lt;strong&gt;why&lt;/strong&gt; the system exists.&lt;/p&gt;

&lt;h3&gt;
  
  
  What You Do
&lt;/h3&gt;

&lt;p&gt;Write a short paragraph answering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who uses the system?&lt;/li&gt;
&lt;li&gt;What problem does it solve?&lt;/li&gt;
&lt;li&gt;What outcomes matter?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;This system handles order checkout, payment retries, and order expiration across REST APIs, Kafka retries, and scheduled jobs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📌 &lt;strong&gt;No UML yet.&lt;/strong&gt;&lt;br&gt;
If this is unclear, diagrams won’t help.&lt;/p&gt;


&lt;h2&gt;
  
  
  Stage 1 — Identify Use Cases (MANDATORY)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Goal
&lt;/h3&gt;

&lt;p&gt;Make system intent explicit.&lt;/p&gt;
&lt;h3&gt;
  
  
  What You Produce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A list of &lt;strong&gt;use cases&lt;/strong&gt; (verbs, not nouns)&lt;/li&gt;
&lt;li&gt;Optionally, a use case diagram&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Input
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Business requirements&lt;/li&gt;
&lt;li&gt;Product discussions&lt;/li&gt;
&lt;li&gt;Real workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Output
&lt;/h3&gt;

&lt;p&gt;Clear, named use cases.&lt;/p&gt;
&lt;h4&gt;
  
  
  Example Use Case List
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Checkout Order&lt;/li&gt;
&lt;li&gt;Retry Payment&lt;/li&gt;
&lt;li&gt;Expire Unpaid Orders&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Use Case Diagram
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────┐
│   User   │ ────────&amp;gt; Checkout Order
└──────────┘

┌──────────┐
│  Kafka   │ ────────&amp;gt; Retry Payment
└──────────┘

┌──────────┐
│Scheduler │ ────────&amp;gt; Expire Unpaid Orders
└──────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No entities&lt;/li&gt;
&lt;li&gt;No methods&lt;/li&gt;
&lt;li&gt;No databases&lt;/li&gt;
&lt;li&gt;Only &lt;em&gt;who triggers what&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Stage 2 — Core Workflow (Sequence Diagram)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Goal
&lt;/h3&gt;

&lt;p&gt;Understand &lt;strong&gt;flow and boundaries&lt;/strong&gt;, not implementation.&lt;/p&gt;
&lt;h3&gt;
  
  
  When to Draw
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A use case touches multiple systems&lt;/li&gt;
&lt;li&gt;Failure handling matters&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Input
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;One use case&lt;/li&gt;
&lt;li&gt;Happy path (+ one failure path if needed)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Output
&lt;/h3&gt;

&lt;p&gt;A simple sequence diagram.&lt;/p&gt;


&lt;h3&gt;
  
  
  Sequence Diagram: Checkout Order
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Controller    CheckoutUseCase    InventoryPort    PaymentPort    OrderRepo    EventBus
    |                 |                |              |             |           |
    |-- execute(cmd)-&amp;gt;|                |              |             |           |
    |                 |-- reserve() --&amp;gt;|              |             |           |
    |                 |&amp;lt;-- reserved ---|              |             |           |
    |                 |-- charge() ------------------&amp;gt;|             |           |
    |                 |&amp;lt;-- charged -------------------|             |           |
    |                 |-- save() ----------------------------------&amp;gt;|           |
    |                 |-- publish() ------------------------------------------&amp;gt;|
    |&amp;lt;-- result ------|                |              |             |           |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show &lt;strong&gt;ports&lt;/strong&gt;, not implementations&lt;/li&gt;
&lt;li&gt;No frameworks&lt;/li&gt;
&lt;li&gt;No DTOs&lt;/li&gt;
&lt;li&gt;Stop once decisions are clear&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Stage 3 — Domain Modeling (Optional but Powerful)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Goal
&lt;/h3&gt;

&lt;p&gt;Define business language and invariants.&lt;/p&gt;
&lt;h3&gt;
  
  
  When to Draw
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Complex domain&lt;/li&gt;
&lt;li&gt;Multiple developers&lt;/li&gt;
&lt;li&gt;State transitions matter&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Domain Model Diagram
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────┐
│           Order             │
├─────────────────────────────┤
│ id                          │
│ status                      │
│ total                       │
├─────────────────────────────┤
│ markPaid()                  │
│ expire()                    │
└─────────────────────────────┘
              |
              | 1..*
              ▼
┌─────────────────────────────┐
│        OrderItem            │
├─────────────────────────────┤
│ productId                  │
│ quantity                   │
│ price                      │
└─────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No repositories&lt;/li&gt;
&lt;li&gt;No controllers&lt;/li&gt;
&lt;li&gt;No annotations&lt;/li&gt;
&lt;li&gt;Only business meaning&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Stage 4 — Architecture Skeleton (Folder Tree)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Purpose
&lt;/h3&gt;

&lt;p&gt;Turn clear intent into &lt;strong&gt;enforceable structure&lt;/strong&gt; before real code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If someone opens your repo and only reads folder names,&lt;br&gt;
they should understand what the system does.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Top-Level Boundaries
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;domain/
application/
adapter/
config/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  One Folder Per Use Case
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application/usecase/
├── checkout/
├── retry/
└── expire/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Case Placeholders
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application/usecase/checkout/
├── CheckoutOrderUseCase.java
├── CheckoutOrderCommand.java
└── CheckoutOrderResult.java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimal logic&lt;/li&gt;
&lt;li&gt;No frameworks&lt;/li&gt;
&lt;li&gt;No infrastructure imports&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Ports (Interfaces Only)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application/port/out/
├── OrderRepositoryPort.java
├── PaymentPort.java
├── InventoryPort.java
└── EventPublisherPort.java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adapter Placeholders
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;adapter/
├── in/
└── out/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; implement yet—this enforces direction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;orders-service/
├── README.md
├── docs/
│   ├── architecture/
│   │   ├── use-cases.md
│   │   ├── sequence-checkout-order.md
│   │   └── domain-model.md
│   └── decisions/
│       └── ADR-001-use-case-driven-design.md
│
├── src/main/java/com/example/orders/
│
│   ├── domain/
│   │   ├── model/
│   │   │   ├── Order.java
│   │   │   ├── OrderItem.java
│   │   │   ├── OrderStatus.java
│   │   │   ├── Money.java
│   │   │   └── Discount.java
│   │   │
│   │   ├── rule/
│   │   │   ├── PricingRule.java
│   │   │   └── OrderInvariant.java
│   │   │
│   │   └── event/
│   │       ├── OrderPaidEvent.java
│   │       └── OrderExpiredEvent.java
│
│   ├── application/
│   │   ├── usecase/
│   │   │   ├── checkout/
│   │   │   │   ├── CheckoutOrderUseCase.java
│   │   │   │   ├── CheckoutOrderCommand.java
│   │   │   │   ├── CheckoutOrderResult.java
│   │   │   │   └── CheckoutOrderService.java
│   │   │   │
│   │   │   ├── retry/
│   │   │   │   ├── RetryPaymentUseCase.java
│   │   │   │   ├── RetryPaymentCommand.java
│   │   │   │   └── RetryPaymentService.java
│   │   │   │
│   │   │   └── expire/
│   │   │       ├── ExpireUnpaidOrdersUseCase.java
│   │   │       └── ExpireUnpaidOrdersService.java
│   │   │
│   │   └── port/
│   │       ├── out/
│   │       │   ├── OrderRepositoryPort.java
│   │       │   ├── PaymentPort.java
│   │       │   ├── InventoryPort.java
│   │       │   ├── FraudCheckPort.java
│   │       │   ├── EventPublisherPort.java
│   │       │   ├── IdempotencyPort.java
│   │       │   └── ClockPort.java
│   │       │
│   │       └── in/
│   │           └── (optional - often implicit via usecase)
│
│   ├── adapter/
│   │   ├── in/
│   │   │   ├── web/
│   │   │   │   ├── OrderController.java
│   │   │   │   └── OrderRequestMapper.java
│   │   │   │
│   │   │   ├── messaging/
│   │   │   │   ├── CheckoutRetryConsumer.java
│   │   │   │   └── RetryMessageMapper.java
│   │   │   │
│   │   │   └── scheduler/
│   │   │       └── ExpireUnpaidOrdersJob.java
│   │   │
│   │   └── out/
│   │       ├── persistence/
│   │       │   ├── JpaOrderRepositoryAdapter.java
│   │       │   ├── JpaOrderEntity.java
│   │       │   └── SpringDataOrderRepository.java
│   │       │
│   │       ├── payment/
│   │       │   ├── StripePaymentAdapter.java
│   │       │   └── PaymentMapper.java
│   │       │
│   │       ├── inventory/
│   │       │   └── InventoryHttpAdapter.java
│   │       │
│   │       ├── fraud/
│   │       │   └── FraudApiAdapter.java
│   │       │
│   │       ├── messaging/
│   │       │   └── KafkaEventPublisherAdapter.java
│   │       │
│   │       └── idempotency/
│   │           └── RedisIdempotencyAdapter.java
│
│   └── config/
│       ├── UseCaseConfig.java
│       ├── AdapterConfig.java
│       └── ApplicationConfig.java
│
└── src/test/java/com/example/orders/
    ├── domain/
    │   └── OrderTest.java
    │
    ├── application/
    │   ├── checkout/
    │   │   └── CheckoutOrderServiceTest.java
    │   └── retry/
    │       └── RetryPaymentServiceTest.java
    │
    └── adapter/
        ├── in/
        │   └── web/
        │       └── OrderControllerTest.java
        └── out/
            └── persistence/
                └── JpaOrderRepositoryAdapterTest.java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Stage 5 — Identify Ports
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Qualifies as a Port?
&lt;/h3&gt;

&lt;p&gt;Anything that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Touches a DB&lt;/li&gt;
&lt;li&gt;Touches the network&lt;/li&gt;
&lt;li&gt;Touches time&lt;/li&gt;
&lt;li&gt;Sends messages
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;PaymentPort&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;PaymentResult&lt;/span&gt; &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Money&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Ports &lt;strong&gt;emerge naturally&lt;/strong&gt;.&lt;br&gt;
If you’re forcing them, you started too early.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stage 6 — Implement Adapters (No Diagrams)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What You Do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;REST controllers&lt;/li&gt;
&lt;li&gt;Kafka consumers&lt;/li&gt;
&lt;li&gt;JPA repositories&lt;/li&gt;
&lt;li&gt;External API clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rule&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Adapters depend on the core — never the other way around.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📌 No UML here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stage 7 — Post-Implementation Diagrams (Optional)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Purpose
&lt;/h3&gt;

&lt;p&gt;Onboarding and communication.&lt;/p&gt;

&lt;p&gt;Draw:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One hexagonal overview&lt;/li&gt;
&lt;li&gt;One key sequence diagram&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Design Flow Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;What to Draw&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;td&gt;Clarify intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Use cases&lt;/td&gt;
&lt;td&gt;Make intent explicit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Sequence diagram&lt;/td&gt;
&lt;td&gt;Find boundaries &amp;amp; flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Domain model (optional)&lt;/td&gt;
&lt;td&gt;Shared language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Folder structure&lt;/td&gt;
&lt;td&gt;Lock architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Interfaces (ports)&lt;/td&gt;
&lt;td&gt;Define dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;td&gt;Implement adapters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Overview diagrams&lt;/td&gt;
&lt;td&gt;Onboarding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final Rule to Remember
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;If a new developer understands the system by reading &lt;strong&gt;use case names&lt;/strong&gt;,&lt;br&gt;
your architecture is working.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If they must jump across controllers, services, and repositories to understand intent—it’s not.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;Draw diagrams to &lt;strong&gt;make decisions&lt;/strong&gt;, not to look professional&lt;/li&gt;
&lt;li&gt;Start with &lt;strong&gt;use cases&lt;/strong&gt; — they reveal system intent&lt;/li&gt;
&lt;li&gt;Sequence diagrams expose boundaries early&lt;/li&gt;
&lt;li&gt;Domain models create shared language&lt;/li&gt;
&lt;li&gt;Stop diagramming when code becomes clearer&lt;/li&gt;
&lt;li&gt;Ports emerge naturally from workflows&lt;/li&gt;
&lt;li&gt;Post-implementation diagrams are for onboarding, not design&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Clean Architecture isn’t about rigid rules.&lt;br&gt;
It’s about &lt;strong&gt;clarity of intent&lt;/strong&gt;, &lt;strong&gt;clear boundaries&lt;/strong&gt;, and &lt;strong&gt;maintainable code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start simple.&lt;br&gt;
Draw only what helps you think.&lt;br&gt;
Let architecture emerge from &lt;strong&gt;real use cases&lt;/strong&gt;, not theoretical purity.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>design</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Grant RBAC permission for IAM principle (allow it to view eks)</title>
      <dc:creator>Shuwen</dc:creator>
      <pubDate>Wed, 05 Apr 2023 13:00:51 +0000</pubDate>
      <link>https://dev.to/sherwinwater/grant-rbac-permission-for-iam-principle-allow-it-to-view-eks-1bj2</link>
      <guid>https://dev.to/sherwinwater/grant-rbac-permission-for-iam-principle-allow-it-to-view-eks-1bj2</guid>
      <description>&lt;h1&gt;
  
  
  Grant RBAC permission for IAM principle (allow it to view eks)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step One
&lt;/h2&gt;

&lt;h3&gt;
  
  
  method 1: aws cli
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;create policy to include the necessary permissions for a principal to view Kubernetes resources for all clusters in your account.
replace the following &lt;code&gt;111122223333&lt;/code&gt; with your &lt;code&gt;aws account id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2012-10-17&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Statement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Effect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListFargateProfiles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:DescribeNodegroup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListNodegroups&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListUpdates&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:AccessKubernetesApi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListAddons&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:DescribeCluster&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:DescribeAddonVersions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListClusters&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListIdentityProviderConfigs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;iam:ListRoles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resource&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Effect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssm:GetParameter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resource&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;arn:aws:ssm:*:111122223333:parameter/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;create EKS connector IAM role with its policy.
AmazonEKSConnectorAgentRole:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2012-10-17&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Statement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Effect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Principal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssm.amazonaws.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sts:AssumeRole&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AmazonEKSConnectorAgentPolicy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2012-10-17&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Statement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SsmControlChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Effect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmmessages:CreateControlChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resource&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;arn:aws:eks:*:*:cluster/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmDataplaneOperations&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Effect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmmessages:CreateDataChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmmessages:OpenDataChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmmessages:OpenControlChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resource&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create the Amazon EKS Connector agent role using the trust policy and policy you created in the previous list items.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="nx"&gt;iam&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
     &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="nx"&gt;AmazonEKSConnectorAgentRole&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
     &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;assume&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//eks-connector-agent-trust-policy.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Attach the policy to your Amazon EKS Connector agent role.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="nx"&gt;iam&lt;/span&gt; &lt;span class="nx"&gt;put&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
     &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="nx"&gt;AmazonEKSConnectorAgentRole&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
     &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="nx"&gt;AmazonEKSConnectorAgentPolicy&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
     &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//eks-connector-agent-policy.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  method 2: terraform
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//https://docs.aws.amazon.com/eks/latest/userguide/view-kubernetes-resources.html#view-kubernetes-resources-permissions&lt;/span&gt;
&lt;span class="c1"&gt;//create EKSViewResourcesPolicy&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws_iam_policy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks_view_resources_policy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EKSViewResourcesPolicy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Policy to allow a principal to view Kubernetes resources for all clusters in the account&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

  &lt;span class="nx"&gt;policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2012-10-17&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListFargateProfiles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:DescribeNodegroup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListNodegroups&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListUpdates&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:AccessKubernetesApi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListAddons&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:DescribeCluster&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:DescribeAddonVersions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListClusters&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks:ListIdentityProviderConfigs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;iam:ListRoles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssm:GetParameter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;arn:aws:ssm:*:${var.aws_account_id}:parameter/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;//https://docs.aws.amazon.com/eks/latest/userguide/connector_IAM_role.html&lt;/span&gt;
&lt;span class="c1"&gt;// create AmazonEKSConnectorAgentRole and AmazonEKSConnectorAgentPolicy&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws_iam_role&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks_connector_agent_role&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AmazonEKSConnectorAgentRole&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

  &lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2012-10-17&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;Principal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;Service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssm.amazonaws.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sts:AssumeRole&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws_iam_policy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks_connector_agent_policy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AmazonEKSConnectorAgentPolicy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

  &lt;span class="nx"&gt;policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2012-10-17&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Sid&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SsmControlChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmmessages:CreateControlChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;arn:aws:eks:*:*:cluster/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Sid&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmDataplaneOperations&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmmessages:CreateDataChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmmessages:OpenDataChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ssmmessages:OpenControlChannel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws_iam_role_policy_attachment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks_cluster_policy_attachment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;arn:aws:iam::aws:policy/AmazonEKSClusterPolicy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_connector_agent_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws_iam_role_policy_attachment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eks_connector_agent_custom_policy_attachment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_connector_agent_policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_connector_agent_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step Two
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;update kubeconfig
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="nx"&gt;eks&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;kubeconfig&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;east&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="nx"&gt;education&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;eks&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create a Kubernetes rolebinding or clusterrolebinding that is bound to a Kubernetes role or clusterrole that has the necessary permissions to view the Kubernetes resources.
-- View Kubernetes resources in all namespaces
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;kubectl&lt;/span&gt; &lt;span class="nx"&gt;apply&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-full-access.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-- View Kubernetes resources in a specific namespace&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;kubectl&lt;/span&gt; &lt;span class="nx"&gt;apply&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-restricted-access.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or using customized by updating the downloaed file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;O&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-full-access.yaml&lt;/span&gt;

&lt;span class="nx"&gt;kubectl&lt;/span&gt; &lt;span class="nx"&gt;apply&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="nx"&gt;rbac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rbac.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt;
&lt;span class="nx"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rbac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;k8s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;
&lt;span class="nx"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ClusterRole&lt;/span&gt;
&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;
&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;apiGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;verbs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;watch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;---&lt;/span&gt;
&lt;span class="nx"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rbac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;k8s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;
&lt;span class="nx"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ClusterRoleBinding&lt;/span&gt;
&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;
&lt;span class="nx"&gt;subjects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Group&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;
    &lt;span class="nx"&gt;apiGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rbac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;k8s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;io&lt;/span&gt;
&lt;span class="nx"&gt;roleRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nx"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ClusterRole&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;
  &lt;span class="nx"&gt;apiGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rbac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;k8s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;io&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step Three
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Map the IAM principal to the Kubernetes user or group in the aws-auth ConfigMap
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;kubectl&lt;/span&gt; &lt;span class="nx"&gt;edit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="nx"&gt;kube&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;system&lt;/span&gt; &lt;span class="nx"&gt;configmap&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;mapUsers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;
    &lt;span class="nx"&gt;userarn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;arn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;4673623285&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;admin&lt;/span&gt;
    &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;admin&lt;/span&gt;
&lt;span class="nx"&gt;mapRoles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;
    &lt;span class="nx"&gt;rolearn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;arn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;4673623285&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;AmazonEKSConnectorAgentRole&lt;/span&gt;
    &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AmazonEKSConnectorAgentRole&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;references:
&lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/view-kubernetes-resources.html#view-kubernetes-resources-permissions"&gt;https://docs.aws.amazon.com/eks/latest/userguide/view-kubernetes-resources.html#view-kubernetes-resources-permissions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
