<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Adrian Paul Nutiu</title>
    <description>The latest articles on DEV Community by Adrian Paul Nutiu (@kmataru).</description>
    <link>https://dev.to/kmataru</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%2F1362966%2Fb2aac120-ae4d-4932-89dd-8a65970f8f78.jpeg</url>
      <title>DEV Community: Adrian Paul Nutiu</title>
      <link>https://dev.to/kmataru</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kmataru"/>
    <language>en</language>
    <item>
      <title>🏎️ When Bots Play Better: The One and Only Bot for KartWars.io</title>
      <dc:creator>Adrian Paul Nutiu</dc:creator>
      <pubDate>Wed, 27 Nov 2024 19:09:03 +0000</pubDate>
      <link>https://dev.to/kmataru/when-bots-play-better-my-journey-of-creating-a-bot-for-kartwarsio-4a8p</link>
      <guid>https://dev.to/kmataru/when-bots-play-better-my-journey-of-creating-a-bot-for-kartwarsio-4a8p</guid>
      <description>&lt;h2&gt;
  
  
  📚 Intro
&lt;/h2&gt;

&lt;p&gt;It was that day which found me wandering through multiplayer online browser games, just to stumble upon &lt;strong&gt;KartWars.io&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For those of you who don’t know, KartWars.io was a fast-paced multiplayer game where players controlled karts in an arena. The goal was simple: collect power-ups, outmaneuver your opponents, and survive for as long as possible while climbing the leaderboard.&lt;/p&gt;

&lt;p&gt;I quickly got hooked, but as I played, an intriguing question popped into my mind:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I could create a bot to play this game for me?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not because I didn’t enjoy the gameplay, but because the challenge of building something capable of navigating this chaotic digital battlefield seemed too fun to resist.&lt;/p&gt;




&lt;p&gt;⚠️ &lt;strong&gt;Photosensitivity Warning&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The following video involves fast-changing visuals that may trigger discomfort. Please proceed with caution.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6JdmcjMFCIA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;Source code time 💪&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kmataru" rel="noopener noreferrer"&gt;
        kmataru
      &lt;/a&gt; / &lt;a href="https://github.com/kmataru/kartwars.io-bot" rel="noopener noreferrer"&gt;
        kartwars.io-bot
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🚗 Intelligent self-control and fighting system of karts in the Kartwars.io multiplayer game.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/kmataru/kartwars.io-bot/refs/heads/pre-release/images/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkmataru%2Fkartwars.io-bot%2Frefs%2Fheads%2Fpre-release%2Fimages%2Flogo.png" height="150"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Kartwars.io Bot Championship Edition&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;aka "Intelligent self-control and fighting system of karts in the Kartwars.io multiplayer game".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h5 class="heading-element"&gt;Welcome to the kartwars.io bot!&lt;/h5&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kmataru/kartwars.io-bot#goals" rel="noopener noreferrer"&gt;Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kmataru/kartwars.io-bot#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kmataru/kartwars.io-bot#installation-instructions" rel="noopener noreferrer"&gt;Installation instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kmataru/kartwars.io-bot#hotkeys" rel="noopener noreferrer"&gt;Hotkeys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kmataru/kartwars.io-bot#directory-contents" rel="noopener noreferrer"&gt;Directory Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kmataru/kartwars.io-bot#thanks" rel="noopener noreferrer"&gt;Thanks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Goals&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;No global pollution&lt;/li&gt;
&lt;li&gt;Easy to use&lt;/li&gt;
&lt;li&gt;Easy to create and embed any strategy and tactic&lt;/li&gt;
&lt;li&gt;Clean and well structured source code&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Easy installable&lt;/li&gt;
&lt;li&gt;Easy customizable&lt;/li&gt;
&lt;li&gt;Unlock all skins&lt;/li&gt;
&lt;li&gt;Multiple tactics&lt;/li&gt;
&lt;li&gt;Strong documentation&lt;/li&gt;
&lt;li&gt;Visual debugging&lt;/li&gt;
&lt;li&gt;Real time customization through dat.GUI&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation instructions&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;If you are on chrome, download the &lt;a href="https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=en" rel="nofollow noopener noreferrer"&gt;TamperMonkey&lt;/a&gt; extension.&lt;/p&gt;

&lt;p&gt;On other browsers, use the &lt;a href="https://addons.mozilla.org/en-GB/firefox/addon/greasemonkey/" rel="nofollow noopener noreferrer"&gt;GreaseMonkey&lt;/a&gt; extension.&lt;/p&gt;

&lt;p&gt;Once installed, click on &lt;a href="https://github.com/kmataru/kartwars.io-bot/raw/pre-release/src/DracoolaArt.Bot.Kartwars/bot.user.js" rel="noopener noreferrer"&gt;this&lt;/a&gt;, and choose &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="http://kartwars.io/" rel="nofollow noopener noreferrer"&gt;kartwars.io&lt;/a&gt;, and enjoy !&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Hotkeys&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
Ctrl + B&lt;br&gt;
&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Toggle Bot enabled/disabled&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Mouse wheel&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Zoom in/out&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Directory Contents&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;├── build                         # Compiled source code
├── doc                           # Generated documentation.
└── src                           # Source files.
    └── DracoolaArt.Bot.Kartwars  # Main VS project.
        ├── lib                   # Bot&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kmataru/kartwars.io-bot" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;






&lt;h2&gt;
  
  
  🧐 Reverse Engineering the Game
&lt;/h2&gt;

&lt;p&gt;The first step in creating my bot was understanding how KartWars.io worked under the hood. The game communicated with the server using &lt;strong&gt;WebSockets&lt;/strong&gt; - a technology for real-time data exchange. &lt;/p&gt;

&lt;p&gt;Using the browser's developer tools, I tapped into and monitored WebSocket traffic and identified key messages that revealed the kart's position, velocity, nearby power-ups, and other players' movements. It was like peeking behind the curtain of the game mechanics - a fascinating insight into how the arena operated.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏎️ Teaching the Bot to Drive
&lt;/h2&gt;

&lt;p&gt;Armed with this information, I wrote a basic JavaScript to control the kart’s movement. Initially, it was clumsy - the kart zigzagged, fell out of the arena, and failed spectacularly. 🥲 &lt;/p&gt;

&lt;p&gt;I called that "AI", but we all know what it actually means. 🤣&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%2Fk39s0w5riep1avykeem2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk39s0w5riep1avykeem2.jpg" alt="Secret Behind AI" width="800" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I refined the logic, the bot grew smarter. It prioritized moving toward power-ups and clusters of food, avoided enemies, and steered away from collisions just in time. Watching it make strategic moves was incredibly rewarding.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎮 In-Game Power-Ups
&lt;/h2&gt;

&lt;p&gt;Power-ups were the heart of KartWars.io, making the gameplay unpredictable and thrilling.&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%2F5n8vewfyx0uj2eolk0b6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5n8vewfyx0uj2eolk0b6.jpg" alt="KartWars Power-Ups" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Programming the bot to use these effectively added layers of strategy to the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Debugging with Visual Cues
&lt;/h2&gt;

&lt;p&gt;To better understand the bot’s decisions, I added &lt;strong&gt;visual overlays&lt;/strong&gt; directly into the game. These overlays included lines for the bot’s current path, enemy trajectories, and avoidance zones. This real-time feedback made debugging much easier and helped fine-tune the bot’s logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎛️ Adding a Control Panel
&lt;/h2&gt;

&lt;p&gt;To dynamically adjust the bot’s behavior, I embedded a &lt;strong&gt;control panel&lt;/strong&gt; using &lt;a href="https://github.com/dataarts/dat.gui" rel="noopener noreferrer"&gt;dat.GUI&lt;/a&gt;. This lightweight library allowed me to modify parameters like speed, aggression, and strategy thresholds on the fly. It also enabled toggling strategies without editing the code, speeding up experimentation.&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%2Flcybyn5n6kwwt15svpme.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%2Flcybyn5n6kwwt15svpme.png" alt="Kartwars Bot Interface with dat.GUI" width="245" height="883"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Used Techniques
&lt;/h2&gt;

&lt;p&gt;Creating a bot capable of surviving and thriving in KartWars.io required several core techniques:&lt;/p&gt;

&lt;h3&gt;
  
  
  🛡️ Enemy Surrounding Detection
&lt;/h3&gt;

&lt;p&gt;The bot analyzed enemy positions and trajectories to detect when it was surrounded.&lt;br&gt;&lt;br&gt;
It calculated escape routes and accelerated toward safety, steering clear of threats.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛡️ Weapon-Based Enemy Avoidance
&lt;/h3&gt;

&lt;p&gt;By identifying enemies equipped with specific power-ups, the bot created &lt;strong&gt;avoidance zones&lt;/strong&gt; (polygons) around them. It avoided these zones unless it had a shield or a strong counterattack strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 Enemy Trajectory Prediction
&lt;/h3&gt;

&lt;p&gt;The bot predicted enemy movements to dodge attacks or intercept projectiles.&lt;br&gt;&lt;br&gt;
For offense, it calculated precise interception paths to maximize missile hits.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚔️ Dodge, Defend, Attack
&lt;/h2&gt;

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

&lt;p&gt;The bot’s ability to dodge, defend, and attack made it a formidable player. It activated shields under attack, fired missiles at vulnerable opponents, and evaded dangerous zones. With trajectory prediction and strategic power-up usage, it was able to outmaneuver human players frequently.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 The Joy of Watching It Work
&lt;/h2&gt;

&lt;p&gt;The most satisfying moment came when the bot began outperforming me. Watching it survive longer, climb the leaderboard, and execute strategies in real time was exhilarating. While it occasionally exhibited “bot-like” quirks, its ability to compete with real players made the effort worthwhile.&lt;/p&gt;




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

&lt;p&gt;Building this bot wasn’t just fun - it was an invaluable learning experience. From reverse-engineering WebSocket communications to implementing real-time decision-making, I gained skills in problem-solving, debugging, and AI logic.&lt;/p&gt;

&lt;p&gt;Though KartWars.io is no longer available, the lessons I learned continue to shape my projects. Whether it’s a game or a complex system at work, the thrill of breaking down problems and building innovative solutions remains unmatched.&lt;/p&gt;




&lt;h2&gt;
  
  
  📝 Closing Note
&lt;/h2&gt;

&lt;p&gt;In competitive games, we generally dislike other players cheating by using bots.&lt;br&gt;
That said, I have no excuse to offer in my defense - it's likely I ruined someone else's gameplay. 🙈&lt;/p&gt;




&lt;p&gt;If you’ve ever tinkered with bots or automated something just for the fun of it, share your story—I’d love to hear about your experiences!&lt;/p&gt;

</description>
      <category>automation</category>
      <category>opensource</category>
      <category>typescript</category>
      <category>programming</category>
    </item>
    <item>
      <title>🎯 The Great CMS Migration Challenge: Tackling Complexity with Ingenuity and Automation</title>
      <dc:creator>Adrian Paul Nutiu</dc:creator>
      <pubDate>Mon, 18 Nov 2024 19:58:02 +0000</pubDate>
      <link>https://dev.to/kmataru/the-journey-to-sitecore-cms-a-complex-content-migration-4kd4</link>
      <guid>https://dev.to/kmataru/the-journey-to-sitecore-cms-a-complex-content-migration-4kd4</guid>
      <description>&lt;h2&gt;
  
  
  📚 Intro
&lt;/h2&gt;

&lt;p&gt;As I mentioned in my first article, &lt;a href="https://dev.to/kmataru/nobody-dreamed-of-becoming-a-devops-engineer-33pl"&gt;🦸‍♂️ Nobody Dreamed of Becoming a DevOps Engineer&lt;/a&gt;, today I'm going to share with you just &lt;strong&gt;how lazy I am&lt;/strong&gt; - and how that trait turned into something remarkable.&lt;/p&gt;

&lt;p&gt;About more than ten years ago, at my first company, I found myself working on a project that involved migrating a massive live website into Sitecore CMS. The task was far from simple, and it quickly turned into a significant challenge with moments of trial and error.&lt;/p&gt;

&lt;p&gt;This is the story of how we navigated through a maze of technical hurdles, limited tools, and budget constraints to deliver a successful solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ How It Started: From Manual Labor to Automation
&lt;/h2&gt;

&lt;p&gt;Before diving into building a robust migration solution, my journey began with a simpler and, frankly, more exhausting task - &lt;strong&gt;manual content migration&lt;/strong&gt;. 😭&lt;/p&gt;

&lt;p&gt;Alongside my work on implementing the new website, I was also tasked with migrating content by hand. Day after day, I found myself copying and pasting text, images, and other assets. It didn't take long to realize that I despised this repetitive, draining work. 😨&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3ln0ju6nhbfqnidsktr.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%2Fu3ln0ju6nhbfqnidsktr.png" alt="Image description" width="225" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Determined to break free from this mundane cycle, I began experimenting with automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some might view it as laziness, but this laziness can evolve into a drive to envision automations.&lt;/strong&gt; 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  🧗 Challenges
&lt;/h2&gt;

&lt;p&gt;But first, let's see some of the challenges we faced.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 Challenge 1: The Encrypted Database
&lt;/h3&gt;

&lt;p&gt;One of our first challenges was dealing with an Adobe CMS database that had limited access and encrypted content. With no available documentation or Adobe CMS SDK to guide us, we had to gave up on doing any reverse-engineering to migrate content between CMS-es. 🤔&lt;/p&gt;

&lt;h3&gt;
  
  
  🕸️ Challenge 2: Static Crawling Is Not Enough
&lt;/h3&gt;

&lt;p&gt;The initial idea was to scrape the website statically, crawling through all available pages and extracting the content... using PHP. The programming language I mastered at that time.&lt;br&gt;
I can still hear my team leader's voice mocking the same words I'd been telling myself: &lt;em&gt;I can do it faster in PHP. Just wait and see.&lt;/em&gt; 🤣🤣&lt;br&gt;
(If you're reading this, I just want to tell "Thank you!" 🙇‍♂️)&lt;/p&gt;

&lt;p&gt;Well, as it often goes with the best-laid plans, it quickly became apparent that static crawling wasn't enough. While PHP could handle scraping the static content, it wasn't designed to capture dynamically loaded data - like images, videos, and other media fetched through JavaScript, Flash (&lt;a href="https://isflashdeadyet.com/" rel="noopener noreferrer"&gt;Is Flash Dead Yet? 😱&lt;/a&gt; &lt;em&gt;Yes, it is.&lt;/em&gt;) and other techniques. We were scratching the surface, but we needed something far more sophisticated to get the full picture of the website's content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First trial and error - accomplished!&lt;/strong&gt; 😅😅&lt;/p&gt;

&lt;p&gt;This was only the beginning of what would become a much larger and more intricate challenge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe0szty03nw44ju4mnhb6.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%2Fe0szty03nw44ju4mnhb6.png" alt="Tip of the Iceberg Crawler" width="500" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The good part in this small automation project is that it provided a bird's-eye view of the number of pages and assets we needed to migrate, helping us gauge the scope of the work.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Challenge 3: The Multilingual Nightmare
&lt;/h3&gt;

&lt;p&gt;The multilingual migration became challenging due to inconsistent content structures across languages. Variants often had missing, misaligned, or differently formatted content, requiring custom logic to ensure accurate mapping and maintain integrity across all languages.&lt;/p&gt;

&lt;p&gt;And personally, I don't know 30 languages to be able and tell for sure that I am copying the right Chinese content - for example - without passing it through Google Translate. 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Stepping Back: Designing the Solution
&lt;/h2&gt;

&lt;p&gt;While working in parallel to implement the core functionalities for the website using ASP.NET with the Sitecore SDK, creating a foundation for the new CMS-driven system I got to the realization that static crawling was inadequate, it was &lt;strong&gt;time to take a step back&lt;/strong&gt; and reconsider the approach. I needed to think through the requirements and architect a solution that would tackle the challenges of migrating dynamic content.&lt;br&gt;
This process began only in my mind - an outline of what the solution would look like, how the components might fit together, and what new hurdles we might encounter.&lt;/p&gt;

&lt;p&gt;Next came research, digging through resources, looking up technologies, and thinking about ways to stitch everything together. I also tested the field with my colleagues for each potential component and explored what might work, without telling them about the bigger picture. In those early stages, fear held me back from sharing it outright; I was unsure if my vision would work or be received well.&lt;/p&gt;

&lt;p&gt;So, I built an initial proof of concept (POC) to start small and show it in action. It wasn't fancy - just a simple setup that navigated a web page using a custom browser component built on Internet Explorer (yes, not even Chromium). This POC could highlight elements, extract content, and output the data to the console.&lt;/p&gt;

&lt;p&gt;Nevertheless the POC had success. And it was also the point when it clicked for everyone why I was asking all my question and test the field with them 🤯.&lt;/p&gt;

&lt;p&gt;It started to be a dual effort: building a migration solution and ensuring Sitecore integration worked seamlessly.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Building the Solution in &lt;code&gt;C#&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Codename: &lt;strong&gt;Octopussy&lt;/strong&gt;&lt;br&gt;
(Yes! Like the 007 movie with Roger Moore, from 1983 😅)&lt;/p&gt;

&lt;p&gt;To get the content migrated properly, I had to develop several custom components, many of them from scratch, all in C#. Each of these components played a crucial role in making sure the migration was as seamless as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Custom Browser for Navigation
&lt;/h3&gt;

&lt;p&gt;The heart of our solution was a custom browser, built to navigate the website. This browser allowed us to manually or automatically navigate through pages, ensuring that we could capture not just static content but also dynamically loaded elements like images, videos, and other media.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛡️ Reverse Proxy for Catching Dynamic Assets
&lt;/h3&gt;

&lt;p&gt;To capture dynamically loaded content like Flash assets, images, and videos, I used a custom reverse proxy in combination with &lt;strong&gt;Fiddler&lt;/strong&gt;, a web debugging tool.&lt;/p&gt;

&lt;p&gt;Fiddler helped us monitor HTTP/HTTPS traffic, revealing how assets were loaded asynchronously. The reverse proxy acted as an intermediary, ensuring that all dynamic content, not just static pages, was captured and migrated into Sitecore CMS. This approach ensured we didn't miss any assets and kept the integrity of the original site intact during migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌍 Translation with Google Translate API
&lt;/h3&gt;

&lt;p&gt;Given that the website was multilingual, one of the trivial but necessary components we built was a translation feature. I integrated the Google Translate API to automatically translate page titles and content across different languages. But here's the tricky part: the structure and content were not consistent across languages. So, I had to add a text similarity check to match the correct content items for each language variant. This way, I ensured the translated titles corresponded to the right content in each language.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Sitecore SDK Integration
&lt;/h3&gt;

&lt;p&gt;Once we had the content, the next challenge was pushing it into Sitecore CMS. Using the Sitecore SDK, I built a service that handled the loading and saving of content into the CMS database. This service also ensured that the content was correctly mapped to the relevant Sitecore templates, ensuring everything from text to media had the appropriate structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Dynamically Generated Assemblies
&lt;/h3&gt;

&lt;p&gt;To make the system flexible and avoid constant restarts during development, I implemented a mechanism for dynamically building and versioning assemblies on the fly. These assemblies were required for templates, which were strongly typed. This was a game changer as it allowed us to add new templates or modify existing ones without restarting the service, making the entire process much more efficient.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 XPath Rules for Content Extraction*
&lt;/h3&gt;

&lt;p&gt;Given the complexity of the site's structure, I couldn't simply rely on traditional scraping techniques. Instead, I used XPath-like rules to match specific elements on each page - whether they were articles, images, or media files - and map that content into Sitecore's CMS. This was crucial for ensuring that content was categorized and saved properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  💸 Why No Use of Expensive Tools?
&lt;/h2&gt;

&lt;p&gt;At the time, there were other solutions available—powerful, "enterprise-level" (question mark) tools designed specifically for content migration. But those tools came with a hefty price tag of around €30k per month.&lt;br&gt;
(Kapow! No! Really! That's how it's called. 😃)&lt;/p&gt;

&lt;p&gt;The client, on the other hand, was only willing to invest €30k for &lt;em&gt;the entire project migration&lt;/em&gt;. That's right, the budget for several months was the same as one month of using these premium tools. So, we had no choice but to roll up our sleeves and build our solution.&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%2Fimzqz296e4ka6zoc7wfi.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%2Fimzqz296e4ka6zoc7wfi.png" alt="One does not simply buy it for €30k" width="651" height="383"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 The Sitecore CMS: Why Sitecore?
&lt;/h2&gt;

&lt;p&gt;Sitecore, a powerful CMS platform, was not my decision but rather the result of a sales deal. Sitecore brought features that were essential for this project: multilingual support, robust templating, and an efficient publishing mechanism. Sitecore also allows organizations to customize their content based on language, which was critical for this project, given its global reach. We had to ensure all the content was migrated in multiple languages - a task made easier with Sitecore's multilingual capabilities.&lt;/p&gt;

&lt;p&gt;Another key feature was Sitecore's template system. This allowed us to define the structure of content upfront, ensuring consistency across different types of content like articles, news items, and images. The ability to create and publish content quickly, while ensuring it was structured correctly, was invaluable.&lt;/p&gt;




&lt;h2&gt;
  
  
  🙋‍♂️ Lessons Learned: Asking for Help
&lt;/h2&gt;

&lt;p&gt;One of the most important lessons I learned from this project wasn't technical. My team leader reminded me that I didn't have to do everything myself. There were moments where I felt overwhelmed by the complexity of the task, but knowing when to ask for help, and rely on others, was key. This mindset carried me through not just this project but many others down the line.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Rate of Success: Automation and Content Fillers
&lt;/h2&gt;

&lt;p&gt;In terms of the overall success rate, we achieved about 80% coverage through automation. The custom components I developed - such as the browser, reverse proxy, and integration with the Sitecore SDK - were effective at handling the bulk of the migration work. This meant that most of the content, including text, images, and media, was seamlessly transferred into the CMS.&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%2F3sraz93evynbphzavm7e.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sraz93evynbphzavm7e.gif" alt="Smooth" width="380" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, there was still about 20% of the content that required manual intervention, which we covered using content fillers. This portion of the work involved sections of the website where content structures were too varied or complex to automate efficiently. Rather than spending additional time creating overly elaborate logic for these edge cases, we opted for a more pragmatic approach. The content fillers allowed us to populate those areas without going too deep into custom code for content that was often inconsistent across languages and formats.&lt;/p&gt;

&lt;p&gt;This hybrid approach of automation and manual content filling struck the right balance, enabling us to meet the project's goals within the given time and budget.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏆 Conclusion: A Journey Worth Remembering
&lt;/h2&gt;

&lt;p&gt;Looking back, the migration project was challenging, full of unexpected roadblocks, but also incredibly rewarding. We built a custom solution from the ground up, integrated it with one of the most powerful CMS platforms available, and delivered a multilingual content migration that met the client's expectations - without breaking the bank.&lt;/p&gt;

&lt;p&gt;This project remains one of the most technically challenging I've worked on, but it's also one of the most satisfying. From reverse proxies to dynamic assembly generation, we navigated a maze of technical problems, learning a lot along the way. And most importantly, we came out the other side with a system that worked.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 *Confession
&lt;/h2&gt;

&lt;p&gt;The XPath rules weren't exactly XPath. 🙄 I used a custom syntax that resembled XPath, which worked for a while but became cumbersome over time. It was only months or years later that I realized using XPath would have been much better, especially if I had known about the &lt;a href="https://html-agility-pack.net/" rel="noopener noreferrer"&gt;&lt;strong&gt;HTML Agility Pack&lt;/strong&gt;&lt;/a&gt; and its ability to fix broken HTML, allowing XPath to function properly.&lt;/p&gt;

&lt;p&gt;Who knows... Having that in place might have significantly boosted the success rate, potentially raising it to 99%. Probably!&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%2Fl2gz4pr38c5j6rb7wv0f.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%2Fl2gz4pr38c5j6rb7wv0f.png" alt="Image description" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Even though Flash is no longer supported - and back then, it wasn't even on the deprecation radar - and the entire website has since been redesigned and rewritten, I'm still proud of what we accomplished. 💪&lt;/p&gt;

&lt;p&gt;I think that anyone who has tackled a major migration considers it a milestone in their career. 🤔&lt;/p&gt;




&lt;p&gt;Let me know in the comments if you've tackled any migration.&lt;br&gt;
How did it go? What tools did you use?&lt;/p&gt;

</description>
      <category>automation</category>
      <category>csharp</category>
      <category>migration</category>
      <category>cms</category>
    </item>
    <item>
      <title>🦸‍♂️ Nobody Dreamed of Becoming a DevOps Engineer</title>
      <dc:creator>Adrian Paul Nutiu</dc:creator>
      <pubDate>Fri, 08 Nov 2024 15:01:02 +0000</pubDate>
      <link>https://dev.to/kmataru/nobody-dreamed-of-becoming-a-devops-engineer-33pl</link>
      <guid>https://dev.to/kmataru/nobody-dreamed-of-becoming-a-devops-engineer-33pl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnzsewwh76e818d1tdob.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnzsewwh76e818d1tdob.jpg" alt="Cover" width="604" height="479"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  "Hello World" 👋
&lt;/h2&gt;

&lt;p&gt;Here we are, at the start of what I hope will be the first of many articles talking about my journey, not only as a DevOps engineer, but also as Developer.&lt;/p&gt;

&lt;p&gt;Like many others in this field, I never dreamed of becoming a DevOps Engineer (and a Technical Lead, on top of it, but I don't want to brag about that 😇), but the path here was inevitable, almost like solving a puzzle I didn't know I had been assembling all along. 🧩&lt;/p&gt;




&lt;h2&gt;
  
  
  Nobody Dreamed of Becoming a DevOps Engineer
&lt;/h2&gt;

&lt;p&gt;Let's be honest - &lt;strong&gt;nobody dreamed of becoming a DevOps engineer&lt;/strong&gt; when they were a child 💭.&lt;br&gt;
When I first began my journey in tech, DevOps wasn't even on my radar. My love for tech started when I learned my first "programming" language: &lt;strong&gt;HTML&lt;/strong&gt; (pun intended) 😅. At the time, it felt like programming, and the thrill of building my first web page was unmatched. As a kid, I was amazed about what can be rendered from a simple HTML and a bit of CSS 😮.&lt;br&gt;
But as I moved from static web pages to dynamic applications, things started to shift.&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%2F7aiaar48lac7twy2530o.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%2F7aiaar48lac7twy2530o.png" alt="HTML As Programming Language Imposter: https://www.reddit.com/r/ProgrammerHumor/comments/10f60am/html_is_a_programming_language_trust_me/" width="499" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I began learning backend development, starting with PHP, then expanding into more structured programming languages like Pascal, C++, C# (Pascal? I already feel like a fossil by just saying that word 😆).&lt;br&gt;
This opened doors to full-stack development, allowing me to work on both the frontend and backend of applications. But as my applications grew, so did the need to deploy them efficiently. That's when I stumbled into the world of pipelines, CI/CD, and cloud infrastructure management.&lt;/p&gt;

&lt;p&gt;Suddenly, managing deployments manually wasn't enough. I needed to automate processes, manage infrastructure effectively, and deliver code seamlessly. This realization pushed me toward DevOps - and once I discovered the power of automations, I was hooked to it. ⚙️💻☁️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbp9tcjon1xjvd7jiquji.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbp9tcjon1xjvd7jiquji.jpg" alt="Me and DevOps Blackhole: imgflip.com" width="666" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PS: &lt;strong&gt;C# is still my #1 programming language.&lt;/strong&gt; 💗&lt;br&gt;
Whenever I have some spare time I still play, experiment or implement something new with it. Why not!?? 🙂&lt;/p&gt;




&lt;h2&gt;
  
  
  Why DevOps? The Power of Automation
&lt;/h2&gt;

&lt;p&gt;For me, DevOps was all about &lt;strong&gt;automation&lt;/strong&gt;. ⚙️⚙️ I've never been a fan of &lt;strong&gt;ClickOps&lt;/strong&gt; - the process of manually managing infrastructure through web portals. Clicking through the Azure portal to configure resources felt repetitive and draining, not to mention prone to human error. Every task I repeated manually seemed like a waste of time and energy. That's when the allure of DevOps clicked.&lt;/p&gt;

&lt;p&gt;Automating infrastructure and deployments allowed me to focus on what really mattered - delivering value quickly and efficiently. DevOps gave me the tools to streamline repetitive tasks, reduce errors, and scale infrastructure effortlessly. Automation was, and still is, my main driver in this space. 🚀&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%2Ftjg4tqr0dvek1xfqv3ny.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%2Ftjg4tqr0dvek1xfqv3ny.png" alt="Automate Everything" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Avoid the trap of trying to automate every tiny detail, as it can lead to losing sight of what's truly important. Attempting to automate the last 20% of processes may consume 80% of your time and energy, potentially derailing your overall progress.&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%2Fmkx1dyqh1j5tgjitz6ax.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%2Fmkx1dyqh1j5tgjitz6ax.png" alt="To Automate Or Not To Automate" width="720" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PS: I'll tell you in another article about &lt;strong&gt;how lazy I am&lt;/strong&gt; and how that thing drove to build an entire ecosystem of applications and services to automate tasks, saving me &lt;strong&gt;1 MILION clicks&lt;/strong&gt; and likely an equal amount of Ctrl + C / Ctrl + V actions. 🥴😵&lt;/p&gt;

&lt;p&gt;Some of you might have already guest what this could be about, but &lt;strong&gt;Stay Tuned!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The DevOps Toolbelt: CLI, Scripting and Pipelines
&lt;/h2&gt;

&lt;p&gt;One of the most exciting aspects of being a DevOps engineer is the variety of tools at your disposal. Whether you're automating infrastructure, managing deployments, or integrating security into your pipelines, you need a robust toolbelt to get the job done.&lt;/p&gt;

&lt;h3&gt;
  
  
  CLI Tools
&lt;/h3&gt;

&lt;p&gt;As a DevOps engineer, you'll become best friends with command-line interfaces. From managing infrastructure with Terraform to interacting with cloud services through Azure CLI or AWS CLI and why not GitHub CLI, everything revolves around the command line. Automating these interactions is where the magic happens.&lt;/p&gt;

&lt;p&gt;Sometimes, to be honest, CLIs can feel like an uphill battle - they can be daunting foes, especially when you're learning their quirks. But hey! &lt;strong&gt;There's always room for improvement everywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Scripting
&lt;/h3&gt;

&lt;p&gt;Knowing how to script is the bedrock of DevOps. Whether it's PowerShell, Bash or Python (did I really said that!? Python… 😨), scripting gives you the freedom to customize and automate just about anything. Think about those repetitive tasks that slow down your day-to-day operations - scripting can automate them away. For example, using PowerShell to configure environments or Bash to manage server tasks saves you hours of manual work. It's not just a time-saver; scripting offers flexibility to solve unique problems that a simple GUI can't address. You'll soon realize that scripts aren't just for local tasks - they're a vital part of CI/CD pipelines as well.&lt;/p&gt;

&lt;p&gt;However, this doesn't mean you're limited just to scripting languages. For an instance, I'd like to see all my automations written in C# one day. Whether it's implementing functionalities in Terraform or CI/CD pipelines, you can use too C# for various tasks. There's a whole horizon.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Don't be afraid to use scripts in your CI/CD pipelines&lt;/strong&gt;; and I'm telling you this because I was... I really was "afraid" to use scripting for a reason I cannot remember.&lt;/p&gt;

&lt;p&gt;In fact, many aspects of continuous integration and delivery rely on scripting, from custom build steps to deployment automation. Tools like Jenkins, GitHub Actions, and Azure Pipelines allow you to embed your scripts directly into the pipeline or run them from separate files, giving you full control over the process. I suggest storing scripts in separate files to enhance testability, even within local development environments. If you're managing infrastructure, for instance, Terraform scripts can automatically provision resources as part of your deployment flow. With scripting, you can ensure consistency, automate rollbacks, and even integrate testing into every step of the pipeline. Once you get the hang of it, scripting in CI/CD becomes second nature, and the benefits in terms of reliability and speed are undeniable.&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%2Fi8qd1hxh2mxz0mdktu8h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8qd1hxh2mxz0mdktu8h.jpg" alt="https://imgflip.com/i/7oqe8u" width="675" height="499"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Automate Everything: NoOps
&lt;/h2&gt;

&lt;p&gt;"NoOps" - (not) just another buzzword.&lt;br&gt;
While still in its infancy, NoOps envisions a future where infrastructure management is fully automated - so much so that developers no longer need to worry about operations.&lt;/p&gt;

&lt;p&gt;I envision building our internal tools and core components in a way that developers would genuinely "love" to use: Pipeline Templates, Configurations as Code, Infrastructure as Code—you name it. I see this concept as similar to an SDK.&lt;/p&gt;

&lt;p&gt;While we aren't quite at NoOps yet, the concept illustrates just how far automation can go.&lt;/p&gt;

&lt;p&gt;And remember! GitOps goes hand in hand with NoOps.&lt;br&gt;
(Uuugh! Do I need to explain GitOps as well!?? 😩🙈)&lt;/p&gt;

&lt;p&gt;Ok! I'll be quick: GitOps - Make sure you keep everything in repository(es). 😇&lt;/p&gt;




&lt;h2&gt;
  
  
  Different Faces of DevOps Engineers
&lt;/h2&gt;

&lt;p&gt;Throughout my career, I've encountered many different types of DevOps engineers. Each comes from a unique background, and each has their own strengths and challenges. Let me introduce you to a few:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Ops-Heavy Engineer: Lacking the "Dev" in DevOps
&lt;/h3&gt;

&lt;p&gt;These engineers typically come from traditional IT operations. They are experts at managing servers, networks, and cloud resources but often rely on manual processes through GUIs and dashboards. They may be proficient at ClickOps but lack the coding skills needed to automate these processes. Their DevOps journey starts with learning scripting languages like PowerShell, Bash, or Python and mastering tools like Terraform or Ansible to automate their work.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Dev-Heavy Engineer: Experiencing Ops for the First Time
&lt;/h3&gt;

&lt;p&gt;On the other end of the spectrum, you'll find developers who are diving into the world of operations for the first time. They're skilled at writing clean code and building applications, but managing infrastructure, deploying applications, and troubleshooting cloud environments is new to them. Their challenge is learning how to integrate deployment pipelines and monitor infrastructure while maintaining the quality of their code.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Balanced DevOps Engineer
&lt;/h3&gt;

&lt;p&gt;The ideal DevOps engineer balances both development and operations&lt;br&gt;
(🤚 Yep! That's me 😁). These engineers can write scripts, manage infrastructure, automate processes, and troubleshoot issues in production. This type of engineer represents the essence of DevOps: combining the development skills to build software with the operational know-how to deploy and maintain it seamlessly.&lt;/p&gt;

&lt;p&gt;No matter where you start, each path is a valid entry point into the world of DevOps. Whether you're an ops-heavy engineer learning to code or a developer stepping into the world of infrastructure, there's room for everyone in this journey.&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%2Ftjsgmjj43ya1x69a5san.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%2Ftjsgmjj43ya1x69a5san.png" alt="DevOps Team Customers are Developers: https://www.reddit.com/r/ProgrammerHumor/comments/itqtiu/devops_harsh_reality/" width="700" height="1047"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started in DevOps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Learn Coding&lt;/strong&gt;: Pick up Python, Bash, or PowerShell to automate tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know the Cloud&lt;/strong&gt;: Familiarize yourself with AWS, Azure, and/or GCP basics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Master Git&lt;/strong&gt;: Understand version control—branching, merging, and pull requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Pipelines&lt;/strong&gt;: Automate testing, building, and deploying code.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code&lt;/strong&gt;: Use tools like Terraform to manage infrastructure via code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration&lt;/strong&gt;: Work closely with different teams for smooth delivery.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What to Expect from DevOps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automation Focus&lt;/strong&gt;: Replace manual tasks with scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always Learning&lt;/strong&gt;: New tools and tech appear fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem Solving&lt;/strong&gt;: Troubleshoot and scale infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teamwork&lt;/strong&gt;: Work with developers, testers, and IT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Ownership&lt;/strong&gt;: Oversee software delivery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Integrate security into workflows.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion: Starting Your DevOps Journey
&lt;/h2&gt;

&lt;p&gt;Whether you're an ops expert learning to code or a developer stepping into operations for the first time, the world of DevOps is vast and full of opportunities. The key is to embrace automation, continuously learn, and always be looking for ways to improve efficiency and scalability.&lt;br&gt;
Whether you're targeting Azure, AWS, Google Cloud, Alibaba Cloud or other cloud provider, the concepts are the same.&lt;/p&gt;




&lt;p&gt;This is just the beginning of my journey in writing articles, and there's much more to come. In future articles, I'll talk about different experiences I had along the way, dive deeper into specific tools, automations, and probably some other tips and tricks that can be used in the DevOps world. 🙏&lt;/p&gt;

&lt;p&gt;So, stay tuned - there's a lot more to explore! 👀&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Thanks to &lt;a class="mentioned-user" href="https://dev.to/koladev"&gt;@koladev&lt;/a&gt; for the nice article that kickstarted in me the whole idea of writing articles.&lt;br&gt;
🔗 &lt;a href="https://dev.to/koladev/how-to-build-your-online-presence-as-a-developer-5ig"&gt;How to Build Your Online Presence as a Developer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a class="mentioned-user" href="https://dev.to/birghi"&gt;@birghi&lt;/a&gt; for the persistence he showed by asking once in a while &lt;em&gt;Hey! Did you publish your article?&lt;/em&gt; 😇&lt;br&gt;
(Now it's my turn 😈)&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a class="mentioned-user" href="https://dev.to/dumebii"&gt;@dumebii&lt;/a&gt; for the nice article that pushed me to stop overthinking the writing of this article and just publish it 😉.&lt;br&gt;
🔗 &lt;a href="https://dev.to/dumebii/what-i-have-learned-so-far-in-technical-writing-3cj6"&gt;🚀 How to become a Technical Writer&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Your first article is probably the hardest article you'd write&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you enjoyed this article and want to stay updated with my journey and future posts, consider giving me a follow! I'd love to connect and keep exploring DevOps, automation, and more together. 😊🚀&lt;/p&gt;

</description>
      <category>devops</category>
      <category>career</category>
      <category>learning</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
