<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Yeison Cruz</title>
    <description>The latest articles on Forem by Yeison Cruz (@yeisoncruz16).</description>
    <link>https://forem.com/yeisoncruz16</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%2F72433%2F36ae6e1a-ecd7-478e-9fb4-cac1978b4168.jpg</url>
      <title>Forem: Yeison Cruz</title>
      <link>https://forem.com/yeisoncruz16</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/yeisoncruz16"/>
    <language>en</language>
    <item>
      <title>Why you should never migrate everything at once</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Mon, 16 Mar 2026 13:20:25 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/why-you-should-never-migrate-everything-at-once-3jie</link>
      <guid>https://forem.com/yeisoncruz16/why-you-should-never-migrate-everything-at-once-3jie</guid>
      <description>&lt;p&gt;You've assessed your environment. You know why you're modernizing. You understand the trade-offs. Now comes the question everyone dreads:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do we actually move this thing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And someone in the room always suggests: "Let's just migrate everything over a weekend."&lt;/p&gt;

&lt;p&gt;No. Just... no.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "big bang" migrations fail
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Big bang&lt;/strong&gt; means you flip a switch, move everything at once, and hope it works. It's tempting because it sounds simple.&lt;/p&gt;

&lt;p&gt;It's not simple. It's a disaster waiting to happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's what goes wrong:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can't test everything. You think you can, but you can't. There's always something you missed.&lt;/p&gt;

&lt;p&gt;You can't roll back easily. Once you've moved 50 services, rolling back means moving 50 services back. Good luck doing that at 2 AM.&lt;/p&gt;

&lt;p&gt;You can't learn from mistakes. If something breaks, you're fixing it under pressure with everyone watching.&lt;/p&gt;

&lt;p&gt;You put all your eggs in one basket. One mistake and the entire business is down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The only time big bang works:&lt;/strong&gt; When you're migrating something so simple it doesn't matter. A static website. A single service with no dependencies. That's it.&lt;/p&gt;

&lt;p&gt;For everything else? Phase it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What phased migration actually means
&lt;/h2&gt;

&lt;p&gt;You break the migration into small, manageable chunks. You move one piece at a time. You validate it works. Then you move the next piece.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You learn as you go. The first migration teaches you what works and what doesn't.&lt;/p&gt;

&lt;p&gt;You can roll back easily. If something breaks, you only roll back one piece, not everything.&lt;/p&gt;

&lt;p&gt;You reduce risk. A small failure is manageable. A total failure is career-ending.&lt;/p&gt;

&lt;p&gt;You show progress. Leadership sees results every few weeks, not "we'll be done in 6 months, trust us."&lt;/p&gt;

&lt;h2&gt;
  
  
  How to design your phases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Map your dependencies
&lt;/h3&gt;

&lt;p&gt;You can't migrate things in random order. You need to know what depends on what.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Draw it out:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What talks to what?&lt;/li&gt;
&lt;li&gt;What can run independently?&lt;/li&gt;
&lt;li&gt;What's blocking other things?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users → Load Balancer → App Servers → Database → S3&lt;/li&gt;
&lt;li&gt;Background Jobs → Queue → Workers → Database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can't migrate the database before the app servers. You can't migrate the app servers before you have a load balancer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Identify your migration candidates
&lt;/h3&gt;

&lt;p&gt;Not everything is equally easy to migrate. Some things are simple. Some are nightmares.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Easy candidates (start here):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stateless services (no database, no persistent storage)&lt;/li&gt;
&lt;li&gt;Low-traffic services (if it breaks, not many people notice)&lt;/li&gt;
&lt;li&gt;Non-critical services (internal tools, admin panels)&lt;/li&gt;
&lt;li&gt;Services with good test coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hard candidates (save for later):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stateful services (databases, file storage)&lt;/li&gt;
&lt;li&gt;High-traffic services (your main API, payment processing)&lt;/li&gt;
&lt;li&gt;Critical services (if it's down, the business is down)&lt;/li&gt;
&lt;li&gt;Services with no tests (you don't know if it works until it doesn't)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Group into waves
&lt;/h3&gt;

&lt;p&gt;A wave is a batch of services you migrate together. Usually 2-4 weeks per wave.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 1: The pilot&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick 1-2 low-risk services&lt;/li&gt;
&lt;li&gt;Migrate them fully&lt;/li&gt;
&lt;li&gt;Validate everything works&lt;/li&gt;
&lt;li&gt;Document what you learned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Prove the process works. Build confidence. Find the problems when the stakes are low.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 2-3: Low-hanging fruit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrate the easy stuff&lt;/li&gt;
&lt;li&gt;Build momentum&lt;/li&gt;
&lt;li&gt;Refine your process&lt;/li&gt;
&lt;li&gt;Train the team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Show progress. Get quick wins. Make leadership happy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 4-6: The meat of it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrate the core services&lt;/li&gt;
&lt;li&gt;This is where the real work happens&lt;/li&gt;
&lt;li&gt;Move carefully, test thoroughly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Get the important stuff done without breaking anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 7+: The hard stuff&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Databases, stateful services, critical systems&lt;/li&gt;
&lt;li&gt;By now you know what you're doing&lt;/li&gt;
&lt;li&gt;You've learned from earlier mistakes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Finish strong. Migrate the scary stuff with confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Plan your rollback strategy
&lt;/h3&gt;

&lt;p&gt;Before you migrate anything, know how to undo it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For each wave, document:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to roll back (step by step)&lt;/li&gt;
&lt;li&gt;How long rollback takes&lt;/li&gt;
&lt;li&gt;What data might be lost&lt;/li&gt;
&lt;li&gt;Who makes the call to roll back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example rollback plan:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Switch DNS back to old load balancer (5 minutes)&lt;/li&gt;
&lt;li&gt;Verify old system is receiving traffic (2 minutes)&lt;/li&gt;
&lt;li&gt;Stop new services to avoid confusion (1 minute)&lt;/li&gt;
&lt;li&gt;Sync any data created during migration (30 minutes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you can't roll back in under an hour, your phase is too big.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration strategies by service type
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stateless services (APIs, web apps)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Strategy: Blue/green deployment&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy new version alongside old version&lt;/li&gt;
&lt;li&gt;Route 10% of traffic to new version&lt;/li&gt;
&lt;li&gt;Monitor for errors&lt;/li&gt;
&lt;li&gt;Gradually increase to 50%, then 100%&lt;/li&gt;
&lt;li&gt;Shut down old version&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; You can roll back instantly by routing traffic back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Databases
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Strategy: Parallel run&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up new database&lt;/li&gt;
&lt;li&gt;Replicate data from old to new (continuously)&lt;/li&gt;
&lt;li&gt;Run both databases in parallel&lt;/li&gt;
&lt;li&gt;Switch reads to new database (writes still go to old)&lt;/li&gt;
&lt;li&gt;Monitor for issues&lt;/li&gt;
&lt;li&gt;Switch writes to new database&lt;/li&gt;
&lt;li&gt;Keep old database running for a week&lt;/li&gt;
&lt;li&gt;Shut down old database&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; You're never fully committed until you're sure it works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background jobs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Strategy: Gradual migration&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy new workers alongside old workers&lt;/li&gt;
&lt;li&gt;Route new jobs to new workers&lt;/li&gt;
&lt;li&gt;Let old workers finish existing jobs&lt;/li&gt;
&lt;li&gt;Shut down old workers when queue is empty&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; No jobs are lost, no downtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  File storage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Strategy: Lazy migration&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up new storage (S3, EFS, whatever)&lt;/li&gt;
&lt;li&gt;Write new files to new storage&lt;/li&gt;
&lt;li&gt;Keep old files in old storage&lt;/li&gt;
&lt;li&gt;Migrate old files in batches (off-peak hours)&lt;/li&gt;
&lt;li&gt;Update app to check both locations&lt;/li&gt;
&lt;li&gt;Eventually everything's in new storage&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; No big bang, no downtime, no rush.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-world example: E-commerce site migration
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monolithic app on EC2&lt;/li&gt;
&lt;li&gt;MySQL database&lt;/li&gt;
&lt;li&gt;Redis cache&lt;/li&gt;
&lt;li&gt;S3 for images&lt;/li&gt;
&lt;li&gt;10,000 daily users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wave 1: Static assets (Week 1-2)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrate images to CloudFront + S3&lt;/li&gt;
&lt;li&gt;Update app to use new URLs&lt;/li&gt;
&lt;li&gt;Validate images load correctly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk: Low. Rollback: Easy.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wave 2: Redis cache (Week 3-4)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up ElastiCache&lt;/li&gt;
&lt;li&gt;Run both caches in parallel&lt;/li&gt;
&lt;li&gt;Switch to ElastiCache&lt;/li&gt;
&lt;li&gt;Monitor for issues&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk: Low. Rollback: Easy.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wave 3: App servers (Week 5-8)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Containerize app (ECS)&lt;/li&gt;
&lt;li&gt;Deploy behind new ALB&lt;/li&gt;
&lt;li&gt;Route 10% traffic to new app&lt;/li&gt;
&lt;li&gt;Gradually increase to 100%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk: Medium. Rollback: Moderate.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wave 4: Database (Week 9-12)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up RDS with replication from old DB&lt;/li&gt;
&lt;li&gt;Switch reads to RDS&lt;/li&gt;
&lt;li&gt;Monitor performance&lt;/li&gt;
&lt;li&gt;Switch writes to RDS&lt;/li&gt;
&lt;li&gt;Keep old DB running for 2 weeks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk: High. Rollback: Hard but possible.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wave 5: Cleanup (Week 13-14)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shut down old infrastructure&lt;/li&gt;
&lt;li&gt;Update documentation&lt;/li&gt;
&lt;li&gt;Celebrate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total time: 14 weeks. Zero downtime. No disasters.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Making phases too big.&lt;/strong&gt; If a phase takes more than 4 weeks, it's too big. Break it down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not testing rollback.&lt;/strong&gt; You don't want to figure out how to roll back at 3 AM when production is down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skipping the pilot.&lt;/strong&gt; The first migration teaches you everything. Don't skip it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moving too fast.&lt;/strong&gt; Velocity is good, but not at the expense of risk. Give each phase time to stabilize.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not documenting lessons learned.&lt;/strong&gt; What you learn in Wave 1 should improve Wave 2. Write it down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring dependencies.&lt;/strong&gt; You can't migrate the app before the database. Map it out first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you should have for each phase
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before the phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List of what's being migrated&lt;/li&gt;
&lt;li&gt;Dependencies mapped out&lt;/li&gt;
&lt;li&gt;Rollback plan documented&lt;/li&gt;
&lt;li&gt;Success criteria defined&lt;/li&gt;
&lt;li&gt;Team knows their roles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;During the phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitoring and alerts set up&lt;/li&gt;
&lt;li&gt;Communication plan (who to notify, when)&lt;/li&gt;
&lt;li&gt;Go/no-go decision points&lt;/li&gt;
&lt;li&gt;Rollback trigger conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After the phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validation that everything works&lt;/li&gt;
&lt;li&gt;Performance comparison (old vs. new)&lt;/li&gt;
&lt;li&gt;Lessons learned documented&lt;/li&gt;
&lt;li&gt;Cleanup tasks completed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The golden rule
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you can't roll back in under an hour, your phase is too big.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Break it down. Make it smaller. Reduce the risk.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>migration</category>
    </item>
    <item>
      <title>You can't optimize everything (And that's okay)</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Mon, 09 Mar 2026 16:11:59 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/you-cant-optimize-everything-and-thats-okay-5ck9</link>
      <guid>https://forem.com/yeisoncruz16/you-cant-optimize-everything-and-thats-okay-5ck9</guid>
      <description>&lt;p&gt;You know why you're modernizing. You've assessed your environment. Now comes the fun part: actually doing it.&lt;/p&gt;

&lt;p&gt;And here's the problem: &lt;strong&gt;you can't optimize for everything at once.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You want it cheap. You want it safe. You want it fast. You want it compliant. Pick two. Maybe three if you're lucky.&lt;/p&gt;

&lt;p&gt;Let's talk about how to balance these four things without losing your mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four forces trying to kill each other
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cost: Keep the CFO happy
&lt;/h3&gt;

&lt;p&gt;You need to save money. Or at least not spend more. Leadership approved this modernization because you promised it would be cheaper (or you lied and said it would be).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What cost wants:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the cheapest services possible&lt;/li&gt;
&lt;li&gt;Turn things off when not in use&lt;/li&gt;
&lt;li&gt;Don't over-provision&lt;/li&gt;
&lt;li&gt;Avoid expensive managed services&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Risk: Don't break production
&lt;/h3&gt;

&lt;p&gt;You need to not blow up the business. One bad deploy and you're on the front page of Hacker News for all the wrong reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What risk wants:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test everything twice&lt;/li&gt;
&lt;li&gt;Run things in parallel&lt;/li&gt;
&lt;li&gt;Have rollback plans&lt;/li&gt;
&lt;li&gt;Move slowly and carefully&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Velocity: Ship faster
&lt;/h3&gt;

&lt;p&gt;You need to deliver value quickly. Your competitors aren't waiting. Your customers want features now. Leadership wants to see progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What velocity wants:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move fast&lt;/li&gt;
&lt;li&gt;Automate everything&lt;/li&gt;
&lt;li&gt;Skip the unnecessary stuff&lt;/li&gt;
&lt;li&gt;Ship and iterate&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compliance: Keep the lawyers happy
&lt;/h3&gt;

&lt;p&gt;You need to meet regulations. HIPAA, SOC 2, GDPR, PCI-DSS, whatever applies to you. Fail an audit and you lose customers. Or get fined. Or both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What compliance wants:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document everything&lt;/li&gt;
&lt;li&gt;Audit trails everywhere&lt;/li&gt;
&lt;li&gt;Encrypt all the things&lt;/li&gt;
&lt;li&gt;Lock everything down&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why they fight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cost vs. Risk:&lt;/strong&gt; The cheapest option is usually the riskiest. Running everything in one availability zone saves money until it doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Velocity vs. Risk:&lt;/strong&gt; Moving fast means taking shortcuts. Taking shortcuts means things break.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Velocity vs. Compliance:&lt;/strong&gt; Documentation and approvals slow you down. But skip them and you fail your audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost vs. Compliance:&lt;/strong&gt; Compliance is expensive. Encryption, logging, monitoring, auditing—it all costs money.&lt;/p&gt;

&lt;p&gt;See the problem? Every decision is a trade-off.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually balance them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Know which one matters most (right now)
&lt;/h3&gt;

&lt;p&gt;You can't optimize for all four equally. So don't try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're in healthcare or finance:&lt;/strong&gt; Compliance and risk come first. Period. You can't afford to fail an audit or have a breach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a startup burning cash:&lt;/strong&gt; Cost and velocity matter most. You need to move fast and not run out of money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a mature company with customers:&lt;/strong&gt; Risk is #1. Downtime costs you more than anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're being acquired:&lt;/strong&gt; Velocity matters. You have a deadline and it's non-negotiable.&lt;/p&gt;

&lt;p&gt;Pick your priority. Everything else is secondary.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Set boundaries, not goals
&lt;/h3&gt;

&lt;p&gt;Don't try to minimize cost. Set a budget and stay under it.&lt;/p&gt;

&lt;p&gt;Don't try to eliminate risk. Decide what's acceptable and work within it.&lt;/p&gt;

&lt;p&gt;Don't try to maximize velocity. Set a timeline and hit it.&lt;/p&gt;

&lt;p&gt;Don't try to be "fully compliant." Meet the requirements and stop there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Budget: Don't spend more than $50K/month&lt;/li&gt;
&lt;li&gt;Risk: No more than 4 hours of downtime per year&lt;/li&gt;
&lt;li&gt;Velocity: Ship the first wave in 8 weeks&lt;/li&gt;
&lt;li&gt;Compliance: Pass SOC 2 audit by Q3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you have constraints. Work within them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Make trade-offs explicit
&lt;/h3&gt;

&lt;p&gt;Every decision has a cost. Make it visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; You need to migrate a database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A: Lift-and-shift to EC2&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost: Low (you control the instance size)&lt;/li&gt;
&lt;li&gt;Risk: High (you manage backups, patches, failover)&lt;/li&gt;
&lt;li&gt;Velocity: Fast (just move it)&lt;/li&gt;
&lt;li&gt;Compliance: Medium (you handle encryption and logging)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Option B: Migrate to RDS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost: Medium (managed service costs more)&lt;/li&gt;
&lt;li&gt;Risk: Low (AWS handles backups and failover)&lt;/li&gt;
&lt;li&gt;Velocity: Medium (some reconfiguration needed)&lt;/li&gt;
&lt;li&gt;Compliance: High (built-in encryption and audit logs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Option C: Refactor to Aurora Serverless&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost: Variable (scales with usage)&lt;/li&gt;
&lt;li&gt;Risk: Medium (new technology, learning curve)&lt;/li&gt;
&lt;li&gt;Velocity: Slow (requires code changes)&lt;/li&gt;
&lt;li&gt;Compliance: High (same as RDS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's no "right" answer. It depends on your priorities.&lt;/p&gt;

&lt;p&gt;If cost is #1, pick A. If risk is #1, pick B. If you need compliance and can wait, pick C.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Use the 80/20 rule
&lt;/h3&gt;

&lt;p&gt;You don't need perfect. You need good enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For cost:&lt;/strong&gt; Cut the obvious waste first. Unattached volumes, idle load balancers, oversized instances. That's 80% of your savings with 20% of the effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For risk:&lt;/strong&gt; Focus on the critical systems. Your payment API needs five-nines uptime. Your internal admin tool? It can go down for an hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For velocity:&lt;/strong&gt; Automate the repetitive stuff. CI/CD, infrastructure provisioning, testing. Don't automate the one-off tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For compliance:&lt;/strong&gt; Meet the requirements that matter. Encrypt data at rest and in transit. Enable CloudTrail. Set up proper IAM. That covers 80% of most audits.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Phase your approach
&lt;/h3&gt;

&lt;p&gt;You don't have to balance everything on day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Get it working&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Priority: Velocity and risk&lt;/li&gt;
&lt;li&gt;Goal: Migrate without breaking anything&lt;/li&gt;
&lt;li&gt;Trade-off: Higher costs, basic compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Optimize costs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Priority: Cost&lt;/li&gt;
&lt;li&gt;Goal: Right-size resources, implement auto-scaling&lt;/li&gt;
&lt;li&gt;Trade-off: Some risk (you're changing things)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: Harden security and compliance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Priority: Compliance and risk&lt;/li&gt;
&lt;li&gt;Goal: Pass audits, improve reliability&lt;/li&gt;
&lt;li&gt;Trade-off: Slower velocity, some cost increase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 4: Improve velocity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Priority: Velocity&lt;/li&gt;
&lt;li&gt;Goal: Better CI/CD, faster deployments&lt;/li&gt;
&lt;li&gt;Trade-off: Upfront cost for long-term gains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each phase focuses on 1-2 priorities. You're not juggling all four at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-world examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: The startup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Situation:&lt;/strong&gt; 6 months of runway, need to ship fast, can't afford downtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priorities:&lt;/strong&gt; Velocity &amp;gt; Risk &amp;gt; Cost &amp;gt; Compliance&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use managed services (RDS, ECS, ALB) to move fast&lt;/li&gt;
&lt;li&gt;Multi-AZ for critical services only&lt;/li&gt;
&lt;li&gt;Basic monitoring and logging&lt;/li&gt;
&lt;li&gt;Compliance is "good enough" for now&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Higher costs, but they're shipping weekly and staying up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2: The healthcare company
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Situation:&lt;/strong&gt; HIPAA required, can't afford a breach, budget is tight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priorities:&lt;/strong&gt; Compliance &amp;gt; Risk &amp;gt; Cost &amp;gt; Velocity&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything encrypted (at rest and in transit)&lt;/li&gt;
&lt;li&gt;Full audit logging with CloudTrail and CloudWatch&lt;/li&gt;
&lt;li&gt;Private subnets, no public access&lt;/li&gt;
&lt;li&gt;Slower deployments with extensive testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Takes longer to ship, but they pass audits and sleep at night.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 3: The enterprise
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Situation:&lt;/strong&gt; Millions of users, downtime costs $100K/hour, compliance required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priorities:&lt;/strong&gt; Risk &amp;gt; Compliance &amp;gt; Velocity &amp;gt; Cost&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-region active-active setup&lt;/li&gt;
&lt;li&gt;Automated failover and rollback&lt;/li&gt;
&lt;li&gt;Extensive monitoring and alerting&lt;/li&gt;
&lt;li&gt;Full compliance controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Expensive, but they can't afford to be down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trying to optimize everything at once.&lt;/strong&gt; You'll fail. Pick your battles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not communicating trade-offs.&lt;/strong&gt; When you choose velocity over cost, tell people. When you choose risk over velocity, explain why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring the business context.&lt;/strong&gt; A startup and an enterprise have different priorities. Act accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting unrealistic expectations.&lt;/strong&gt; You can't have the cheapest, fastest, safest, most compliant solution. Stop promising you can.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not revisiting priorities.&lt;/strong&gt; What matters today might not matter in 6 months. Reassess regularly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you should remember
&lt;/h2&gt;

&lt;p&gt;You're juggling four things: cost, risk, velocity, and compliance.&lt;/p&gt;

&lt;p&gt;You can't optimize for all of them. Pick 1-2 priorities and work within constraints for the rest.&lt;/p&gt;

&lt;p&gt;Make trade-offs explicit. Document them. Communicate them.&lt;/p&gt;

&lt;p&gt;Phase your approach. Focus on different priorities at different times.&lt;/p&gt;

&lt;p&gt;And most importantly: &lt;strong&gt;good enough is good enough.&lt;/strong&gt; Perfect is the enemy of done.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Cloud modernization without a reason is just expensive busywork</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Mon, 02 Mar 2026 18:38:42 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/cloud-modernization-without-a-reason-is-just-expensive-busywork-2ln2</link>
      <guid>https://forem.com/yeisoncruz16/cloud-modernization-without-a-reason-is-just-expensive-busywork-2ln2</guid>
      <description>&lt;p&gt;You've assessed your AWS environment. You know what's running, what it costs, and what's held together with duct tape and prayers.&lt;/p&gt;

&lt;p&gt;Now comes the question nobody wants to ask: &lt;strong&gt;Why are we modernizing this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Because it's legacy" isn't an answer. "Because the cloud is the future" isn't either. You need real reasons. Business reasons. Technical reasons. The kind that justify the time, money, and risk.&lt;/p&gt;

&lt;p&gt;Let's figure out what they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Because modernization without a clear driver is just expensive busywork.&lt;/p&gt;

&lt;p&gt;I've seen teams spend 6 months migrating to containers because "that's what everyone's doing," only to realize they solved zero actual problems. The app runs the same. Costs went up. And now they have Kubernetes to maintain.&lt;/p&gt;

&lt;p&gt;Don't be that team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical drivers: What's actually broken?
&lt;/h2&gt;

&lt;p&gt;These are the problems keeping your engineers up at night (or paging them at 3 AM).&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Scalability issues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The symptom:&lt;/strong&gt; Your app can't handle growth.&lt;/p&gt;

&lt;p&gt;Black Friday comes around and your servers fall over. You got mentioned on Twitter and the site went down. You're adding customers faster than you can provision hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; Can your current setup scale? Or are you hitting limits?&lt;/p&gt;

&lt;p&gt;If you're manually adding EC2 instances every time traffic spikes, that's a driver. If your database is maxed out and you can't upgrade it anymore, that's a driver.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reliability problems
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The symptom:&lt;/strong&gt; Things break. A lot.&lt;/p&gt;

&lt;p&gt;Your uptime is 95% when it should be 99.9%. You have outages every month. One server dies and the whole app goes down. Your disaster recovery plan is "hope nothing bad happens."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; Can you afford the downtime?&lt;/p&gt;

&lt;p&gt;If your SLA says 99.9% but you're delivering 95%, that's a driver. If you're losing customers because the site's always down, that's a driver.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Security vulnerabilities
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The symptom:&lt;/strong&gt; You're one breach away from a very bad day.&lt;/p&gt;

&lt;p&gt;Your servers are running Ubuntu 14.04 (end-of-life was 2019). Nobody's patched anything in 2 years. Your database is exposed to the internet. You found AWS keys in a public GitHub repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; What's your risk tolerance?&lt;/p&gt;

&lt;p&gt;If you're in healthcare, finance, or anything regulated, this is probably your #1 driver. If you're storing customer data and your security is Swiss cheese, fix it before someone else finds out.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Deployment speed
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The symptom:&lt;/strong&gt; Shipping features takes forever.&lt;/p&gt;

&lt;p&gt;It takes 3 weeks to deploy a one-line change. Releases happen once a quarter. Deployments require a 6-hour maintenance window and a prayer. Rolling back a bad deploy means restoring from backup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; How fast do your competitors move?&lt;/p&gt;

&lt;p&gt;If they're shipping daily and you're shipping quarterly, that's a driver. If your developers spend more time deploying than coding, that's a driver.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Operational overhead
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The symptom:&lt;/strong&gt; Your team is drowning in maintenance.&lt;/p&gt;

&lt;p&gt;You're spending 80% of your time patching servers, managing backups, and fighting fires. You can't work on new features because you're too busy keeping the lights on. Your on-call rotation is brutal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; What could your team build if they weren't babysitting infrastructure?&lt;/p&gt;

&lt;p&gt;If you're managing your own Kubernetes cluster when you could use EKS, that's a driver. If you're running your own MySQL when RDS exists, that's a driver.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Technology obsolescence
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The symptom:&lt;/strong&gt; Your stack is ancient and nobody wants to touch it.&lt;/p&gt;

&lt;p&gt;You're running PHP 5.6. Your database is MySQL 5.5. You can't hire developers because nobody wants to work with 10-year-old tech. The vendor stopped supporting it 3 years ago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; Can you even maintain this?&lt;/p&gt;

&lt;p&gt;If you can't find people to work on it, that's a driver. If the vendor dropped support and you're on your own, that's a driver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business drivers: What does leadership care about?
&lt;/h2&gt;

&lt;p&gt;These are the reasons that get budget approved.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Cost reduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The reality:&lt;/strong&gt; You're spending too much.&lt;/p&gt;

&lt;p&gt;You're paying for a data center lease. You're over-provisioned for peak traffic 24/7. You're paying for licenses you don't need. Your AWS bill is out of control because nobody's optimizing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pitch:&lt;/strong&gt; "We can cut infrastructure costs by 30% in 12 months."&lt;/p&gt;

&lt;p&gt;This is the easiest driver to sell. CFOs love saving money. Just make sure you can actually deliver on it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Time-to-market
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The reality:&lt;/strong&gt; You're too slow.&lt;/p&gt;

&lt;p&gt;Your competitors are shipping features weekly. You're shipping quarterly. By the time you launch something, the market's moved on. You're losing deals because you can't deliver fast enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pitch:&lt;/strong&gt; "We can go from quarterly releases to weekly releases."&lt;/p&gt;

&lt;p&gt;This resonates with product teams and executives. Faster shipping = more revenue = happy stakeholders.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Geographic expansion
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The reality:&lt;/strong&gt; You need to be in more places.&lt;/p&gt;

&lt;p&gt;You're US-only but need to expand to Europe. Your latency in Asia is terrible. You need to comply with data residency laws. Your single data center can't serve a global customer base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pitch:&lt;/strong&gt; "We can deploy to 5 regions and cut latency by 70%."&lt;/p&gt;

&lt;p&gt;If your business is going global, your infrastructure needs to follow. That's a clear driver.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Customer experience
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The reality:&lt;/strong&gt; Your users are complaining.&lt;/p&gt;

&lt;p&gt;Your app is slow. Pages take 10 seconds to load. Mobile experience is terrible. Users are leaving because the competition is faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pitch:&lt;/strong&gt; "We can cut page load times from 10 seconds to 2 seconds."&lt;/p&gt;

&lt;p&gt;Better experience = happier customers = more retention = more revenue. Easy sell.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Compliance requirements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The reality:&lt;/strong&gt; You need to meet regulations or you can't do business.&lt;/p&gt;

&lt;p&gt;You need SOC 2 to close enterprise deals. You need HIPAA compliance to work with healthcare. You need GDPR compliance to operate in Europe. Your current setup can't pass an audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pitch:&lt;/strong&gt; "We need this to close $5M in deals."&lt;/p&gt;

&lt;p&gt;When compliance blocks revenue, you get budget. Fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. M&amp;amp;A integration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The reality:&lt;/strong&gt; You acquired a company and need to integrate their systems.&lt;/p&gt;

&lt;p&gt;You bought a competitor and now you have two completely different stacks. You need to consolidate. You need to migrate their customers to your platform. You need to do it without breaking anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pitch:&lt;/strong&gt; "We need to integrate the acquisition within 6 months."&lt;/p&gt;

&lt;p&gt;M&amp;amp;A timelines are non-negotiable. If this is your driver, you'll get resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to identify your drivers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Talk to people.&lt;/strong&gt; Not just engineers. Talk to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product managers (what features are blocked by infrastructure?)&lt;/li&gt;
&lt;li&gt;Sales (what deals are we losing and why?)&lt;/li&gt;
&lt;li&gt;Support (what are customers complaining about?)&lt;/li&gt;
&lt;li&gt;Finance (where are we bleeding money?)&lt;/li&gt;
&lt;li&gt;Leadership (what keeps them up at night?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Look at the data:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Incident reports (what breaks most often?)&lt;/li&gt;
&lt;li&gt;Cost reports (where's the money going?)&lt;/li&gt;
&lt;li&gt;Performance metrics (what's slow?)&lt;/li&gt;
&lt;li&gt;Customer feedback (what are they saying?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prioritize ruthlessly:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What's costing us the most money?&lt;/li&gt;
&lt;li&gt;What's the biggest risk?&lt;/li&gt;
&lt;li&gt;What's blocking the most revenue?&lt;/li&gt;
&lt;li&gt;What's causing the most pain?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you should have when you're done
&lt;/h2&gt;

&lt;p&gt;A simple list with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Technical drivers&lt;/strong&gt; (ranked by impact)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business drivers&lt;/strong&gt; (ranked by value)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The one or two that matter most&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. You don't need 10 drivers. You need the 1-2 that justify the investment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't make up drivers.&lt;/strong&gt; "We should use Kubernetes because it's cool" isn't a driver. "We need Kubernetes because we can't scale our current setup" is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't ignore the business side.&lt;/strong&gt; Technical excellence doesn't matter if it doesn't solve a business problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't try to solve everything.&lt;/strong&gt; You can't fix scalability, security, cost, and speed all at once. Pick your battles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't skip this step.&lt;/strong&gt; If you can't articulate why you're modernizing, you shouldn't be modernizing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Now you know &lt;em&gt;why&lt;/em&gt; you're doing this. Next comes the hard part: figuring out &lt;em&gt;how&lt;/em&gt; to do it without breaking everything.&lt;/p&gt;

&lt;p&gt;But at least now when your boss asks "why are we spending $500K on this?" you'll have an answer.&lt;/p&gt;

&lt;p&gt;And it'll be a good one.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>business</category>
    </item>
    <item>
      <title>Assessing an AWS Legacy Environment</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Mon, 23 Feb 2026 14:15:15 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/assessing-an-aws-legacy-environment-54oc</link>
      <guid>https://forem.com/yeisoncruz16/assessing-an-aws-legacy-environment-54oc</guid>
      <description>&lt;p&gt;You just got handed the keys to an AWS account that's been running for... who knows how long. The person who built it? Left the company 18 months ago. The documentation? "It's all in Confluence" (it's not).&lt;/p&gt;

&lt;p&gt;Now leadership wants to know: "Can we modernize this?" And you're thinking: "I don't even know what &lt;em&gt;this&lt;/em&gt; is yet."&lt;/p&gt;

&lt;p&gt;Let's fix that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bother with an assessment?
&lt;/h2&gt;

&lt;p&gt;Because you can't fix what you don't understand. And you definitely can't tell your boss "this will take 6 months and cost $200K" when you haven't even looked under the hood.&lt;/p&gt;

&lt;p&gt;An assessment answers three simple questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What are we running?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How much is it costing us?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What's about to explode?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No 50-page reports. No fancy architecture diagrams that nobody reads. Just the facts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the obvious: What's actually running?
&lt;/h2&gt;

&lt;p&gt;Open the AWS Console. Click around. Seriously.&lt;/p&gt;

&lt;p&gt;Go to EC2. How many instances do you have? Are they all running? Do they have names, or are they just "i-0a1b2c3d4e5f" with no tags?&lt;/p&gt;

&lt;p&gt;Check RDS. Any databases? What versions? (Spoiler: probably outdated)&lt;/p&gt;

&lt;p&gt;Look at Lambda. How many functions? Anyone know what they do?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; If nothing has tags, you're in for a rough time. Tags are how you know "this server runs the payment API" vs "this is Steve's test box from 2022 that nobody dared to delete."&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow the money (Because your CFO will)
&lt;/h2&gt;

&lt;p&gt;Go to Cost Explorer. Look at last month's bill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's eating the budget?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it EC2 instances running 24/7 when they could shut down at night?&lt;/li&gt;
&lt;li&gt;Data transfer costs because someone's downloading terabytes to their laptop?&lt;/li&gt;
&lt;li&gt;A NAT Gateway that costs more than the application it supports?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Look for the stupid stuff:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storage volumes attached to nothing (you're paying for ghost hard drives)&lt;/li&gt;
&lt;li&gt;Load balancers with zero traffic (still $16/month each)&lt;/li&gt;
&lt;li&gt;Elastic IPs sitting idle ($3.60/month adds up when you have 47 of them)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is low-hanging fruit. You can save money &lt;em&gt;today&lt;/em&gt; just by cleaning up the mess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Check (Before someone hacks you)
&lt;/h2&gt;

&lt;p&gt;You don't need to be a security expert. Just answer these questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can anyone on the internet SSH into your servers?&lt;/strong&gt; (Check security groups for 0.0.0.0/0 on port 22)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are your S3 buckets public?&lt;/strong&gt; (They shouldn't be, but you'd be surprised)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is anyone using the root account?&lt;/strong&gt; (They better not be)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When was the last time someone rotated access keys?&lt;/strong&gt; (If the answer is "never," we have a problem)&lt;/p&gt;

&lt;p&gt;AWS has tools for this (Trusted Advisor, Security Hub), but honestly? Just click through the console and look for red flags. You'll find them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Map the dependencies (AKA "What breaks if I touch this?")
&lt;/h2&gt;

&lt;p&gt;This is the hard part. You need to figure out what talks to what.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start simple:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users hit a load balancer&lt;/li&gt;
&lt;li&gt;Load balancer talks to app servers&lt;/li&gt;
&lt;li&gt;App servers talk to a database&lt;/li&gt;
&lt;li&gt;Maybe there's an S3 bucket somewhere&lt;/li&gt;
&lt;li&gt;Probably some Lambda functions doing... something&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How do you figure this out?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look at the code (if you can find it)&lt;/li&gt;
&lt;li&gt;Check CloudWatch logs for traffic patterns&lt;/li&gt;
&lt;li&gt;Ask the team (the junior dev who's been here 8 months knows more than you think)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Draw it on a whiteboard. Boxes and arrows. Nothing fancy. Just "if I turn off X, does Y break?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Spot the Technical Debt
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Things that should make you nervous:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2 instances that have been running since 2019 and nobody knows what they do&lt;/li&gt;
&lt;li&gt;Databases running MySQL 5.6 (end-of-life was years ago)&lt;/li&gt;
&lt;li&gt;Manual deployments (someone SSHs in and runs commands)&lt;/li&gt;
&lt;li&gt;No backups (or backups that nobody's ever tested)&lt;/li&gt;
&lt;li&gt;Everything in one availability zone (one AWS hiccup = you're down)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Things that are costing you money:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servers sized for peak traffic running 24/7&lt;/li&gt;
&lt;li&gt;Self-managed databases when RDS would be cheaper and easier&lt;/li&gt;
&lt;li&gt;No auto-scaling (you're paying for capacity you don't need)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make a list. Prioritize by "what's going to bite us first."&lt;/p&gt;

&lt;h2&gt;
  
  
  Know your baseline (Or you can't prove you made it better)
&lt;/h2&gt;

&lt;p&gt;Before you change anything, write down how things perform &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capture the basics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How fast do pages load?&lt;/li&gt;
&lt;li&gt;What's the error rate?&lt;/li&gt;
&lt;li&gt;How much CPU/memory are we using?&lt;/li&gt;
&lt;li&gt;How long do database queries take?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need this. Because in 6 months when you've modernized everything, someone will ask "did this actually help?" and you'll want receipts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you should have when you're done
&lt;/h2&gt;

&lt;p&gt;A simple document (Google Doc, Notion, whatever) with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List of what's running (and what it costs)&lt;/li&gt;
&lt;li&gt;Security issues (ranked by "how screwed are we?")&lt;/li&gt;
&lt;li&gt;Dependency map (even if it's just boxes and arrows)&lt;/li&gt;
&lt;li&gt;Technical debt list (prioritized)&lt;/li&gt;
&lt;li&gt;Performance numbers (your baseline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. No 100-slide PowerPoint. No executive summary that nobody reads. Just the facts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Make These Mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't trust the documentation.&lt;/strong&gt; That wiki page was last updated in 2021. Verify everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't do this alone.&lt;/strong&gt; Talk to developers. Talk to ops. Talk to the person who gets paged at 3 AM. They know where the bodies are buried.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't take forever.&lt;/strong&gt; This should take 1-2 days, not 3 months. You're assessing, not solving. Yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't skip the boring parts.&lt;/strong&gt; Counting EC2 instances isn't fun, but it's necessary. You can't modernize what you can't see.&lt;/p&gt;

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

&lt;p&gt;Now you know what you have. Next comes the hard part: deciding what to do with it.&lt;/p&gt;

&lt;p&gt;What do you migrate first? What do you retire? What do you leave alone because it works and nobody wants to touch it?&lt;/p&gt;

&lt;p&gt;But that's a problem for next week.&lt;/p&gt;

&lt;p&gt;For now, go open that AWS Console and start clicking around. You might be surprised (or horrified) by what you find.&lt;/p&gt;

&lt;p&gt;And hey, at least you'll finally know what you're dealing with.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Boy Scout Rule (Yes, It Applies to Node.js Too)</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Tue, 27 May 2025 19:17:02 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/the-boy-scout-rule-yes-it-applies-to-nodejs-too-11c1</link>
      <guid>https://forem.com/yeisoncruz16/the-boy-scout-rule-yes-it-applies-to-nodejs-too-11c1</guid>
      <description>&lt;p&gt;You’ve probably heard this one before: &lt;strong&gt;"Leave the campsite cleaner than you found it."&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Well, surprise—this isn't just good advice for the outdoors. It’s also solid advice for writing code. And yeah, it has a name: &lt;strong&gt;The Boy Scout Rule&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧼 What Is It?
&lt;/h2&gt;

&lt;p&gt;The rule is simple: &lt;strong&gt;every time you touch some code, make it a bit better than it was&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You don’t have to refactor the entire project or go full-on DDD (Domain-Driven Drama™). That’s not the point. It’s about the little things.&lt;/p&gt;

&lt;p&gt;If you see a variable named &lt;code&gt;a&lt;/code&gt; that’s actually a &lt;code&gt;userId&lt;/code&gt;, rename it.&lt;br&gt;&lt;br&gt;
If you stumble upon a 200-line function and you can extract 10 lines into a helper—do it.&lt;br&gt;&lt;br&gt;
If there’s a TODO from 2019 that’s now obsolete—delete it.&lt;/p&gt;

&lt;p&gt;It’s like brushing your teeth. Nobody’s gonna throw you a party for it, but if you don’t do it... things get ugly fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;Because you’re not the only one reading that code. And your future self? They’ll thank you for not leaving landmines behind.&lt;/p&gt;

&lt;p&gt;Tech debt builds up fast, and this rule is a low-effort way to fight it.&lt;br&gt;&lt;br&gt;
If everyone on your team improves &lt;em&gt;just a little bit&lt;/em&gt; of the code they touch every day, the codebase evolves instead of rotting.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ How to Apply It in Node.js
&lt;/h2&gt;

&lt;p&gt;Let’s get practical. You’re working on a Node.js project and need to fix a bug or add a feature. Before you close the file, ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can I rename this confusing function?&lt;/li&gt;
&lt;li&gt;Are there &lt;code&gt;console.log&lt;/code&gt; statements I should clean up?&lt;/li&gt;
&lt;li&gt;Is this &lt;code&gt;async/await&lt;/code&gt; spaghetti that could use a &lt;code&gt;.catch()&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Can I add a missing comment that would help the next dev?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔍 Before
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 After
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sumPrices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;priceA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;priceB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;priceA&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;priceB&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;h2&gt;
  
  
  💭 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The Boy Scout Rule is not a framework, library, or fancy design pattern.&lt;br&gt;
It’s a mindset.&lt;/p&gt;

&lt;p&gt;It’s how you slowly improve a messy codebase without having to stop everything and “clean it all up.”&lt;/p&gt;

&lt;p&gt;So the next time you touch a file, don’t just fix the bug or add the feature.&lt;br&gt;
Do one nice thing for the next dev (even if that dev is you in 3 months).&lt;/p&gt;

&lt;p&gt;Refactor that weird loop.&lt;br&gt;
Rename that vague variable.&lt;br&gt;
Delete that 2018 TODO.&lt;/p&gt;

&lt;p&gt;Just make the campsite a little cleaner than you found it.&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Tips para un mejor daily meeting</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Fri, 26 Feb 2021 22:42:58 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/tips-para-un-mejor-daily-meeting-1jbk</link>
      <guid>https://forem.com/yeisoncruz16/tips-para-un-mejor-daily-meeting-1jbk</guid>
      <description>&lt;p&gt;A lo largo de mi carrera como desarrollador he estado en muchos equipos donde adoptamos algunas practicas de Scrum que nos pueden ser útiles, entre ellas esta el daily meeting.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Es importante recalcar que lo mencionado en este post son recomendaciones netamente personales&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Y para tener un poco de contexto acerca de lo que es esta reunión, adjunto una descripción de Google.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;El objetivo de esta reunión es facilitar la transferencia de información y la colaboración entre los miembros del equipo para aumentar su productividad, al poner de manifiesto puntos en que se pueden ayudar unos a otros.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y vaya que es difícil lograr un Daily meeting efectivo (productivo). Siempre nos encontramos con personas que tienen una idea errónea de él, piensan que el daily meeting es una reunión para demostrarle al equipo que SI estoy trabajando, si estoy haciendo algo y que no estoy solo "calentando silla". Resulta que no es así, por este tipo de cosas se debería preocupar otro tipo de personas y se debe tratar en otras reuniones.&lt;/p&gt;

&lt;p&gt;El objetivo de la reunión es facilitar la colaboración entre los miembros del equipo, ver si estamos desarrollando la tarea por el camino correcto, ver si alguien tiene una mejor solución al problema que tengo actualmente, o simplemente si alguien tiene un consejo acerca de mi tarea, como tal (Facilitar la colaboración).&lt;/p&gt;

&lt;p&gt;Otro problema común es que seguimos pensando como desarrolladores, asumimos que las demás personas presentes están al tanto de cada actualización de mis tareas y terminamos hablando de puros tecnicismos que son muy difíciles de comprender. A fin de cuentas esto lo podríamos resolver dando un poco de contexto de la tarea justo antes de empezar a hablar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mi tarea actual es &lt;em&gt;X&lt;/em&gt; y la finalidad es &lt;em&gt;Y&lt;/em&gt;. &lt;em&gt;De este punto en adelante hablaremos de las 3 preguntas basicas (¿que hice ayer?, ¿que voy hacer hoy?, ¿que obstaculos tuve o tengo?)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Es importante que si estamos en remoto, tengamos nuestras cámaras encendidas, ayuda a evitar las distracciones. Y si no vamos a prestar atención a lo que los compañeros dicen, no estoy facilitando una colaboración y no tendría sentido estar en esa ceremonia.&lt;/p&gt;

&lt;p&gt;Recuerda también omitir detalles que no serían relevantes en cuanto al modelo de negocio, e incluso detalles que no son relevantes para el equipo, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tuve que salir por un compromiso personal.&lt;/li&gt;
&lt;li&gt;Tuve reuniones con administración.&lt;/li&gt;
&lt;li&gt;Estaba explicandole al compañero nuevo algo sobre &lt;em&gt;X&lt;/em&gt; tema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Son datos que no se deben incluir en esta reunión, hay otros espacios para esto.&lt;/p&gt;




&lt;p&gt;Por otro lado, en cuanto al tiempo, algunas empresas optan por tener un limite de tiempo, y personalmente creo que no está bien, porque es algo muy variable dependiendo del número de tareas que hice, que tengo y que voy a hacer, también depende de que tan grande es mi tarea y si el contexto que debo darles es un poco extenso. Recuerden que la idea de la reunión es que me puedan colaborar y nadie me podrá ayudar si no pude explicarme bien por falta de tiempo.&lt;/p&gt;

&lt;p&gt;Y para finalizar, sería bueno tener un moderador, porque somos humanos y podemos equivocarnos algunas veces e irnos por otro camino, dar más detalles de los necesarios o muchos tecnicismos, entonces ahí es cuando esta persona nos indicará inmediatamente el rumbo que debo tomar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip personal: Lee sobre el &lt;em&gt;Lenguaje ubicuo&lt;/em&gt; en DDD, nos ayuda a dar una idea de cómo tener conversaciones pensando en todo el equipo y no solo en mi rol.&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;Si llegaste hasta acá, Gracias por leer este post.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Soy un programador entusiasta con un canal en Youtube, no olvides seguirme ;)&lt;/em&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/channel/UCOqIekrnMxaW-0wUtItSUsw" rel="noopener noreferrer"&gt;https://www.youtube.com/channel/UCOqIekrnMxaW-0wUtItSUsw&lt;/a&gt;&lt;/p&gt;

</description>
      <category>daiy</category>
      <category>meetings</category>
    </item>
    <item>
      <title>How to get Gmail API Token</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Tue, 17 Nov 2020 16:04:16 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/how-to-get-gmail-api-token-4ngn</link>
      <guid>https://forem.com/yeisoncruz16/how-to-get-gmail-api-token-4ngn</guid>
      <description>&lt;p&gt;First of all, login using you google account.&lt;/p&gt;

&lt;p&gt;To generate the token, follow the next steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate &lt;code&gt;credentials.json&lt;/code&gt; from gmail page (next step)&lt;/li&gt;
&lt;li&gt;Go to &lt;a href="https://developers.google.com/gmail/api/quickstart/php" rel="noopener noreferrer"&gt;Gmail guide&lt;/a&gt; and generate the credentials file (just if you dont have one)&lt;/li&gt;
&lt;li&gt;Create a folder to run the code &lt;code&gt;mkdir gmail-generate&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;create the quickstart file &lt;code&gt;touch quickstart.php&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Execute &lt;code&gt;composer require "google/apiclient"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;php quickstart.php&lt;/code&gt; (file content is below)&lt;/li&gt;
&lt;li&gt;Now in the folder path you have a &lt;code&gt;token.json&lt;/code&gt; file&lt;/li&gt;
&lt;/ol&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;php_sapi_name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'cli'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'This application must be run on the command line.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Google_Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setApplicationName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Gmail API PHP Quickstart'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setScopes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Google_Service_Gmail&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;GMAIL_READONLY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setScopes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Google_Service_Gmail&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;GMAIL_MODIFY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAuthConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'credentials.json'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAccessType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'offline'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'select_account consent'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Load previously authorized token from a file, if it exists.&lt;/span&gt;
    &lt;span class="c1"&gt;// The file token.json stores the user's access and refresh tokens, and is&lt;/span&gt;
    &lt;span class="c1"&gt;// created automatically when the authorization flow completes for the first&lt;/span&gt;
    &lt;span class="c1"&gt;// time.&lt;/span&gt;
    &lt;span class="nv"&gt;$tokenPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'token.json'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tokenPath&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tokenPath&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAccessToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$accessToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// If there is no previous token or it's expired.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isAccessTokenExpired&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Refresh the token if possible, else fetch a new one.&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRefreshToken&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchAccessTokenWithRefreshToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRefreshToken&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Request authorization from the user.&lt;/span&gt;
            &lt;span class="nv"&gt;$authUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;createAuthUrl&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Open the following link in your browser:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$authUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;'Enter verification code: '&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nv"&gt;$authCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;fgets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;STDIN&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

            &lt;span class="c1"&gt;// Exchange authorization code for an access token.&lt;/span&gt;
            &lt;span class="nv"&gt;$accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchAccessTokenWithAuthCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$authCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAccessToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$accessToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="c1"&gt;// Check to see if there was an error.&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;array_key_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'error'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$accessToken&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$accessToken&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;// Save the token to a file.&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;file_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tokenPath&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tokenPath&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mo"&gt;0700&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tokenPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAccessToken&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;// Get the API client and construct the service object.&lt;/span&gt;
&lt;span class="nv"&gt;$client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Google_Service_Gmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Print the labels in the user's account.&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'me'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;users_labels&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;listUsersLabels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$results&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getLabels&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;"No labels found.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;"Labels:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$results&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getLabels&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"- %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getName&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;



</description>
    </item>
    <item>
      <title>AWS CDK First impression</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Thu, 22 Oct 2020 03:10:40 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/aws-cdk-first-impression-3l19</link>
      <guid>https://forem.com/yeisoncruz16/aws-cdk-first-impression-3l19</guid>
      <description>&lt;p&gt;On July 2019 was released the AWS CDK a code-first library to define cloud application infrastructure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The AWS CDK is a new software development framework from AWS with the sole purpose of making it fun and easy to define cloud infrastructure in your favorite programming language and deploy it using AWS CloudFormation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first thing that i realized is the AWS Cloudformation compatibility. every new written code is transformed to YML template, so almost everything in Cloudformation can be used here and that is really util.&lt;/p&gt;

&lt;p&gt;There is really big advantage, and is the way you can create the application infrastructure, now you can use different languages as JavaScript, Python, Java, C# and also Typescript. And this is a really good feature because sometimes developers are not familiarized with YAML structure's and JSON is not the best way to create a Cloudformation template, so now you will choose your preferred language and just start to create the needed resources using the library.&lt;/p&gt;

&lt;p&gt;And now as the resources are created using code, you can create unit test to improve the quality and make sure a new developer is no going to change something important there.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With CloudFormation, you also can write some tests, but it requires another tool&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ok, now let's talk about constructors, is a new introduced concept and are so useful because now you won't need to create a lot of unnecessary as you usually do in YAML, just "WRITE LESS AND DO MORE", for example We need to write around 1000 lines of code using CloudFormation, when we try with AWS CDK, we only need to write around 50 lines of code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DynamoDB table constructor&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Construct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TableProps&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// This represents a single EC2 instance.&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Construct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;InstanceProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Creates a new EBS Volume in AWS EC2&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Volume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Construct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;VolumeProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;CDK vs YAML&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu49m5y79f6avjinlmn9f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu49m5y79f6avjinlmn9f.png" alt="yaml-vs-code" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;More good things, the deployment process is a little bit friendly and request some confirmations before deploy. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qyvgmg8w2o7d0hkitir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qyvgmg8w2o7d0hkitir.png" alt="yaml-vs-code" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also you can see the updated resources easily after deploy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsh2qqv189nnllhodofzf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsh2qqv189nnllhodofzf.png" alt="yaml-vs-code" width="702" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is something that personally is bad, and is the way to run the application locally. You can't do it using AWS CDK, you have to build the code to YML and execute it using AWS SAM, so you will need and step more before try every new change locally.&lt;/p&gt;




&lt;p&gt;I hope this post has been useful for you.&lt;/p&gt;

&lt;p&gt;Finally, you have a great Workshop here:  &lt;a href="https://cdkworkshop.com/" rel="noopener noreferrer"&gt;https://cdkworkshop.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CDK use guide: &lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/home.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/cdk/latest/guide/home.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some examples: &lt;a href="https://github.com/aws-samples/aws-cdk-examples" rel="noopener noreferrer"&gt;https://github.com/aws-samples/aws-cdk-examples&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>it</category>
      <category>cdk</category>
      <category>cloudformation</category>
    </item>
    <item>
      <title>Write the README.md file, don't kill yourself</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Fri, 09 Oct 2020 03:12:48 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/write-the-readme-file-don-t-be-stupid-5a53</link>
      <guid>https://forem.com/yeisoncruz16/write-the-readme-file-don-t-be-stupid-5a53</guid>
      <description>&lt;p&gt;It's so common for beginners !&lt;/p&gt;

&lt;p&gt;Usually when we start a new project, we focus on the good part  (the code), system logic, server configuration and that kind of thing, and completely forget some stuff like documentation, security, scalability, etc...&lt;/p&gt;

&lt;p&gt;And Yes! also the README.md is completely forgotten, it's like a self stab, because we are humans and usually forget things, like the command to start the project, restrictions, how to deploy, how feature works, how to run tests and many more. Maybe you will say something like "Ok, I only work on this project, I can remember that kind of commands", but what about the other team members, what about NEW team members? they are going to lose a lot of time checking how to start, stop, test....&lt;/p&gt;

&lt;p&gt;The README is going to make your life easier for you and every team member, and ins't a heroic task, it's as simple as created a file named README.md inside the project and that is all.&lt;/p&gt;

&lt;p&gt;Even if you start to use the readme file, you can add more interesting things, like build status, deploy status and that kind of icons red/orange/green, unit test coverage and limits.&lt;/p&gt;

&lt;p&gt;I used to assume that README was a file located at the root of a software repository. Did you know a README file serves as an index file in any directory of your versioned tree? It is pretty handy if you feel the need to split its content, or if you want to address specific needs for relevant folders of your projects.&lt;/p&gt;

&lt;p&gt;And remember, README files are the entry points needs, to be focused in what is really needed.&lt;/p&gt;

&lt;p&gt;You can use tools as Dillinger to write it easily. &lt;br&gt;
&lt;a href="https://dillinger.io/" rel="noopener noreferrer"&gt;https://dillinger.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are some examples :&lt;br&gt;
&lt;a href="https://github.com/matiassingers/awesome-readme" rel="noopener noreferrer"&gt;https://github.com/matiassingers/awesome-readme&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm4g4e9ntktdf9mi8y1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm4g4e9ntktdf9mi8y1v.png" alt="readme" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Feature toggles are not optional</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Fri, 11 Sep 2020 19:12:59 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/feature-toggles-are-not-optional-5djd</link>
      <guid>https://forem.com/yeisoncruz16/feature-toggles-are-not-optional-5djd</guid>
      <description>&lt;p&gt;Here is the description from &lt;a href="https://martinfowler.com/articles/feature-toggles.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/feature-toggles.html&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feature Toggles (often also refered to as Feature Flags) are a powerful technique, allowing teams to modify system behavior without changing code. They fall into various usage categories, and it's important to take that categorization into account when implementing and managing toggles. Toggles introduce complexity. We can keep that complexity in check by using smart toggle implementation practices and appropriate tools to manage our toggle configuration, but we should also aim to constrain the number of toggles in our system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ok, it's simple, you just need to create and if/else to determine if new/old block of code should be executed.&lt;/p&gt;

&lt;p&gt;And now, why Feature Flags should not be optional ?. &lt;br&gt;
it's because quality. We are humans and we can make mistakes, but is so expensive when you made a mistake inside payment area, deployed and go to rest, you are not able to change the code when it fails and somebody have to read the code, maybe rollback, but some other features can be affected because other team member already deployed, so not only your change will be restore, maybe other important functionality too.&lt;br&gt;
&lt;em&gt;it's a dead end road&lt;/em&gt;. When the team found a solution, the company have lost a lot of money.&lt;/p&gt;

&lt;p&gt;You will need a way to just disable the new feature easily, but how ?, and here is when feature toggles are important, because any team member, even the customer can just go to a "features system" and just disable it in a while. In PRODUCTION site every minute counts.&lt;/p&gt;

&lt;p&gt;That's is a good reason, but there are more reasons. Now just think a big functionality is's being develop in the protect, and there 3 developers working in different modules, but one of them (you) finish first, the main functionality still incomplete, so the code can't be deployed to production site, just keep the branch open until other team members finish, but when the full functionality is finished you will need to merge changes and maybe your expected block of code was changed by another team member and then you will have update the code again, fix conflicts and test again, that's a lot of time i think. A simple feature toggle can be the solution, you just need to write your code and if the dependencies are not complete you just turn off your feature toggle (to avoid the code breaks something in production) and just send your changes to master easily, on this ways the other team member will have your changes and your task it's done here, congrats!&lt;/p&gt;

&lt;p&gt;Feature toggles also called featured flags. Can be implemented on very language just with and if/else, but you can improve it using ENV variables, database, external functionality or even your own, it's not complicated. &lt;/p&gt;

&lt;p&gt;You can use featured flags conditions based on whatever you want ip, enviroment, host, zone, country, etc...&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;useNewAlgorithm&lt;/span&gt; &lt;span class="p"&gt;){&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;enhancedSplineReticulation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;oldFashionedSplineReticulation&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;h3&gt;
  
  
  Dynamic example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reticulateSplines&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;featureIsEnabled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use-new-SR-algorithm&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;enhancedSplineReticulation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;oldFashionedSplineReticulation&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;Here is a list of services that you can use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cloudbees.com/products/feature-flags" rel="noopener noreferrer"&gt;https://www.cloudbees.com/products/feature-flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rollout.io/" rel="noopener noreferrer"&gt;https://rollout.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.unleash-hosted.com/" rel="noopener noreferrer"&gt;https://www.unleash-hosted.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.upstamps.com/" rel="noopener noreferrer"&gt;https://www.upstamps.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://featureflags.io/" rel="noopener noreferrer"&gt;https://featureflags.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a personal advise, buy a feature flagging platform, don't build your own, it's because the goal here is make the code simple, let the hard work to experienced team.&lt;/p&gt;

&lt;p&gt;And... Please remove the features after your code is running and validated. keep it as simple as possible.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Resumen para un DevOps day</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Sat, 08 Aug 2020 02:16:40 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/resumen-para-un-devops-day-924</link>
      <guid>https://forem.com/yeisoncruz16/resumen-para-un-devops-day-924</guid>
      <description>&lt;p&gt;Después de escuchar a muchas personas durante dos días dando charlas acerca de DevOps, "¿que es?", sus inicios y "¿para que sirve?", logre sacar algunas conclusiones que espero les sean de ayuda para tener en cuenta al momento de hablar de DevOps.&lt;/p&gt;

&lt;p&gt;Las deducciones o afirmaciones aquí mencionadas son netamente personales y tambien citaré algunas frases de los expositores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FEc7n4r0XsAASyCm%3Fformat%3Dpng%26name%3Dmedium" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FEc7n4r0XsAASyCm%3Fformat%3Dpng%26name%3Dmedium" alt="DEVOPS : Dev (desarrollo) Ops (Operaciones)" width="1186" height="1181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  imagen obtenida de este post &lt;a href="https://twitter.com/DevopsdaysMed/status/1283219819496603648/photo/1" rel="noopener noreferrer"&gt;https://twitter.com/DevopsdaysMed/status/1283219819496603648/photo/1&lt;/a&gt;
&lt;/h6&gt;

&lt;p&gt;Daré inicio a este articulo citando la frase de Denovan Brown, "DevOps es la unión de personas, procesos, y productos para permitir una entrega continua de valor a los usuarios finales".&lt;/p&gt;

&lt;p&gt;Desde este preciso instante ya podemos ver que hablamos de una filosofía más no de una lista de herramientas, administrador de servidores o un grupo de personas. Ahora empezamos a verlo desde otra perspectiva, ahora estamos hablando de una cultura tanto personal como organizacional con la finalidad de entregar más calidad en el menos tiempo posible.&lt;/p&gt;

&lt;p&gt;Ahora, ¿porque una cultura?, porque DevOps le permite de los equipos y a las personas definir como van a interactuar unos con los otros incluso sin estar dentro de la misma área de trabajo. &lt;/p&gt;

&lt;p&gt;Ya sabemos que es DevOps, pero ahora hablemos un poco de lo que no es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una persona encargada de administrar servidores.&lt;/li&gt;
&lt;li&gt;Un listado de herramientas.&lt;/li&gt;
&lt;li&gt;No es asunto de TI.&lt;/li&gt;
&lt;li&gt;No es un area de la empresa.&lt;/li&gt;
&lt;li&gt;y por último, hacer CI/CD no es hacer DevOps, esto va más allá.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bien! Ya tenemos claros algunos conceptos, y podremos sacar provecho de algunos de los consejos brindados por estas personas. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Una ficha de dominó puede derribar otra con un tamaño 50% mayor" (Lorne Whitehead).&lt;/strong&gt;&lt;br&gt;
Claramente podemos ver la importancia de tener siempre un desarrollo progresivo en nuestros proyectos, para el usuario final es mucho más valioso poder interactuar con un sistema básico HOY, mañana un poco mejor y pasado mañana aún mejor, que tener ALGO con más herramientas pero dentro de 1 año.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"No existen pequeños errores".&lt;/strong&gt; Esto también se puede convertir en un efecto domino, cuando por ejemplo olvidamos cambiar una sola variable antes de ir a producción, pero resulta que esa variable es la que habilita el debug de todo el sistema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"DevOps es un vehiculo cuyo único destino es la productividad".&lt;/strong&gt; Ya sabemos que no lo podemos ver como simplemente un grupo de personas encargadas de administrar servidores, debemos verlo como ese conjunto de acciones que nos ayuden a mejorar, sí tener CI/CD mejora mi productividad entonces hace parte de DevOps, sí tener Contenedores Docker hace que mi forma de desplegar sea mucho mas rapida y entregar valor al cliente mas rapido entonces hace parte de DevOps. Y asi podemos continuar con el sin fin de acciones que nos hacer ser mas productivos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Microservicios son un camino a la productividad"&lt;/strong&gt;, divide y veceras, siempre sera mucho mas facil tener todo un proceso de calidad a un pequeño sistema que simplemente un complejo sistema de calidad a un gran poryecto. ¡No lo sé, Piensalo!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"No deje de lado los las pruebas automatizadas".&lt;/strong&gt; No somos perfectos y con consigueinte nuestro software tampoco lo sera, sí sabemos que nuestro software va a fallar, pues entonces que falle rapido y en nuestras manos, asi sera menos costoso dar soporte y generar mas valor. Además, esta en nuestra humanidad, Fallar + Aprender = Crecer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Things that have never happened before, happen all the time".&lt;/strong&gt; No se preocupe, siempre vamos a tener algo que no sabemos como resolver, pero de eso se trata DeVops, prepararnos para evitar los fallos y cuando falle tengamos una mejor idea de que podemos hacer. Metricas, Rollback, Logs, Upgrades, Autoscaling, system recover...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Jenkins está obsoleto",&lt;/strong&gt; Naturalmente no es que sea una mala herramienta, aun lo es, y no tengo nada en contra, pero si lo pensamos bien, es una herramienta a la cual le tenemos que instalar y dar soporte. Administrar nuestra aplicacion ya es bastante carga como para que tengamos una preocupacion más, ahora tenemos algunas alternativas mas escalables como Github actions, Buddy.works, Gitlab, circle ci, codefresh.io, aws codepipeline, google cloud build y muchas mas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"No matter how much we prepare... We really don't know very much".&lt;/strong&gt; ¿Que?, ¿Como?, ¿Donde?, ¿Cuando?, no importa lo que hagamos, siempre vamos a tener alguna falla o algo por mejorar, lo importante es que trabajemo en reducir esa posibilidad tanto como sea posible, se mencionó mucho &lt;br&gt;
 'Ingeniería del caos' y como ha sido la clave para mejorar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"¿Porque las personas ponemos resistencia?"&lt;/strong&gt;, Es normal y siempre va a pasar, cuando crear practicas DevOps va haber resistencia, pero eso tambien es parte del proceso, una vez mas es escencia del ser humano, entonces lo unico que podemos hacer es ser pacientes y buscar la alternativa para que estas practicas sean bien acojidas.&lt;/p&gt;

&lt;p&gt;Hasta aca, he logrado hacer un resumen de algunas notas que tomé y de otras cosas que me acuerdo, la verdad es que fue un dia muy productivo y espero que estas notas les sean de utilidad.&lt;/p&gt;

&lt;p&gt;Dejaré algunos posts a continuacion.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1291529103347253248-338" src="https://platform.twitter.com/embed/Tweet.html?id=1291529103347253248"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1291529103347253248-338');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1291529103347253248&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1291528352457777154-876" src="https://platform.twitter.com/embed/Tweet.html?id=1291528352457777154"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1291528352457777154-876');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1291528352457777154&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1289234402891853824-396" src="https://platform.twitter.com/embed/Tweet.html?id=1289234402891853824"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1289234402891853824-396');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1289234402891853824&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1289249973565964289-160" src="https://platform.twitter.com/embed/Tweet.html?id=1289249973565964289"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1289249973565964289-160');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1289249973565964289&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/DevopsdaysMed/media" rel="noopener noreferrer"&gt;https://twitter.com/DevopsdaysMed/media&lt;/a&gt;&lt;/p&gt;

</description>
      <category>it</category>
      <category>devops</category>
      <category>learinig</category>
      <category>summary</category>
    </item>
    <item>
      <title>What about scalability?</title>
      <dc:creator>Yeison Cruz</dc:creator>
      <pubDate>Thu, 30 Jul 2020 01:07:48 +0000</pubDate>
      <link>https://forem.com/yeisoncruz16/what-about-scalability-54ga</link>
      <guid>https://forem.com/yeisoncruz16/what-about-scalability-54ga</guid>
      <description>&lt;h3&gt;
  
  
  Let me tell you, it's beautiful
&lt;/h3&gt;

&lt;p&gt;Systems are expected to grow at any time, and you know "Any time" even at middle of night. Also you won't know when a new pandemic is going to be propagated in the world and people need to make almost everything using the computer and your system will increase traffic even 500% of the expected.&lt;/p&gt;

&lt;p&gt;It sounds good, but be careful scalability isn't something you have to do just when the system fails or maybe when a big deal is near. You have to think is scalability from the beginning. Because is so difficult to scale in/out a monolith, here is a list that i think you should have in mind from the beginning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't create logs in the server, it's difficult to maintain when you have to duplicate your server.&lt;/li&gt;
&lt;li&gt;Avoid a LAMP, MEAN servers, please move your database to another connection.&lt;/li&gt;
&lt;li&gt;Integrate a monitoring tool, will be easy if you can see what is happening before sign in into the server.&lt;/li&gt;
&lt;li&gt;Create Microservices, and avoid to use always the same programming languages, there is a language according the task.&lt;/li&gt;
&lt;li&gt;Use external service for assets (img, pdf, csv, txt ...), I usually use S3 it's cool.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After follow those tips, will be easier to move your system to a high scalable site, and some other benefit come in the package like easy to maintain, availability, cost effective site. Yes if you are able to reduce the server size when there are no users using it your wallet will be happy.&lt;/p&gt;

&lt;p&gt;And at the end, obviously you will be able to sleep better.&lt;/p&gt;

</description>
      <category>it</category>
      <category>scalability</category>
      <category>codequality</category>
      <category>software</category>
    </item>
  </channel>
</rss>
