<?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: kuberdenis</title>
    <description>The latest articles on DEV Community by kuberdenis (@kubeden).</description>
    <link>https://dev.to/kubeden</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%2F421554%2F086f2f78-8387-480e-a476-b3b3363e261c.jpg</url>
      <title>DEV Community: kuberdenis</title>
      <link>https://dev.to/kubeden</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kubeden"/>
    <language>en</language>
    <item>
      <title>gctx: git auth manager</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Tue, 27 Jan 2026 13:42:39 +0000</pubDate>
      <link>https://dev.to/kubeden/gctx-git-auth-manager-17c1</link>
      <guid>https://dev.to/kubeden/gctx-git-auth-manager-17c1</guid>
      <description>&lt;p&gt;I created a kubectx-inspired git auth manager&lt;/p&gt;

&lt;p&gt;kubeden/gctx:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sets a global git identity&lt;/li&gt;
&lt;li&gt;rewrites origin to an ssh alias&lt;/li&gt;
&lt;li&gt;allows deterministic auth for multiple accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it at: &lt;a href="//github.com/kubeden/gctx"&gt;github.com/kubeden/gctx&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%2Fjpydnflgjc2guo7h5uv5.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%2Fjpydnflgjc2guo7h5uv5.gif" alt="https://raw.githubusercontent.com/kubeden/gctx/main/assets/demo.gif" width="1000" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>How to build a good container platform</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Mon, 24 Nov 2025 21:01:34 +0000</pubDate>
      <link>https://dev.to/kubeden/how-to-build-a-good-container-platform-gk7</link>
      <guid>https://dev.to/kubeden/how-to-build-a-good-container-platform-gk7</guid>
      <description>&lt;p&gt;How to build a good container platform&lt;/p&gt;

&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;p&gt;Platform Engineering is the act of designing, provisioning, and maintaining a platform.&lt;/p&gt;

&lt;p&gt;You provision resources.&lt;br&gt;
You configure resources.&lt;br&gt;
And you use your platform.&lt;/p&gt;

&lt;p&gt;It sounds easy but it's not.&lt;br&gt;
Most engineering teams fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blocks
&lt;/h2&gt;

&lt;p&gt;In order to build a good platform, you need to build logically.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Base (Cloud / On-Prem / Hybrid Cloud / Multi-Cloud)&lt;/li&gt;
&lt;li&gt;Application Engine [(k8s / vms / serverless) in our case k8s]&lt;/li&gt;
&lt;li&gt;Platform Components (monitoring, application, recovery, automation)&lt;/li&gt;
&lt;li&gt;Application Components (ci/cd, configuration repo)&lt;/li&gt;
&lt;li&gt;Subtleties (secrets management &amp;amp; rotation, states, processes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Organizations hire teams, often to do one thing. Which is wrong.&lt;br&gt;
How one team does something, is often not how the others will.&lt;/p&gt;

&lt;p&gt;Expertise is often different, which leads to "know-how drifts" and technical debt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standartization
&lt;/h2&gt;

&lt;p&gt;This is maybe the most important foundation block for a platform to thrive.&lt;/p&gt;

&lt;p&gt;Standartization is almost always ignored:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name suffixes &amp;amp; directory structures&lt;/li&gt;
&lt;li&gt;utility separation&lt;/li&gt;
&lt;li&gt;unified deployment methods&lt;/li&gt;
&lt;li&gt;documentation &amp;amp; knowledge transfers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the "atoms" in a good platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Name Suffixes &amp;amp; Variability
&lt;/h2&gt;

&lt;p&gt;Name suffixes are your map points.&lt;br&gt;
Directory structures are your streets.&lt;/p&gt;

&lt;p&gt;Every organization should have strictly defined name suffixes and directory structures that should be applied across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iac repositories&lt;/li&gt;
&lt;li&gt;application management repositories&lt;/li&gt;
&lt;li&gt;cloud resources&lt;/li&gt;
&lt;li&gt;secret namings&lt;/li&gt;
&lt;li&gt;service accounts&lt;/li&gt;
&lt;li&gt;and so on.. and so on..&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A good name suffix system includes 3 to 7 matching variables.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;customer&lt;/li&gt;
&lt;li&gt;region&lt;/li&gt;
&lt;li&gt;environment&lt;/li&gt;
&lt;li&gt;iteration&lt;/li&gt;
&lt;li&gt;type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continuing the example, this would translate to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;e.g. directory structure: ${customer}/${region}/${environment}/${type}-[${iteration}?]&lt;/li&gt;
&lt;li&gt;e.g. terraform resource: ${customer}-${region}-${environment}-${iteration}-${type}&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine this at scale.&lt;br&gt;
It is easy to navigate it now.&lt;br&gt;
It is easy to understand.&lt;/p&gt;

&lt;p&gt;It is.. nice to work with! :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Utility Separation
&lt;/h2&gt;

&lt;p&gt;Many organizations don't separate.&lt;/p&gt;

&lt;p&gt;They create a repository called &lt;code&gt;devops&lt;/code&gt; and they put everything inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;terraform&lt;/li&gt;
&lt;li&gt;bash scripts&lt;/li&gt;
&lt;li&gt;yaml&lt;/li&gt;
&lt;li&gt;helm&lt;/li&gt;
&lt;li&gt;kustomize&lt;/li&gt;
&lt;li&gt;ansible&lt;/li&gt;
&lt;li&gt;and god know what else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, you should be grouping logically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infrastructure provisioning: manage the lifecycle of your resources&lt;/li&gt;
&lt;li&gt;infrastructure configuration: manage the configuration on your "live" resources&lt;/li&gt;
&lt;li&gt;application deployment: application configuration&lt;/li&gt;
&lt;li&gt;application code: well... your application code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is an example of well-separated &amp;amp; logically-grouped repositories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infrastructure: terraform, bash (as few as possible)&lt;/li&gt;
&lt;li&gt;k8s-cluster-configuration: yaml, kustomize, helm, jsonnet&lt;/li&gt;
&lt;li&gt;[application]-k8s-configuration: standartized releases / deployments / libs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This way, you achieve the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a single place to provision / depracate infra&lt;/li&gt;
&lt;li&gt;a single place to provision / depracate platform components&lt;/li&gt;
&lt;li&gt;a single place to provision / depracate applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Platform Resources: Provisioning
&lt;/h2&gt;

&lt;p&gt;Regardless of the technology you choose, you should handle provisioning of resources as a standalone practice.&lt;/p&gt;

&lt;p&gt;Here is an exapmle of a good Terraform set-up:&lt;/p&gt;

&lt;p&gt;Repository: &lt;code&gt;infrastructure&lt;/code&gt;&lt;br&gt;
Directory structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modules/&lt;/li&gt;
&lt;li&gt;base/&lt;/li&gt;
&lt;li&gt;.ci(or .github, or whatever the standard is)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where in /modules, you treat it as "libs", a place where you manage the versioning of your modules (community or personal).&lt;br&gt;
Example continuation of modules can looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modules/

&lt;ul&gt;
&lt;li&gt;azure/&lt;/li&gt;
&lt;li&gt;azurerm/

&lt;ul&gt;
&lt;li&gt;key-vault/&lt;/li&gt;
&lt;li&gt;community/&lt;/li&gt;
&lt;li&gt;personal/&lt;/li&gt;
&lt;li&gt;acr/&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;/azuread

&lt;ul&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;/aws&lt;/li&gt;

&lt;li&gt;/control-tower

&lt;ul&gt;
&lt;li&gt;community/&lt;/li&gt;
&lt;li&gt;personal/&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;/rds

&lt;ul&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;/s3

&lt;ul&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;And in base, you call these modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;base/

&lt;ul&gt;
&lt;li&gt;[customer]/&lt;/li&gt;
&lt;li&gt;[ region ]/

&lt;ul&gt;
&lt;li&gt;[ environment]/&lt;/li&gt;
&lt;li&gt;common/

&lt;ul&gt;
&lt;li&gt;locals.tf&lt;/li&gt;
&lt;li&gt;provider.tf&lt;/li&gt;
&lt;li&gt;key-vault.tf&lt;/li&gt;
&lt;li&gt;acr.tf&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You never click in the cloud provider.&lt;br&gt;
But you also don't configure here.&lt;br&gt;
You do not "hack" yamls.&lt;br&gt;
You do not apply hard-to-figure-out scripts.&lt;/p&gt;

&lt;p&gt;You only spawn and delete. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform Components: Configuration
&lt;/h2&gt;

&lt;p&gt;In order to have a good platform, you need to be flexible, clear, and rock-solid in terms of its capabilities.&lt;/p&gt;

&lt;p&gt;One of the most hardened platforms I've ever built (and I built it 3 separate times) is as follows:&lt;/p&gt;

&lt;p&gt;Management:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ArgoCD: Management, IAM, GitOps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Routing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ingress-nginx: routing, one lb, reserve ips in your subnet, manage routing programmatically&lt;/li&gt;
&lt;li&gt;cert-manager: automated ssl&lt;/li&gt;
&lt;li&gt;external-dns: automated dns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secrets Management:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;external-secrets: vaults, stores, you name it&lt;/li&gt;
&lt;li&gt;sealed-secrets: plain-text secrets in your repo (for stuff like the initial argocd secret)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monitoring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;grafana-operator: well.. grafana :) graphs and stats&lt;/li&gt;
&lt;li&gt;prometheus: metrics&lt;/li&gt;
&lt;li&gt;blackbox-exporter: alerts&lt;/li&gt;
&lt;li&gt;thanos (if multi-cluster): consolidation of metrics&lt;/li&gt;
&lt;li&gt;eck: elk :)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;velero: backups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scaling &amp;amp; State:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reloader: re-apply configs&lt;/li&gt;
&lt;li&gt;keda: scale applications&lt;/li&gt;
&lt;li&gt;karpenter (if on AWS, Azure have it by default): scale nodes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this should be managed through a single ArgoCD application called "cluster-apps" or similar.&lt;/p&gt;

&lt;p&gt;Tools like Jsonnet and Kustomize are your best friends here.&lt;/p&gt;

&lt;p&gt;(read about the app-of-apps pattern too)&lt;br&gt;
((no i do not like applicationsets))&lt;/p&gt;

&lt;h2&gt;
  
  
  Application Configuration
&lt;/h2&gt;

&lt;p&gt;Your application configuration repositories should be standartized.&lt;/p&gt;

&lt;p&gt;A well-thought-of application configuration repository is no different than the infrastructure, or the platform repositories.&lt;/p&gt;

&lt;p&gt;You should again think in the following direction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;releases: packages&lt;/li&gt;
&lt;li&gt;libs: building blocks for /releases&lt;/li&gt;
&lt;li&gt;deployments: calling your packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You see, the same concept applies over and over again -- manageability, readibility, and standartization.&lt;/p&gt;

&lt;p&gt;I usually go for Jsonnet, but I wanted something simpler, so I went for Kustomize, only to find myself in a very thight situation, and ultimately decided upon with Helm.&lt;/p&gt;

&lt;p&gt;Jsonnet is awesome, but it often requires a lot of special expertise and in case your main engineer leaves, it is possible you're going to have problems finding adequate peresonel.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD
&lt;/h2&gt;

&lt;p&gt;Since we are mostly relying on GitOps for our platform, the CI/CDs worth mentioning are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infrastructure:

&lt;ul&gt;
&lt;li&gt;terraform plan/apply: one pipeline per resource type (e.g. ${customer}/${region}/${environment}/${logical-group}/${resource-type}-${iteration}/pipeline.yml&lt;/li&gt;
&lt;li&gt;pipeline-of-pipelines: a global pipeline to manage the update / management of the child pipelines&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;application:

&lt;ul&gt;
&lt;li&gt;build &amp;amp; test: well, build and test&lt;/li&gt;
&lt;li&gt;deploy: since we're relying on GitOps, our deploy is a single git line change :)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;k8s-cluster-configuration:

&lt;ul&gt;
&lt;li&gt;a pipeline to bootstrap the master argocd (optional, since you are &lt;em&gt;allowed&lt;/em&gt; to do this through Terraform the first time :))&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Notable mentions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kubent: kube no trouble&lt;/li&gt;
&lt;li&gt;opa policy-bound pipelines: hard, but very rewarding if done correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preview Environments
&lt;/h2&gt;

&lt;p&gt;Preview environments are environments that are automatically spun up.&lt;/p&gt;

&lt;p&gt;In our case, we do this through Pull Requests.&lt;/p&gt;

&lt;p&gt;On every pull request against a branch, a label kicks in, and ArgoCD (through ApplicationSets... &lt;em&gt;angry&lt;/em&gt;) creates a new application and automatically syncs it. After that, through the use of ASO (Azure Service Operator) we provision a database.&lt;/p&gt;

&lt;p&gt;Upon a pull request close, the application is automatically deleted, and with it, the resource managed through ASO, too.&lt;/p&gt;

&lt;p&gt;Two other possible ways to achieve this are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cnpg operator: it connects to a live database, dumps the database, and provisions it. Authentication happens through external secrets.&lt;/li&gt;
&lt;li&gt;PVC + Snapshot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With preview (or dynamic as I like to call them) environments, developers have instant access to a staging environment, automatically provisioned for them, with their pull request. Very powerful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subtleties
&lt;/h2&gt;

&lt;p&gt;Here are important subtleties many engineering teams, even though good, often fail to deliver on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ArgoCD configuration: should happen programmatically, this is a common chicken-egg problem, which I personally solve by having the entire ArgoCD helm locally, pointing to it from inside the ArgoCD, which I provision through CI/CD manually the first time. This applies to the master CI/CD. In a child-instances configuration, all child ArgoCDs are managed through the master. Through GIT. Then the rest, like projects, groups, roles, policies... all should happen in your k8s repository.&lt;/li&gt;
&lt;li&gt;Cluster Apps: I use the app-of-apps pattern, which I achieve with either Kustomize or Jsonnet. Kustomize is often easier to maintain. I do not use ApplicationSets because it is harder to apply my name suffix &amp;amp; variability philosophies there.&lt;/li&gt;
&lt;li&gt;State: Always remote&lt;/li&gt;
&lt;li&gt;IAM: Always in either Terraform or the k8s (for ArgoCD) repos. Always add to groups. Do not apply one-time assignments.&lt;/li&gt;
&lt;li&gt;Secrets: I always strive to use OIDC. Expired secrets suck and OIDC is an incredible technology that solves this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another important thing is expertise. I personally have been shooting educational videos of how our entire platform works, every couple of months. I have also made the following docs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required-tools.md: kubectx/kubens, az cli, tf cli, etc. etc.&lt;/li&gt;
&lt;li&gt;onboarding.md: here I explain the concept of variability, the variables for our organization, and link to a short video where I demo the concept by finding a resource in both Azure and in the Terraform repository, and make a small application configuration through the k8s repo, and an application repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those have proven to be very valuable as we onboarded 10+ people through them.&lt;/p&gt;

&lt;p&gt;So.. the conclusion is, "find someone who is willing to teach".&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Thank you for reading and I hope you learned something, got inspired, or fired up. Either way, I enjoyed writing this.&lt;/p&gt;




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

&lt;p&gt;out 🫡&lt;/p&gt;

</description>
      <category>argocd</category>
      <category>devops</category>
      <category>gitops</category>
    </item>
    <item>
      <title>Diffium found 4 great Golang contributors during Hacktoberfest!</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Sun, 05 Oct 2025 08:55:43 +0000</pubDate>
      <link>https://dev.to/kubeden/diffium-found-4-great-golang-contributors-during-hacktoberfest-2f94</link>
      <guid>https://dev.to/kubeden/diffium-found-4-great-golang-contributors-during-hacktoberfest-2f94</guid>
      <description>&lt;p&gt;Hey guys! Denis here.&lt;/p&gt;

&lt;p&gt;I am quickly passing by to thank you to the 4 maintainers that decided to put in the work and contribute to &lt;a href="https://github.com/interpretive-systems/diffium" rel="noopener noreferrer"&gt;Diffium&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Here is the list of those absolute chads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Udayan853" rel="noopener noreferrer"&gt;Udayan Kulkarni&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Terminal239" rel="noopener noreferrer"&gt;Affan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gd-arnold" rel="noopener noreferrer"&gt;Gyorgy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ravk1234" rel="noopener noreferrer"&gt;Ravi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;/ p.s. thank you for &lt;strong&gt;36 stars&lt;/strong&gt; :) /&lt;/p&gt;

&lt;p&gt;Anyway, so, if any of you reading this have considered jumping in the Golang arena, feel free to explore &lt;a href="https://github.com/interpretive-systems/diffium/issues" rel="noopener noreferrer"&gt;Diffium's issues board&lt;/a&gt; and start working on any of the open ones.&lt;/p&gt;

&lt;p&gt;Happy Hacking!&lt;/p&gt;

</description>
      <category>go</category>
      <category>discuss</category>
      <category>hacktoberfest</category>
      <category>tui</category>
    </item>
    <item>
      <title>Diffium: The git diff manager for ai-assisted programming</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Mon, 22 Sep 2025 10:36:31 +0000</pubDate>
      <link>https://dev.to/kubeden/diffium-the-git-diff-manager-for-ai-assisted-programming-38dj</link>
      <guid>https://dev.to/kubeden/diffium-the-git-diff-manager-for-ai-assisted-programming-38dj</guid>
      <description>&lt;p&gt;Hey all! How's everyone doing?&lt;/p&gt;

&lt;p&gt;Listen.. I decided I want to maintain a repository for the first time in my life for this year's #hacktoberfest, so I decided to scaffold an idea I had and make it accessible.&lt;/p&gt;

&lt;p&gt;So, if any of you friendly people feel like you wanna do some Go programming, feel free to check out &lt;code&gt;diffium&lt;/code&gt; -- &lt;a href="https://github.com/interpretive-systems/diffium" rel="noopener noreferrer"&gt;https://github.com/interpretive-systems/diffium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, who knows - maybe you'll get to start using the tool too haha.. I mean, honestly, I think it's quite nice and it's actually the first tool I build for myself that I actually use every day lol&lt;/p&gt;

</description>
      <category>git</category>
      <category>hacktoberfest</category>
      <category>go</category>
      <category>discuss</category>
    </item>
    <item>
      <title>onDocker[v0.1]: Personal Reflections</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Mon, 10 Feb 2025 14:46:55 +0000</pubDate>
      <link>https://dev.to/kubeden/ondockerv01-personal-reflections-5hnl</link>
      <guid>https://dev.to/kubeden/ondockerv01-personal-reflections-5hnl</guid>
      <description>&lt;p&gt;As with any big company / technology, there are mixed opinions about Docker on the internet. It is only natural for a product to be good in something and bad in something else. And it is natural for a product to have competitors doing something better.&lt;/p&gt;

&lt;p&gt;In this short post I would like to go over &lt;strong&gt;my views&lt;/strong&gt; about Docker as both a technology and a company. I will try to return my personal tape back to a point where I first got introduced to containers and give my best to put my thoughts into words.&lt;/p&gt;

&lt;p&gt;I think Docker is a good company and I think Docker can be a very good product.&lt;/p&gt;

&lt;p&gt;From an engineering perspective, I think when one gains enough relevant engineering experience, there are better solutions out there - for both container runtime and local development.&lt;/p&gt;

&lt;p&gt;And for the juniors out there, I consider Docker to be the best introduction to the world of containers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Series Preword
&lt;/h3&gt;

&lt;p&gt;Ok, so I got accepted as a Docker captain and it's been quite some time since I was supposed to make my first contribution so here we are.&lt;/p&gt;

&lt;p&gt;I want to turn this &lt;em&gt;onDocker&lt;/em&gt; thing into series and push out one article per month.&lt;/p&gt;

&lt;p&gt;I don't have any plans yet as to what exactly I am going to create content on but one thing I am certain of - I need to deliver. So if you (reader) ever think of something docker-related, please let me know and I'll probably include it in an episode of &lt;em&gt;onDocker&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Computers, Virtual Machines, and Containers
&lt;/h2&gt;

&lt;p&gt;When I was a teenager all my experience with virtualization was what you would typically expect from a teenager - VirtualBoxing Kali Linux, then VMWare-Workspacing Kali Linux, then USB-ing Kali Linux. Nothing Less, nothing more.&lt;/p&gt;

&lt;p&gt;At the time I did not really care about any of this, I was just happy I did &lt;em&gt;something&lt;/em&gt; techy.&lt;/p&gt;

&lt;p&gt;Then I became a SysAdmin and stuff changed... they changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Junior to Mid: I am scared of containers
&lt;/h2&gt;

&lt;p&gt;In my first job I was lucky enough to not be in a tech support role but directly jump in on actual system administration. The technologies I used varied a lot - different Linux distros, shady bash scripts, varnish, load balancing, redis sentinels, backup tools, and so on.&lt;/p&gt;

&lt;p&gt;The company I worked at had their entire customer setup in VMWare vSphere and I was basically introduced to cloud computing the oldschool way now look at as "self-hosting customer applications".&lt;/p&gt;

&lt;p&gt;Until one time I entered a server but there was no webserver installed on it. No Apache, no Nginx. There was no database either. Not even /var/&lt;a href="http://www" rel="noopener noreferrer"&gt;www&lt;/a&gt;. "Wait, what?!", I thought. And then a colleague told me to run &lt;code&gt;docker ps -a&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And this is when I got introduced to containers, one year into my tech career.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker Community &amp;amp; Developer Enablement
&lt;/h3&gt;

&lt;p&gt;So naturally I used my free time to learn more about Docker at home. Yes, not about containers, but about Docker.&lt;/p&gt;

&lt;p&gt;Since I already had some basic experience in web development, I first containerized a plain HTML website (lol).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I had a DigitalOcean droplet for remote development so no Docker Desktop yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I tried solving a more complex case, like trying to load-balance an OpenVPN connection inside Docker. My colleague decided to play a trick on me and gave me this task. Naively I jumped in and spent three days trying to figure it out but ultimately failed to create a real load balancing solution. I ended up with a half-baked emulation of availability consisting of one HAProxy container, and two OpenVPN-server containers. It looked like I was doing load balancing but there was no session persistence, no state, nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And here I have my first two positives about Docker:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strong Community:&lt;/strong&gt; I was able to get so far at the time in most parts because of the great community I found online and countless tutorials present.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Development Abilities:&lt;/strong&gt; I was able to use my own machine as a VPC (virtual private cloud) - I did not need multiple VMs, I could craft whatever architecture I wanted on one single VM.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Diving Deeper
&lt;/h3&gt;

&lt;p&gt;Docker then largely contributed to my success in getting my second job as a Jr. DevOps engineer only one year after starting my career. At the time (2019-2020), I believe containers as a technology was not so widely used, or at least not here in Bulgaria.&lt;/p&gt;

&lt;p&gt;Anyway, so I got my second job and had to dive deeper.&lt;/p&gt;

&lt;p&gt;I got to use different areas of Docker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Desktop&lt;/li&gt;
&lt;li&gt;Docker CLI&lt;/li&gt;
&lt;li&gt;Dockerfiles... &lt;strong&gt;a lot&lt;/strong&gt; of Dockerfiles&lt;/li&gt;
&lt;li&gt;Multi-Stage Dockerfiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And now that I reflect back on this, I again give my props to the company Docker for doing what they did to flood the internet with knowledge about containers (doesn't mater if from a marketing perspective, or for the love of the community) and making the technology easy-to-use from a consumer / developer perspective.&lt;/p&gt;

&lt;p&gt;I didn't even know but the Docker CLI was actually the first "abstraction" over the harder-to-grasp &lt;code&gt;linux-containers' lxc&lt;/code&gt;. I never personally worked with lxc but doing a little investigation writing this article, it does not look like a pleasant experience.&lt;/p&gt;

&lt;p&gt;And while some would argue abstractions are bad, I find them to be a good thing. They serve as auxiliary wheels, making what seem impossible, actually possible. Once one has to focus on the core, which would usually take years, then it is my opinion that it becomes important to context-switch, let the abstractions fade away, and do your own time in the trenches, crafting "your own abstractions". But this is a long topic. And it would require me to do a lot more deep thinking before reaching any definitive opinions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mid to Senior: I love containers
&lt;/h2&gt;

&lt;p&gt;Right. So in my 2nd - 3rd year in tech, I became more and more capable, started attending Hackathons, and started working with Kubernetes.&lt;/p&gt;

&lt;p&gt;Me and a very good friend of mine / hi, Bobby! / once attended a pretty huge prize-pool hackathon and actually managed to win 1st place by utilizing Docker Compose, Docker Volumes, and Docker Network. So again - doubling down on developer enablement. We crafted a Minecraft load-balancing solution on the Hackathon hosts' networking product.&lt;/p&gt;

&lt;p&gt;I also started using Compose more for local development at work when I did not have access to my customers' environments. Something that I would otherwise not thing of - to recreate the whole architecture locally so I can work on a feature / fix.&lt;/p&gt;

&lt;p&gt;I remember shortly before I would get hired as a senior, I read somewhere that Docker is "no longer free". What does that mean, I thought. I did not put much attention into this, but I remember this was one of the first times I thought, "Docker might not be as good as I thought". But now I completely justify their decision. I mean why would they not start taxing their enterprise customers? I would too. Hashicorp did too. As good as it sounds to live in a world where the only "currency" exchanged is the work we do together, our real world simply does not work that way. And when it comes to corporate-to-corporate, I would believe the only natural progression would be to start taxing your customers. After all, your customers are completely free to decide if they want to pick you over your competitors. And this applies to Docker too.&lt;/p&gt;

&lt;p&gt;More on this later but I look at Docker as I do on Ubuntu - Ubuntu is far from a perfect distribution but it is the one with the most tutorials online, it has the easiest hop-on onboarding experience, and it simply works even if it isn't the best in terms of performance and being overloaded with packages.&lt;/p&gt;

&lt;p&gt;What I am trying to say is developer experience &amp;amp; community is important. Especially for people not too keen on configuring &lt;em&gt;something&lt;/em&gt; from scratch (as with colima for e.g.).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oh, and one more Junior - Mid-Level positive:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Hub:&lt;/strong&gt; pretty cool and definitely goes right into my "developer enablement" section&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Senior to Beyond: Doubt Taking Shape
&lt;/h2&gt;

&lt;p&gt;So. Here I am writing this post, employed as a senior for 2 years already. What do I think about Docker now that I have spent so much time in tech? Well, that would depend on the quality or rather the activities I spent time on.&lt;/p&gt;

&lt;p&gt;Even in my senior years, I still notice the developer enablement is still there for me. Crafting Azure DevOps pipelines, there is the Docker@2 task making it easy to build &amp;amp; push containers. For development and test environments that does not have public internet access, Docker is still my go-to choice.&lt;/p&gt;

&lt;p&gt;The day I started doubting Docker came when I saw that my disk space severely degraded and I had a hard time understanding what is causing this case. It turned out that I had orphaned images, like.. ghost images and logs that took ~50GiB. I am not a Docker developer of course but I think a "system check" would not be too hard to implement.&lt;/p&gt;

&lt;p&gt;Another "panic moment" I remember was when Kubernetes ended support for Docker as a runtime. We did not get affected by it, except for the fact we had to plan carefully how we update our clusters. Anyway, k8s' post then really opened up a lot of doors for me in terms of knowledge expansion. I got to dive deeper into how Docker worked, gained more knowledge about Kubernetes and I was finally able to make the difference between a runtime and a container engine lol.&lt;/p&gt;

&lt;p&gt;Recently I once again received a slap in the face when my Docker engine stopped working on my Mac. I was essentially forced to install Podman (and later colima) which was not exactly expected or wanted. And I just got into Docker plugins!!&lt;/p&gt;

&lt;p&gt;Another thing I now don't feel so happily about is Docker Hub. I think it is too pricey and I like my container registry where my cloud is - on DO, AWS, or Azure. I also don't think it would make sense for enterprise because, again, it's far more convenient keeping the CR near the infra.&lt;/p&gt;

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

&lt;p&gt;Yeah, so after all I think Docker is superior when it comes to containers devex. And I think the team understands that, hence the plugins, articles, programs, etc.&lt;/p&gt;

&lt;p&gt;For production, I don't think there is any discussion to be had unless it shifts into a discussion of containers vs [ something ] since containers, wether built with Docker, Podman, colima or whatever are treated the same way inside a container orchestrator. It would be a discussion of packaging software.&lt;/p&gt;

&lt;p&gt;And one more thing. Writing this article made me realize companies actually posses enormous power over how the industry is being shaped. I think what Docker is doing is good and I think they play their part in the evolution of development quite well. Deep-knowers will go on and fix micro-areas of Docker that the company wouldn't prioritize to fix and this is a good thing. This is how progress is generated - through disagreement and agency. Through competitiveness.&lt;/p&gt;

&lt;p&gt;So as everything - apply layers to your thinking, be able to context-switch, and don't draw your opinions from a single source of truth, for there is no such thing.&lt;/p&gt;

&lt;p&gt;And that's it. That's the first article in the onDocker series. Again, since I don't have any strict plan on what I am going to write about, let me know if you have any preferences.&lt;/p&gt;

&lt;p&gt;Thank you for reading, friend.&lt;/p&gt;

&lt;p&gt;p.s. this article is a direct 1 : 1 of my thoughts : words. i did not apply any post-processing whatsoever so it might feel off. no idea. just oneshotted it. lmk how it felt. peace&lt;/p&gt;

</description>
      <category>docker</category>
      <category>writing</category>
      <category>containers</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a global chess board from scratch completely with Claude (NextJs &amp; Firebase)</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Wed, 31 Jul 2024 17:46:25 +0000</pubDate>
      <link>https://dev.to/kubeden/i-built-a-global-chess-board-from-scratch-completely-with-claude-nextjs-firebase-4cci</link>
      <guid>https://dev.to/kubeden/i-built-a-global-chess-board-from-scratch-completely-with-claude-nextjs-firebase-4cci</guid>
      <description>&lt;p&gt;First off, I am not a developer irl. I am a DevOps Engineer (senior btw). Regardless coding I have always been self taught and never had the attention span to complete a full course. I've always been building and never had the validation from a real developer if the things I do are bad or not.&lt;/p&gt;

&lt;p&gt;With that being said, I have no idea if the code in the app is good or not. What matters to me is that it works.&lt;/p&gt;

&lt;p&gt;This post is me sharing my fascination with the whole process and the result.&lt;/p&gt;

&lt;p&gt;Also, if you'd like to look at the code to evaluate it, here is the github repo - &lt;a href="https://github.com/kubeden/globchess-next-public" rel="noopener noreferrer"&gt;https://github.com/kubeden/globchess-next-public&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The app
&lt;/h2&gt;

&lt;p&gt;The app in question is &lt;a href="https://globchess.com" rel="noopener noreferrer"&gt;globchess.com&lt;/a&gt; - a global chess board anyone can make the next move on.&lt;/p&gt;

&lt;p&gt;Here are the technologies used in the app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firebase: client + firebaseAdmin&lt;/li&gt;
&lt;li&gt;NextJS: NextAuth.js, React&lt;/li&gt;
&lt;li&gt;Stripe: stripe api...&lt;/li&gt;
&lt;li&gt;Platform: ArgoCD, Kubernetes (ingress, deployment, service), Nginx Ingress Controller, Cert Manager, External DNS, Cloudflare, Github Actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are the concepts I learned while building the app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JS: Web Workers; Client Versioning&lt;/li&gt;
&lt;li&gt;NextJS / React: useState, useReducer, useRef, unsubscribe logic, React Portal, NextAuth.js, JWT, session token decoding&lt;/li&gt;
&lt;li&gt;Firebase: onSnapshot, collection, query, transaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I was astounded with the level of intelligence Claude displayed. It was able to implement any feature I wanted it to, or fix any bug that appeared along the way.&lt;/p&gt;

&lt;p&gt;Here is a list of all the features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;li&gt;Authentication (+session token decoding)&lt;/li&gt;
&lt;li&gt;Chess board render (with the Chessboard.js library)&lt;/li&gt;
&lt;li&gt;Make a move logic (with the Chess.js library)&lt;/li&gt;
&lt;li&gt;Board orientation swap logic&lt;/li&gt;
&lt;li&gt;Squares highlighting&lt;/li&gt;
&lt;li&gt;End game logic&lt;/li&gt;
&lt;li&gt;Save finished games&lt;/li&gt;
&lt;li&gt;Browse through past moves (both on live table and on past games)&lt;/li&gt;
&lt;li&gt;Lock &amp;amp; Unlock board logic&lt;/li&gt;
&lt;li&gt;Move Accuracy&lt;/li&gt;
&lt;li&gt;Rating&lt;/li&gt;
&lt;li&gt;Winning chance for both white &amp;amp; black&lt;/li&gt;
&lt;li&gt;Stripe webhooks logic&lt;/li&gt;
&lt;li&gt;Stripe to token after payment logic&lt;/li&gt;
&lt;li&gt;Sidebar components for Profile + default sidebar&lt;/li&gt;
&lt;li&gt;Live chat + system messages for game updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I probably forget something. I most certainly am.&lt;/p&gt;

&lt;h2&gt;
  
  
  The process
&lt;/h2&gt;

&lt;p&gt;The LLM code-in-english process is quite simple, very chaotic, and strangely... rewarding.&lt;/p&gt;

&lt;p&gt;When I started the project, I entered the same prompt I always start with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I want to create a [ thing ] with [ framework ]&lt;br&gt;
Imagine I am a junior developer and you are an experienced senior developer. Help me with EACH STEP of the development process.&lt;br&gt;
I want to start with the following:&lt;br&gt;
[ basic feature ]&lt;br&gt;
[ basic feature 2 ]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then I would refine with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[ x ] doesn't work, I want it to [ explain what I want it to look like ]&lt;br&gt;
&lt;em&gt;&amp;gt; paste of the entire component / page&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then... this same thing over and over again. This is really everything there is to it. I know this sounds underwhelming. It is.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;prompt --&amp;gt; copy/paste --&amp;gt; prompt --&amp;gt; copy/paste&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I would like to note down an important detail I found makes a huge difference coding with LLMs. I found it is very important to read through the responses, understand what the LLM is outputting, and if you don't understand a concept - either ask the LLM in a new tab or google it. Understanding what you are copy-pasting is crucial down the road. If you do not understand what you are pasting, at some point you would be unable to prompt anymore and your project will die.&lt;/p&gt;

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

&lt;p&gt;Yes, this post was short. Yes, it was also underwhelming. Just as underwhelming as coding with LLMs is. But you know what? You thought - hey, now I can build an app like this. And you will probably give it a go. And you will succeed.&lt;/p&gt;

&lt;p&gt;So in a sense this post provided just as much (little) value as an LLM would.&lt;/p&gt;

&lt;p&gt;Just like an LLM would...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/kubeden/juniors-are-doomed-and-this-is-good-llms-hype-copilots-and-the-turning-point-168b"&gt;Read Next: Juniors Are Doomed And This Is Good (LLMs Hype, Copilots, and The Turning Point)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>firebase</category>
    </item>
    <item>
      <title>Juniors Are Doomed And This Is Good (LLMs Hype, Copilots, and The Turning Point)</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Tue, 25 Jun 2024 19:53:22 +0000</pubDate>
      <link>https://dev.to/kubeden/juniors-are-doomed-and-this-is-good-llms-hype-copilots-and-the-turning-point-168b</link>
      <guid>https://dev.to/kubeden/juniors-are-doomed-and-this-is-good-llms-hype-copilots-and-the-turning-point-168b</guid>
      <description>&lt;p&gt;TL;DR&lt;br&gt;
get good or quit tech&lt;/p&gt;

&lt;h2&gt;
  
  
  Junior Engineering Is Hard
&lt;/h2&gt;

&lt;p&gt;A junior engineer is a person who is just starting in tech. Be it frontend, backend, or operations, it is a person just starting out. How can you distinguish a junior engineer from a mid-level or a senior? Quite easy, actually. Here are the top 5 signs to catch a junior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highly intensive desire to talk about tech&lt;/li&gt;
&lt;li&gt;Iressistable need to express an opinion&lt;/li&gt;
&lt;li&gt;Constant questions that can be googled&lt;/li&gt;
&lt;li&gt;Aggressive display of superiority over non-tech acquaintances&lt;/li&gt;
&lt;li&gt;Constant, loud, neverending, ear-numbing, complete and utter yapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ah, yes. The junior engineer, an alpha speciment indeed.&lt;/p&gt;

&lt;p&gt;But what exactly are junior engineers doing in their daily worklife? Well, this has been a hot topic since I have been in tech. Let's explore more by looking deeper into three categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend&lt;/li&gt;
&lt;li&gt;Backend&lt;/li&gt;
&lt;li&gt;Operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Requirements for a junior frontend engineer role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML/CSS: Proficiency in HTML5 and CSS3, understanding of web standards, and responsive design principles.&lt;/li&gt;
&lt;li&gt;JavaScript: Good knowledge of JavaScript (ES6+), including DOM manipulation and JavaScript frameworks/libraries such as React, Vue.js, or Angular.&lt;/li&gt;
&lt;li&gt;Version Control: Familiarity with Git and GitHub or other version control systems.&lt;/li&gt;
&lt;li&gt;Web Performance: Basic understanding of optimizing web applications for maximum speed and scalability.&lt;/li&gt;
&lt;li&gt;Cross-Browser Compatibility: Understanding of how to ensure consistency across various browsers and devices.&lt;/li&gt;
&lt;li&gt;Debugging: Basic skills in using browser developer tools to debug and profile applications.&lt;/li&gt;
&lt;li&gt;API Integration: Experience with RESTful services and APIs.&lt;/li&gt;
&lt;li&gt;Build Tools: Familiarity with build tools such as Webpack, npm, or Yarn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need to know HTML and CSS. You need to know JavaScript. You need to know your way around a library like React. GIT. SEO and PageSpeed Insights. Tailwind, Bootstrap, Flexbox, Grid. Be able to write unit tests. REST, CORS, data transformation. Builders.&lt;/p&gt;

&lt;p&gt;Often you will also be required to understand UI/UX principles. You will need to participate in scrum and agile rituals. You will also find yourself bashing your head against technologies like Docker, be required to at least once troubleshoot a CI/CD pipeline in Github Actions, Azure DevOps, or Gitlab, and worst of all - experience the absolute horror of &lt;em&gt;rebase and merge&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;All of this while nobody takes you seriously because you are &lt;em&gt;only doing frontend&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Takeaway: being a frontend sucks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Requirements for a junior backend engineer role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programming Languages: Proficiency in one or more backend programming languages such as Python, Java, Ruby, Node.js, or PHP.&lt;/li&gt;
&lt;li&gt;Database Management: Understanding of relational databases (e.g., MySQL, PostgreSQL) and non-relational databases (e.g., MongoDB, Redis).&lt;/li&gt;
&lt;li&gt;API Development: Experience in designing and developing RESTful APIs and/or GraphQL APIs.&lt;/li&gt;
&lt;li&gt;Version Control: Familiarity with Git and platforms like GitHub, GitLab, or Bitbucket.&lt;/li&gt;
&lt;li&gt;Server Management: Basic knowledge of server, networking, and hosting environments (e.g., Linux, Apache/Nginx).&lt;/li&gt;
&lt;li&gt;ORM Frameworks: Experience with Object-Relational Mapping frameworks like SQLAlchemy, Hibernate, or Django ORM.&lt;/li&gt;
&lt;li&gt;Security: Basic understanding of security principles and practices, including data protection and authentication.&lt;/li&gt;
&lt;li&gt;Testing: Familiarity with backend testing frameworks and tools, such as JUnit, pytest, or Mocha.&lt;/li&gt;
&lt;li&gt;Containerization: Basic knowledge of containerization tools like Docker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, you need to know a programming language. You need to be slightly &lt;em&gt;(he-he)&lt;/em&gt; proficient in SQL, and NoSQL. You need to understand and be able to apply the concept of caching. You need to understand the difference between REST and GraphQL. GIT. ORMs (what even is this). S E C U R I T Y. Testing. Docker. Kubernetes. Packer. And so on.&lt;/p&gt;

&lt;p&gt;Being a backend at least comes with bragging rights. You can also lie to your friends that you are a haxxer.&lt;/p&gt;

&lt;p&gt;Takeaway: being a backend still sucks but has its perks&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Opinion too long, too lazy to explain. &lt;a href="https://www.geeklore.io/articles/devops-by-kubeden-chapter-1-5WyKP" rel="noopener noreferrer"&gt;read this as a start, more incoming&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In short: operations guys are cool, aways have been, always will be.&lt;/p&gt;

&lt;p&gt;We went over the roles, now the question - &lt;strong&gt;will there be junior engineers in the future?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Let me elaborate.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Evolution, Dummy!"
&lt;/h2&gt;

&lt;p&gt;Junior engineering hasn't always been like this. A few years ago, you would have done perfectly fine with just a programming language and a library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Evolution happened, dummy.&lt;/p&gt;

&lt;p&gt;As with any other area of our lives, we evolved. A top performer will always inspire. Top performers through the years pushed harder and harder and left a mark with every push. We got inspired, and we tried to mirror their behavior, their achievements, and their success. Some of us could, others couldn't. But regardless of the outcome for each of us, we all collectively became better.&lt;/p&gt;

&lt;p&gt;We entered a "new normal" of knowing more, raising expectations, and accelerating our field.&lt;/p&gt;

&lt;p&gt;Sure, there has been a few cracks in the transmission like the mass layoffs after Covid but ultimately the machine is moving. And it's moving fast.&lt;/p&gt;

&lt;p&gt;Should you be scared? It depends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ain't No Rest For The Junior
&lt;/h2&gt;

&lt;p&gt;There will not be junior engineers as the ones we are used to observing and meeting around us today. The junior engineers of the future will be all-round experts. A guild of generalists, proficient in everything we are now struggling to get good at. Skill issues will not be in their dictionaries.&lt;/p&gt;

&lt;p&gt;Claude (the hottest new guy on the block) and ChatGPT (even though in it's depressive phase lately) are the tools defining the reality of software engineering that is to come. The epitome of acceleration. LLMs make learning faster, more action-based, and the dopamine reward of succeeding in doing simple tasks is hooking millions of people to code. This allows for a more rapid development of candidates, and will also cut the unworthy.&lt;/p&gt;

&lt;p&gt;If you can't do a task, you are not supposed to be in tech. If you are scared of LLMs &lt;em&gt;"taking your job"&lt;/em&gt;, you should find another job. The pressure will simply be too much for you to handle.&lt;/p&gt;

&lt;p&gt;With this, I close my article and express my greatest respects to three individuals - &lt;strong&gt;John McAfee, Terry A. Davis, and Alex Mahan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Peace.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Art of Overcomplication: A Story of a Finished Failure</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Mon, 04 Mar 2024 15:11:47 +0000</pubDate>
      <link>https://dev.to/kubeden/the-art-of-overcomplication-a-story-of-a-finished-failure-51g7</link>
      <guid>https://dev.to/kubeden/the-art-of-overcomplication-a-story-of-a-finished-failure-51g7</guid>
      <description>&lt;p&gt;It always starts with an idea. You test that idea. You see it is not impossible and you form a pact with yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I am not going to do anything more than just this one little thing. I will see how people react to it and based on the results, I will decide if it's worth the time. Just this one little thing. Just the MVP."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And you get to it. You start coding and you get through the POC phase, you prove to yourself that it works, and then you decide to focus on making your MVP.&lt;/p&gt;

&lt;p&gt;While you focus on your MVP you find little flaws in your initial plan and start increasing the value (only in your head) of your MVP little by little by adding more features. You lie to yourself that those are just tiny upgrades and all of a sudden it hits you...&lt;/p&gt;

&lt;p&gt;You lean back in your chair and take a look a good look at your screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It seems you now have an All-OS-Native, multi-cluster, microservice-themed, redundant and highly available, cloud native SaaS platform...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your side project is now a monster. And you, dear reader, are Frankenstein.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Side Projects Fail You
&lt;/h2&gt;

&lt;p&gt;I think coding products / apps / games / etc. alone doesn't allow you to invest too much. It is very important, in my opinion, to build one quick POC, polish your MVP, then ship as fast as possible. After your launch, it is best to take a look at the statistics and if your customers are positive, that might be an indication to continue spending time and resources on that project. Otherwise - onto the next one!&lt;/p&gt;

&lt;p&gt;However, it is often very hard to stay biased when you are overtaken by the euphoria and hype that rushes through you when you successfully implement a few features and prove to yourself you can do it. This is exactly what happened with me.&lt;/p&gt;

&lt;p&gt;In the next few chapters, I will briefly explain what happened with my side project (&lt;a href="https://globchess.com" rel="noopener noreferrer"&gt;globchess.com&lt;/a&gt;) and hopefully shed light on common traps that you might face with your side projects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Additional Resources
&lt;/h3&gt;

&lt;p&gt;More in-depth version of this article in the form of a story - &lt;a href=""&gt;soon / not finished yet&lt;/a&gt;&lt;br&gt;
Excalidraw diagram of my architecture and notes - &lt;a href="https://link.excalidraw.com/readonly/nCtlhLBy5cA6rlQVRJnV?darkMode=true" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;br&gt;
Github repository with the code for the project - &lt;a href="https://github.com/kubeden/globchess-public" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Bad Code &amp;amp; Its Consequences
&lt;/h2&gt;

&lt;p&gt;I started to write the code for &lt;a href="https://globchess.com" rel="noopener noreferrer"&gt;Globchess&lt;/a&gt; on a static index.html file with &lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer" rel="noopener noreferrer"&gt;Live Server&lt;/a&gt; to simply check if I am able to create a chessboard. Since it was simply a farfetched idea which I didn't believe I was capable of executing, I heavily relied on ChatGPT and found &lt;em&gt;chessboard.js&lt;/em&gt; and &lt;em&gt;chess.js&lt;/em&gt; - the two libraries which made the project possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  My First Mistake: No Modularity
&lt;/h3&gt;

&lt;p&gt;I coded the skeleton for my web app inside my &lt;em&gt;index.html&lt;/em&gt; and started coding in an &lt;em&gt;index.js&lt;/em&gt; file. This was my first mistake. I quickly put 300 lines of code (most of which copied from ChatGPT) inside my single JavaScript file and did not think about breaking it down into modules or using a framework like React / Next that would make my life much easier in the future. Instead, I was blinded by the success of coding feature after feature and soon I had an unmanageable 300+ lines of code in a single file.&lt;/p&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good for POC but I should have archived that and started all over with planning in mind&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  My Second Mistake: No Architecture
&lt;/h3&gt;

&lt;p&gt;While I still had about 200-300 lines of code in my single JavaScript file, I could have stopped for a while, do a little research on what type of database I should use, weight my options for frameworks and quickly refactor my code so that it is readable, manageable, and clean. But I did not do that.&lt;/p&gt;

&lt;p&gt;Instead, I asked ChatGPT to help me use Firebase Firestore and Firebase Authentication to code my auth and database logic. This turned my single &lt;em&gt;index.js&lt;/em&gt; file into 500-600+ lines of code now. Horrific.&lt;/p&gt;

&lt;p&gt;Not to mention "real-time database" would be a better solution for my needs. I could have also used socket.io.&lt;/p&gt;

&lt;p&gt;Oh, and I think it is good that I mention now that I am quite proficient in Laravel and have done all my other projects with it. Why did I even decide to go with Node.JS this time?&lt;/p&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No architecture in mind&lt;/li&gt;
&lt;li&gt;Blunt trial &amp;amp; errors are not good for your MVP phase (that's for the POC)&lt;/li&gt;
&lt;li&gt;Do your research and choose wisely&lt;/li&gt;
&lt;li&gt;If you are comfortable with a framework / library, why run from it?!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  My Third Mistake: No Security, No Backend Validation
&lt;/h3&gt;

&lt;p&gt;On top of doing it all in a single JS file, I did not think about backend for a single second. I was seeing the features I want to see work and I continued building on the frontend. No backend validation, no security considerations, nothing at all. Not even good routing. I was serving static html files.&lt;/p&gt;

&lt;p&gt;I didn't even thought it was possible for me to miss things like that but again - success makes you blind. And my blindfold was me succeeding to code features I thought I couldn't.&lt;/p&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Think about security&lt;/li&gt;
&lt;li&gt;Think about validation&lt;/li&gt;
&lt;li&gt;Your feature "working" with frontend-only code doesn't mean that's enough&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Consequences Of My Mistakes
&lt;/h3&gt;

&lt;p&gt;At some point I leaned back in my chair and realised I had a completely unmanageable, unreadable, and performance-low code in front of me that was already doomed.&lt;/p&gt;

&lt;p&gt;Implementing features started becoming way too hard because I couldn't easily read my code. I tried to break it down into modules and once I nearly succeeded in that, I realised I don't have any backend validation and my webapp is full of security flaws that the worst hacker could exploit. My average load speed was about 20 seconds which I don't even want to comment on.&lt;/p&gt;

&lt;p&gt;And at this moment, I gave up. I fixed a few bugs to make my project somewhat presentable and decided to call it a day.&lt;/p&gt;

&lt;p&gt;And that's the story of my finished failure.&lt;/p&gt;

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

&lt;p&gt;Building products alone could be euphoric in the beginning but staying blind due to your hype sets you up for a path of failure. Be biased, plan the execution of your projects and know when to stop with adding new features. Stay true to your MVP and ship fast.&lt;/p&gt;

&lt;p&gt;Keep to your metrics and continue doing what you like. I tried building an HR platform but I was not at all passionate about it so it took me 1 year to build it. &lt;a href="https://globchess.com" rel="noopener noreferrer"&gt;Globchess&lt;/a&gt; took me about 10 days and it is way more heavy in terms of features.&lt;/p&gt;

&lt;p&gt;If you read through the end, thank you for your time. I couldn't write about all the details along this project but I am working on a longer version of it. If you are interested, stay tuned.&lt;/p&gt;

&lt;p&gt;My name is Dennis (kubeden) and I blog about DevOps, my side projects, and more.&lt;/p&gt;

&lt;p&gt;If you feel like chatting, feel free to do so on &lt;a href="https://x.com/kubeden" rel="noopener noreferrer"&gt;x.com/kubeden&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;C'ya!&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>writing</category>
    </item>
    <item>
      <title>Introduction to Helm: Comparison to its less-scary cousin APT</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Fri, 09 Feb 2024 10:01:44 +0000</pubDate>
      <link>https://dev.to/kubeden/introduction-to-helm-comparison-to-its-less-scary-cousin-apt-37ff</link>
      <guid>https://dev.to/kubeden/introduction-to-helm-comparison-to-its-less-scary-cousin-apt-37ff</guid>
      <description>&lt;p&gt;In this short introductory blog post I share a short story of the time I started working with Helm and why it felt horrifying. After that, I jump in drawing the parallels between Helm and APT. I found this way to be quite easy for me to understand how Helm works so I hope it helps you too. Happy reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  The horrors of Helm
&lt;/h2&gt;

&lt;p&gt;When I first started working with Kubernetes I was overwhelmed by the "quietness" I felt working with the technology. Hare are the reasons why I felt this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No GUI, everything in the terminal&lt;/li&gt;
&lt;li&gt;A lot of resource types&lt;/li&gt;
&lt;li&gt;Long commands&lt;/li&gt;
&lt;li&gt;Having to &lt;code&gt;kubectl&lt;/code&gt; for every single little thing I want to check&lt;/li&gt;
&lt;li&gt;Nodes, Load Balancers, Networking... AGAIN IN THE TERMINAL!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generally I felt as if I was diving in &lt;em&gt;the deepest of waters&lt;/em&gt; without the correct equipement and that was horrifying. Unfortunately to me, I had to dive even deeper before getting equiped with tools like &lt;a href="https://argo-cd.readthedocs.io/en/stable/" rel="noopener noreferrer"&gt;ArgoCD&lt;/a&gt;, and &lt;a href="https://k8slens.dev/" rel="noopener noreferrer"&gt;k8slens&lt;/a&gt;. I had to start working with... &lt;a href="https://helm.sh/" rel="noopener noreferrer"&gt;&lt;strong&gt;HELM&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Imagine having to run HELM commands. 😂&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Installing tens of resources in a namespace. And all those are... CUSTOM... RESOURCE... TYPES (I never heard of).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Anyway. Let's try to mitigate this potential situation from your life by going over the basics.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Helm?
&lt;/h2&gt;

&lt;p&gt;Helm is a package manager for Kubernetes. This means you can install and uninstall software on your cluster with a few commands. Just like in Linux with &lt;code&gt;apt get&lt;/code&gt; with HELM the equivalent is &lt;code&gt;helm install&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use Helm?
&lt;/h2&gt;

&lt;p&gt;Well, you can either go with or without Helm. One thing is for certain though - once you start using it there is a high chance you will stick around.&lt;/p&gt;

&lt;p&gt;I personally use Helm for two purposes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installing common software on new clusters. For example Nginx Ingress Controller and Certbot.&lt;/li&gt;
&lt;li&gt;Templating Kubernetes packages on a base level for multi-cluster deployments.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Generally, I look at it as a good foundation material for my Kubernetes house. 😉&lt;/p&gt;

&lt;p&gt;With this, let's jump right into the technicalities and see how to actually use Helm.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use Helm?
&lt;/h2&gt;

&lt;p&gt;What I noticed with tool lately is that the learning curve is not that frightening. I usually find myself learning the basics and a few more advanced tricks and I feel comfortable working / playing around with the software. Same thing goes for Helm.&lt;/p&gt;

&lt;p&gt;First you need to install it - &lt;a href="https://helm.sh/docs/intro/install/" rel="noopener noreferrer"&gt;intallation guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you install Helm, there are basics commands you need to know and for that I am going to draw parallels between those basic Helm commands and how they compare to APT.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;helm repo add &amp;lt;software-name&amp;gt; &amp;lt;repository-url&amp;gt;&lt;/code&gt;: This command in Helm adds a new repository to your local Helm configuration. The equivalent APT command is &lt;code&gt;sudo add-apt-repository 'deb [arch=architecture] &amp;lt;repository-url&amp;gt; distribution component&lt;/code&gt;. In APT, this command adds a new repository to the list of sources APT will use to fetch packages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;helm search repo &amp;lt;software-name&amp;gt;&lt;/code&gt;: This Helm command searches for charts in a repository. The APT equivalent is &lt;code&gt;apt-cache search &amp;lt;package-name&amp;gt;&lt;/code&gt;. This command searches the package metadata in APT's repositories for a specific package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;helm repo update&lt;/code&gt;: This command updates the local Helm chart repository cache. The equivalent in APT is &lt;code&gt;sudo apt-get update&lt;/code&gt;, which updates the list of packages available from the repositories defined in &lt;em&gt;/etc/apt/sources.list&lt;/em&gt; and &lt;em&gt;/etc/apt/sources.list.d/&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;helm install &amp;lt;software-name&amp;gt;/&amp;lt;package-name&amp;gt;&lt;/code&gt;: This Helm command is used to install a chart. The APT equivalent is &lt;code&gt;sudo apt-get install &amp;lt;package-name&amp;gt;&lt;/code&gt;. This installs a new package from the repositories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;helm list&lt;/code&gt;: This command lists all the Helm releases in the cluster. The APT equivalent could be &lt;code&gt;dpkg --get-selections&lt;/code&gt;, which lists all the installed packages. However, it's important to note that APT doesn't manage deployments in the same way Helm does, so this is only a rough equivalent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;helm uninstall &amp;lt;package-name&amp;gt;&lt;/code&gt;: This removes a Helm release. The APT equivalent is &lt;code&gt;sudo apt-get remove &amp;lt;package-name&amp;gt;&lt;/code&gt;. This command removes a package installed via APT.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Stepping into the world of Kubernetes and Helm can feel like a daunting journey, especially when compared to the more familiar territory of traditional Linux package management with APT. But as we've seen, the basic concepts between Helm and APT aren't worlds apart. Helm, like APT, simplifies the process of managing software, but it does so in the context of Kubernetes - a much more dynamic and distributed environment.&lt;/p&gt;

&lt;p&gt;By understanding the parallels between these two tools, you can demystify the process of working with Kubernetes and begin to appreciate the power and flexibility that Helm offers. Whether you're managing a handful of microservices or orchestrating a large-scale, multi-cluster environment, Helm provides the tools you need to deploy, manage, and scale your applications with ease.&lt;/p&gt;

&lt;p&gt;Happy Helming! 🚀🛠️&lt;/p&gt;

&lt;p&gt;P.S.&lt;/p&gt;

&lt;p&gt;Thanks for reading, friend! I write about DevOps, Programming, and share my thoughts about the tech industry. Oh, and sometimes I share stories of how tech helps me in some life situations (e.g. &lt;a href="https://kubeden.io/blog/i-stopped-my-neighbor-s-wi-fi-access-here-is-why-and-how" rel="noopener noreferrer"&gt;I hacked my neighbour's Wi-Fi because he was blasting loud music&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://x.com/kubeden" rel="noopener noreferrer"&gt;X/Kubeden&lt;/a&gt; if you feel like chatting sometime.&lt;/p&gt;

&lt;p&gt;Closing GIF time &lt;em&gt;wink&lt;/em&gt;&lt;/p&gt;

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

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Jsonnet Adventures: Deploying our application to ArgoCD!</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Wed, 31 Jan 2024 19:09:22 +0000</pubDate>
      <link>https://dev.to/kubeden/jsonnet-adventures-deploying-our-application-to-argocd-4fk2</link>
      <guid>https://dev.to/kubeden/jsonnet-adventures-deploying-our-application-to-argocd-4fk2</guid>
      <description>&lt;p&gt;Hello fellow Kubernetes enthusiasts! In my previous blog posts we explored the basics of Jsonnet and how to use it to generate Kubernetes manifests. Now, I'm thrilled to finally get to the deployment of our production-ready, Jsonnet-templated application to ArgoCD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I am expecting you to have a basic understanding of ArgoCD and Kubernetes for this one. If you need a refresher, check out some resources online (before I create my own tutorials on these topics):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://argo-cd.readthedocs.io/en/stable/getting_started/" rel="noopener noreferrer"&gt;ArgoCD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes" rel="noopener noreferrer"&gt;Nginx Ingress Controller &amp;amp; Cert Manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before diving in, here's a quick overview of what you need to follow along:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read through &lt;a href="https://dev.to/kubeden/introduction-to-jsonnet-the-yamljson-templating-language-n5g"&gt;Jsonnet Introduction&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Read through &lt;a href="https://dev.to/kubeden/jsonnet-adventures-functions-conditionals-and-advanced-templates-4cd3"&gt;Jsonnet Adventures: Functions, Conditionals, and Advanced Templates&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Jsonnet Templates Repository: All the Jsonnet templates in those tutorials are stored in &lt;a href="https://github.com/kubeden/tutorials" rel="noopener noreferrer"&gt;kubeden/tutorials&lt;/a&gt; and you can use it as reference.&lt;/li&gt;
&lt;li&gt;Application Repository: The source code for the Simple Node App is in &lt;a href="https://github.com/kubeden/simple-nod-app" rel="noopener noreferrer"&gt;kubeden/simple-nod-app&lt;/a&gt;. Yes, that is a typo lol&lt;/li&gt;
&lt;li&gt;Docker Repository: The application's Docker image is available at &lt;a href="https://hub.docker.com/repository/docker/kuberdenis/simple-node-app/general" rel="noopener noreferrer"&gt;kuberdenis/simple-node-app&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ArgoCD and Jsonnet
&lt;/h2&gt;

&lt;p&gt;ArgoCD is a declarative, GitOps continuous delivery tool for Kubernetes. It allows us to deploy applications to Kubernetes using Git repositories as the source of truth. ArgoCD also supports Jsonnet, allowing us to deploy Jsonnet templates directly to Kubernetes.&lt;/p&gt;

&lt;p&gt;I repeat - ArgoCD support Jsonnet out of the box! This is a huge advantage, as we can leverage Jsonnet's power to create dynamic Kubernetes manifests, and deploy them using ArgoCD.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Deployment Process
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jsonnet Templates: Using Jsonnet, I generated Kubernetes manifests that are both dynamic and maintainable.&lt;/li&gt;
&lt;li&gt;ArgoCD Application: I created an application in ArgoCD pointing to the simple-node-app repository with a path to my &lt;em&gt;prd&lt;/em&gt; directory. With a simple sync of the application, ArgoCD deployed the application to my Kubernetes cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;The application, now live, dynamically greets users with the name provided in the YOUR_NAME environment variable.&lt;/p&gt;

&lt;p&gt;Here is how the application looks like in ArgoCD:&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%2Fxhusggi7t4vq4flcihzy.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%2Fxhusggi7t4vq4flcihzy.png" alt="image.png" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here is the application itself:&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%2Fhjykueodwpdoxoq9rsub.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%2Fhjykueodwpdoxoq9rsub.png" alt="image-1.png" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now if we update the YOUR_NAME environment variable in the parameters.libsonnet file, and sync the application in ArgoCD, we can see the application dynamically update:&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%2Fd4rvt5don8aukpr1a1rk.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%2Fd4rvt5don8aukpr1a1rk.png" alt="image-2.png" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This small, yet powerful demonstration shows the flexibility and power of combining Jsonnet for templating Kubernetes for ArgoCD.&lt;/p&gt;

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

&lt;p&gt;If you made it this far, thank you for reading! I hope you enjoyed this series and learned something new. I am planning to continue writing about Jsonnet and other Kubernetes-related topics, so stay tuned!&lt;/p&gt;

&lt;p&gt;For the next Jsonnet post, I am thinking of diving deep into combining multiple templating languages and use Jsonnet + Helm to deploy Grafana and Prometheus.&lt;/p&gt;

&lt;p&gt;Thank you for following along and if you feel like chatting, feel free to hit me up on &lt;a href="https://x.com/kubeden" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;And &lt;em&gt;drums&lt;/em&gt; ... closing gif!&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%2F0ofywoebtmtpalo41gym.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%2F0ofywoebtmtpalo41gym.gif" alt="gif-link" width="600" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Mastering the DevOps Interview: A Guide for Mid-Level Candidates</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Mon, 29 Jan 2024 14:46:36 +0000</pubDate>
      <link>https://dev.to/kubeden/mastering-the-devops-interview-a-guide-for-mid-level-candidates-546a</link>
      <guid>https://dev.to/kubeden/mastering-the-devops-interview-a-guide-for-mid-level-candidates-546a</guid>
      <description>&lt;p&gt;In the first part of the series &lt;a href="https://dev.to/kubeden/mastering-the-devops-interview-a-guide-for-junior-candidates-fe0"&gt;Mastering the DevOps Interview: A Guide for Junior Candidates&lt;/a&gt; I shared the observations I collected over 10 interviews of the DevOps interviews, focusing on the Junior role.&lt;/p&gt;

&lt;p&gt;In this part, I am going to share what I noticed overlaps in Mid-Level DevOps interviews, and hopefully help you feel more comfortable in your job hunt!&lt;/p&gt;

&lt;p&gt;I highly recommend to go over the first post in the series even if you are past Junior as there I have pointed out what the DevOps Interview Landscape looks like.&lt;/p&gt;

&lt;p&gt;This article will be shorter than the Junior-level one as I am solely going to focus on what the interview might look like, technologies, and example tasks you might be given.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interview Process
&lt;/h2&gt;

&lt;p&gt;For Mid-Levels, I noticed the interview process most often goes as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HR --&amp;gt; Technical Questions --&amp;gt; Technical Task --&amp;gt; Offer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The technical tasks are mostly of 'real-time' or 'homework' types.&lt;/p&gt;

&lt;p&gt;Two other possible interview processes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HR --&amp;gt; Technical Questions --&amp;gt; Offer&lt;/li&gt;
&lt;li&gt;HR --&amp;gt; Technical Knowledge Test --&amp;gt; Technical Questions --&amp;gt; Offer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some companies rely on questions/answers while others rely on technical tasks. If you ask me, you should search for technical tasks interviews as in those you can actually shine and don't fall victim to the "automated selection".&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Questions
&lt;/h2&gt;

&lt;p&gt;Strangely enough, the technical questions for mid-level roles do not differ too much from the junior ones. Although for mid-level roles how you answer matters more. While for a junior role you might say something along the lines of "Well, I am not quite sure but maybe ____," in mid-level interviews you are expected to be a way more confident and understand what the technical recruiter is talking about at all times. Sure, you might not be able to come up with a cloud architecture on the spot but you are expected to be able to swim freely in the DevOps world.&lt;/p&gt;

&lt;p&gt;With this in mind, here are some of the most common topics you could face in your Mid-Level DevOps interviews:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud - AWS (Services you should be able to converse about)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;S3, EFS, EBS&lt;/li&gt;
&lt;li&gt;ELB, NLB, ALB&lt;/li&gt;
&lt;li&gt;RDS, Aurora, DynamoDB&lt;/li&gt;
&lt;li&gt;ECS, EKS, Fargate, EC2&lt;/li&gt;
&lt;li&gt;Cloudfront, Route53&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Cloud - Azure (Services you should be able to converse about)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keyvault, Storage Account&lt;/li&gt;
&lt;li&gt;VNET, Subnets, NAT, Route Table, Load Balancer, DNS Zones&lt;/li&gt;
&lt;li&gt;Virtual Machine, AKS&lt;/li&gt;
&lt;li&gt;Managed Databases, Azure Databases&lt;/li&gt;
&lt;li&gt;Application Gateway&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Automation: Pipelines, IaC&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build Pipelines, Release Pipelines, Multi-stage pipelines&lt;/li&gt;
&lt;li&gt;Dockerfiles, Multi-stage container builds&lt;/li&gt;
&lt;li&gt;Terraform (init, plan, apply, workspaces, local vs remote state, aws state lock)&lt;/li&gt;
&lt;li&gt;Ansible Playbooks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Containerisation&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kubernetes (Deployments, Services, Ingresses, Secrets, Nodes, PVCs, Storage Classes, ConfigMaps, Policies)&lt;/li&gt;
&lt;li&gt;Nginx Ingress Controller, Cert-Manager, External Secrets, External-DNS, Grafana, Prometheus&lt;/li&gt;
&lt;li&gt;ArgoCD (Projects, Policies, Roles, Repositories, Clusters, app-of-apps)&lt;/li&gt;
&lt;li&gt;Microservice vs Monolith&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://kubeden.io/blog/25-linux-commands-everybody-should-know" rel="noopener noreferrer"&gt;Basic Commands (this is a link to my other blog post with 25 linux commands)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubeden.io/blog/top-10-linux-skills-for-landing-a-linux-job" rel="noopener noreferrer"&gt;Troubleshooting &amp;amp; Investigation Skills&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While this list might look too extensive, you will notice if you spent some even one year working as a junior (at a good and enabling place), you would have probably covered near to or even more than 80% of it.&lt;/p&gt;

&lt;p&gt;And with this out of the way, let's explore what technical tasks you might be given in your interview.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Tasks
&lt;/h2&gt;

&lt;p&gt;Similar to the technical questions, I noticed the technical tasks for Mid-Level DevOps do not differ that much than... wait for it... Senior level DevOps!&lt;/p&gt;

&lt;p&gt;The difference comes in the extent of the tasks. How deep you go and how much material you cover.&lt;/p&gt;

&lt;p&gt;Here is what you can expect as Mid-Level DevOps tasks in your interview:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Dockerfile for an application (Python, Javascript, Dotnet)&lt;/li&gt;
&lt;li&gt;Create a pipeline (Github / Gitlab / Azure DevOps) that builds the application and pushes it to a container registry&lt;/li&gt;
&lt;li&gt;Create a pipeline that automatically updates an image version in a GIT repository&lt;/li&gt;
&lt;li&gt;Deploy a simple application on Kubernetes (Deployment, Service)&lt;/li&gt;
&lt;li&gt;Install and configure Nginx Ingress Controller (Ingresses) and Cert-Manager (Certificates, Secrets)&lt;/li&gt;
&lt;li&gt;Create an Ansible Playbook that installs a LAMP stack on multiple hosts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Look! This is not that scary, right? I believe if you just do all of those tasks at home, and train so that you are able to replicate the results on any environment from scratch, you are a good mid-level DevOps engineer!&lt;/p&gt;

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

&lt;p&gt;While Mid-Level DevOps interviews might look scarier and cover a wider area of expertise, you are not expected to be a team leader, or a cloud architect. That means you are expected to have had experience in the topics from the "Technical Questions" section but not necessarily be a complete professional in all.&lt;/p&gt;

&lt;p&gt;Be realistic about your experience and think about where you came from. This will for sure help you stay grounded in your interviews and not panic too much. If you are applying for a Mid-Level DevOps role, you definitely did your time in front of the screen so be proud of that and go proof your next employer you are worth the time!&lt;/p&gt;

&lt;p&gt;I wish you luck with your interviews and as always - here is the closing GIF 😊&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%2Ffbs6vk44548g8e0aqa4a.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%2Ffbs6vk44548g8e0aqa4a.gif" alt="daily-gif" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>interview</category>
      <category>career</category>
    </item>
    <item>
      <title>Jsonnet Adventures: Functions, Conditionals, and Advanced Templates</title>
      <dc:creator>kuberdenis</dc:creator>
      <pubDate>Thu, 25 Jan 2024 16:48:53 +0000</pubDate>
      <link>https://dev.to/kubeden/jsonnet-adventures-functions-conditionals-and-advanced-templates-4cd3</link>
      <guid>https://dev.to/kubeden/jsonnet-adventures-functions-conditionals-and-advanced-templates-4cd3</guid>
      <description>&lt;p&gt;Welcome back to Jsonnet series! After covering the basics in &lt;a href="https://dev.to/kubeden/introduction-to-jsonnet-the-yamljson-templating-language-n5g"&gt;my previous post&lt;/a&gt;, it is time to delve into Jsonnet's more advanced features: functions, conditionals, advanced templating, and leveraging external libraries. &lt;/p&gt;

&lt;p&gt;I'll showcase these through an update to our Kubernetes deployment setup, gearing it towards a production-ready (well... almost) application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;kubectl cli: &lt;a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/" rel="noopener noreferrer"&gt;link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;jsonnet cli: &lt;a href="https://github.com/google/jsonnet" rel="noopener noreferrer"&gt;link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clone the Github repo: &lt;a href="https://github.com/kubeden/tutorials" rel="noopener noreferrer"&gt;link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;understand the Jsonnet basics: &lt;a href="https://dev.to/kubeden/introduction-to-jsonnet-the-yamljson-templating-language-n5g"&gt;first post&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Updated Files Overview
&lt;/h2&gt;

&lt;p&gt;Before diving into the specifics, let's take a look at the updated files in our project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;/libs/applications.libsonnet&lt;/em&gt;: A new addition that orchestrates different application setups.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;/libs/deployment.libsonnet&lt;/em&gt;: Enhanced to include environment variables in our production deployment.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;/libs/kube.libsonnet&lt;/em&gt;: An external library from Bitnami, facilitating Kubernetes deployments (we'll focus on the List() function).&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;/simple-node-app/prd/apps.jsonnet&lt;/em&gt;: Our main deployment file, now integrating the new kube.libsonnet and applications.libsonnet libraries.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;/simple-node-app/prd/parameters.libsonnet&lt;/em&gt;: Updated parameters, including environmental variables for our production deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The New applications.libsonnet
&lt;/h2&gt;

&lt;p&gt;We have added &lt;strong&gt;applications.libsonnet&lt;/strong&gt; to allow us to easily manage our code, and create different types of applications. Here's how it looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local deployment = import './deployment.libsonnet';
local service = import './service.libsonnet';
local ingress = import './ingress.libsonnet';

{
    basicApplication(p):: {
        [p.appName + '-deployment']: deployment.basicDeployment(p),
        [p.appName + '-service']: service.LoadBalancer(p),
    },

    productionApplication(p):: {
        [p.appName + '-deployment']: deployment.productionDeployment(p),
        [p.appName + '-service']: service.ClusterIP(p),
        [p.appName + '-ingress']: ingress.basicIngress(p),
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We define the application type we want, and set up the resources we want to deploy. This is a great way to organize our code and make it more maintainable. We also moved the imports to the top of this file rather than having them in each application-specific &lt;em&gt;apps.jsonnet&lt;/em&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enhanced productionDeployment in libs/deployment.libsonnet
&lt;/h2&gt;

&lt;p&gt;Jsonnet contains powerful pre-defined functions and libraries that we can leverage to enhance our code. In our updated &lt;strong&gt;libs/deployment.libsonnet&lt;/strong&gt;, the productionDeployment function utilizes the std.map() function to generate environment variables for our production deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;productionDeployment(p):: {
  // ... Other deployment details ...
  spec: {
    template: {
      spec: {
        containers: [
          {
            // ... Other container configurations ...
            env: if std.objectHas(p, 'env') then
              std.map(
                function(key) { name: key, value: std.toString(p.env[key]) },
                std.objectFields(p.env)
              ) 
              else [],
          }
        ],
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This addition dynamically generates the necessary environment variables for the container from the parameters file, and uses a conditional "if" to check if the parameters file contains an "env" object. If it does, it will generate the environment variables, otherwise it will generate an empty array.&lt;/p&gt;

&lt;p&gt;std.objectHas and std.map are only two of the many functions available in Jsonnet. You can find the full list &lt;a href="https://jsonnet.org/ref/stdlib.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The kube.libsonnet - List() Function
&lt;/h2&gt;

&lt;p&gt;I've also brought in &lt;strong&gt;kube.libsonnet&lt;/strong&gt; from the Bitnami kube-libsonnet library to further empower our Jsonnet scripts.&lt;/p&gt;

&lt;p&gt;In this tutorial, we are only using its List() function, which helps us bundle the resources we want to deploy into our (future) ArgoCD cluster.&lt;/p&gt;

&lt;p&gt;More about the kube.libsonnet library later in future posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrating Everything in /simple-node-app/prd/apps.jsonnet
&lt;/h2&gt;

&lt;p&gt;In &lt;em&gt;/simple-node-app/prd/apps.jsonnet&lt;/em&gt;, we now have a simplified deployment file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local applications = import '../../libs/applications.libsonnet';
local params = import 'parameters.libsonnet';
local kube = import '../../libs/kube.libsonnet';

kube.List() {
  items_: applications.productionApplication(params)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how we now import only the &lt;strong&gt;applications&lt;/strong&gt; rather than all the individual libraries. This way the deployment process becomes more readable and manageable using the kube.List() function. This will generate an ArgoCD-ready application manifest which we can deploy to our cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updated parameters.libsonnet
&lt;/h2&gt;

&lt;p&gt;Finally, the parameters.libsonnet has been updated to include environmental variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  appName: 'simple-node-app',
  environment: 'prd',
  replicas: 3,
  port: 8080,
  imageTag: 'latest',

  env: {
    NODE_ENV: 'production',
    PORT: 8080,
  },
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It doesn't matter if we want one, two, or 15 environment variables. Because of the std.map() function, our productionDeployment function will generate the necessary environment variables for our container.&lt;/p&gt;

&lt;p&gt;This is just how powerful Jsonnet really is.&lt;/p&gt;

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

&lt;p&gt;In this post, we updated our codebase using Jsonnet's more advanced feature and hopefully started feeling more creative! We also added an external library, and are getting ready to soon start deploying our applications to our Kubernetes cluster.&lt;/p&gt;

&lt;p&gt;In the next post, we will take a look at how ArgoCD handles Jsonnet, and how a simple ArgoCD application built with Jsonnet looks like.&lt;/p&gt;

&lt;p&gt;I hope you learned something and if you feel like chatting, connect with me on &lt;a href="https://x.com/kubeden" rel="noopener noreferrer"&gt;X&lt;/a&gt; or hit me up with a comment below!&lt;/p&gt;

&lt;p&gt;Closing GIF time!&lt;/p&gt;

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

</description>
      <category>jsonnet</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
