<?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: Kelvin Tay</title>
    <description>The latest articles on DEV Community by Kelvin Tay (@kelvintaywl).</description>
    <link>https://dev.to/kelvintaywl</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%2F127503%2F2c048c78-ff7a-471a-805c-65b73bc123a3.jpeg</url>
      <title>DEV Community: Kelvin Tay</title>
      <link>https://dev.to/kelvintaywl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kelvintaywl"/>
    <language>en</language>
    <item>
      <title>Penciling career goals for 2024</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Sat, 30 Dec 2023 23:15:07 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/penciling-career-goals-for-2024-2i7c</link>
      <guid>https://dev.to/kelvintaywl/penciling-career-goals-for-2024-2i7c</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N_K6lWdh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.snap.as/quHGE18w.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N_K6lWdh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.snap.as/quHGE18w.jpeg" alt="" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s the New Year’s Eve morning here in Tokyo, Japan. I’m typing this while cradling the baby at a Starbucks. Staring at the morning rain, I thought it’s a good time to reflect on 2023 while welcoming 2024.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gratitude
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Flexibility in a remote-first company. Laundry, accompanying the wife for her doctor appointments, etc. Thankful for the team’s understanding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3-month parental leave. It takes a village to raise a child. I think it would be too difficult for just one parent to navigate the first 3 months alone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Promotion. The new role encourages me to continue/start mentoring, glue work, technical leadership.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Failings
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Acted on things when I was not the best candidate to. I need to be be more aware of saying “no” to others and myself. Sometimes, you can become less helpful with your answers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Did not listen to the body. Our bodies will likely signal to us when we are overworked and stressed. Thankfully, it is better now, as I juggle priorities (family) but I wish I was better at this from the start.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Hey 2024
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Greater technical depth in the devops space. Metrics, k8s, networking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Champion others; would love to help others step up / promote.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;if you stumble into this post, I hope you and your family enjoy a good 2024 ahead!&lt;/p&gt;

&lt;p&gt;Best wishes!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reflections: From Software Engineering to Technical Support</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Thu, 19 Oct 2023 01:50:57 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/reflections-from-software-engineering-to-technical-support-4895</link>
      <guid>https://dev.to/kelvintaywl/reflections-from-software-engineering-to-technical-support-4895</guid>
      <description>&lt;p&gt;After 8+ years as a software engineer, I made a career switch in 2021. I joined CircleCI as a support engineer.&lt;/p&gt;

&lt;p&gt;As I enter my 3rd year with CircleCI, I thought it may be good to reflect on this career change so far.&lt;/p&gt;

&lt;p&gt;I noticed there are many literatures for support engineers looking to switch to software engineering / development. However, there aren't many opinions on the other direction.&lt;/p&gt;

&lt;p&gt;I hope this can be helpful for folks deliberating on similar career changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I switched
&lt;/h2&gt;

&lt;p&gt;I will be honest here. One of the major reason I switched was due to the salary compensation.&lt;/p&gt;

&lt;p&gt;I was drawing a comfortable salary at my previous job. However, my wife and I were hoping to start a family and consider purchasing a home. I was able to negotiate for a much-higher salary in this switch. (I know this is likely a rare case in many countries. For context, I am based in Tokyo, Japan.)&lt;/p&gt;

&lt;p&gt;I also wanted to try something (slightly) different.&lt;/p&gt;

&lt;p&gt;Covid-19 was much less of a pandemic by 2021, but it prompted me to relook at life and its (un)certainties. One of the interviewers asked me “where do you see yourself in 3 years?”. I took the opposite view and considered what happened in the last 2 years, from 2019 to 2021. So much has changed across societies as we battled Covid-19. For me, the unexpected Covid-19 did spur me to try something different. Life is too short to be doing the same thing for a lifetime.&lt;/p&gt;

&lt;p&gt;Critically, I also enjoyed using CircleCI as a customer. Don't get me wrong; My past adventures were with companies I did believe in. However, being a heavy and happy customer of CircleCI, I found it empowering to be in a position to share my enthusiasm with the customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  How has the journey been
&lt;/h2&gt;

&lt;p&gt;Fortunately, CircleCI is a product for software teams. This meant that, as a support engineer, I am tackling problems with another software engineer on the other side. I can empathize with the customer.&lt;/p&gt;

&lt;p&gt;I have found it really rewarding to be able to draw on my past experience, and share best practices and advice with the customers.&lt;/p&gt;

&lt;p&gt;Being part of the JAPAC (Japan + Asia Pacific) team, I also get opportunities to brush up my Japanese. To be honest, my wife and &lt;a href="https://www.deepl.com/ja/translator"&gt;Deepl&lt;/a&gt; &lt;strong&gt;helped me a lot&lt;/strong&gt;. I never aspire to reach near-native level for Japanese, but this has been a positive bonus.&lt;/p&gt;

&lt;p&gt;One of the major perks is also learning new technologies. I get to learn from both our engineers, and also our customers (e.g., their tech stack). Prior to this job, I've never dug deep with Packer, Nomad, Git LFS, and even Windows PowerShell to name a few. (You can find &lt;a href="https://github.com/orgs/kelvintaywl-cci/repositories"&gt;my public repos for testing here&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Would I recommend it?
&lt;/h2&gt;

&lt;p&gt;In my case, I've enjoyed the transition so far. Thankfully, I still get to utilize much of my software engineering knowledge to troubleshoot with customers.&lt;/p&gt;

&lt;p&gt;However, like any choice made, technical support as a career comes with challenges too.&lt;/p&gt;

&lt;p&gt;I think being able to empathize with customers is critical. Beyond the technical know-how, you'd need to know how to handle delicate communications at times (e.g., system-wide incident).&lt;/p&gt;

&lt;p&gt;If you are a software engineer reading this, I would encourage you to consider the switch if:&lt;/p&gt;

&lt;p&gt;(Traits)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You enjoy communicating with people as much as digging deep into code / configurations.&lt;/li&gt;
&lt;li&gt;You enjoy debugging, or chasing down root causes as much as implementing new features.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Strengths)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can empathize with users, and can advocate on their behalf. I think folks contributing to open-source projects may be good candidates.&lt;/li&gt;
&lt;li&gt;You are patient and can negotiate tough communications.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Motivations)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You would like to be closer to customers and the product.&lt;/li&gt;
&lt;li&gt;You enjoy opportunities in sharing best practices with customers.&lt;/li&gt;
&lt;li&gt;You believe in and enjoy the product.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are just my opinions based on my experience so far. Your mileage may vary.&lt;/p&gt;

&lt;p&gt;However, remember that switching does not mean you cannot go back. You can and should re-evaluate this decision along the way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Troubleshooting like a Doctor</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Thu, 27 Jul 2023 09:31:52 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/troubleshooting-like-a-doctor-4ac6</link>
      <guid>https://dev.to/kelvintaywl/troubleshooting-like-a-doctor-4ac6</guid>
      <description>&lt;p&gt;I had recently been introduced to &lt;a href="https://en.wikipedia.org/wiki/SOAP_note"&gt;the SOAP acronym&lt;/a&gt; used by medical professional by my brilliant manager.&lt;/p&gt;

&lt;p&gt;This was really interesting for me, given that I had no prior “professional” experience or course on advising and troubleshooting.&lt;/p&gt;

&lt;p&gt;We can draw many parallels indeed in technical support.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Well, it worked on my local machine.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“Our builds started failing from last Wednesday.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Obtaining and investigating build logs&lt;/li&gt;
&lt;li&gt;Extracting details from shared screenshots&lt;/li&gt;
&lt;li&gt;Verifying dependent external services are/were not down&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Failed builds relied on a remote service which had recently introduced breaking changes. Likely, the customer ran on their local machine before the change was introduced.&lt;/p&gt;

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

&lt;p&gt;Share assessment on remote service, and confirm if the customer's reruns on local machine fail now with the same error.&lt;/p&gt;

&lt;p&gt;Proceed to share workaround or solution if available.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I added CircleCI Runner support for Terraform provider</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Sun, 25 Jun 2023 02:40:19 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/how-i-added-circleci-runner-support-for-terraform-provider-1ii6</link>
      <guid>https://dev.to/kelvintaywl/how-i-added-circleci-runner-support-for-terraform-provider-1ii6</guid>
      <description>&lt;p&gt;I have released support for the CircleCI Runner resource-class and token in &lt;a href="https://registry.terraform.io/providers/kelvintaywl/circleci/latest"&gt;my &lt;strong&gt;unofficial&lt;/strong&gt; Terraform provider for CircleCI&lt;/a&gt;, as per v0.10.3.&lt;/p&gt;

&lt;p&gt;Developers can now manage the provisioning (and teardown) of &lt;a href="https://circleci.com/docs/runner-overview/"&gt;CircleCI self-hosted Runners&lt;/a&gt; within Terraform. You can explore an example &lt;a href="https://registry.terraform.io/providers/kelvintaywl/circleci/latest/docs/resources/runner_token"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This was a fun challenge, and I wanted to document my journey on this work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Investigation
&lt;/h2&gt;

&lt;p&gt;Unlike other resources, self-hosted runners are not manageable under &lt;a href="https://circleci.com/docs/api/v2/index.html"&gt;the official V2 API&lt;/a&gt;. Developers had to use &lt;a href="https://circleci-public.github.io/circleci-cli/circleci_runner.html"&gt;the CircleCI CLI&lt;/a&gt; to manage resource-classes and tokens instead.&lt;/p&gt;

&lt;p&gt;To port this into my Terraform provider, I was hoping there was a HTTP API available. This way, I can continue using my approach of abstracting the HTTP API away to &lt;a href="https://github.com/kelvintaywl/circleci-go-sdk"&gt;a Go SDK&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I assumed (wrongly) the CLI was using GraphQL under the hood for Runner operations, as with many others (e.g., for Orbs).&lt;/p&gt;

&lt;p&gt;Digging into the source-code, I then &lt;a href="https://github.com/kelvintaywl/terraform-provider-circleci/issues/35#issuecomment-1588587765"&gt;realized Runner resource-classes and tokens can be managed via a HTTP API&lt;/a&gt;; It was simply &lt;strong&gt;not publicly documented, yet&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Glue
&lt;/h2&gt;

&lt;p&gt;After the legwork mentioned above, I tested the HTTP APIs with &lt;a href="https://github.com/kelvintaywl/circleci-runner-go-sdk/blob/main/openapi.yaml"&gt;an OpenAPI (Swagger 2.0) document&lt;/a&gt;. This enabled me to generate &lt;a href="https://pkg.go.dev/github.com/kelvintaywl/circleci-runner-go-sdk"&gt;a Go SDK for Runner APIs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why are the Go SDKs separated? Wouldn't it be easier to keep it all in one?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That was something I mulled over for some time indeed. I have &lt;a href="https://github.com/kelvintaywl/circleci-runner-go-sdk#notes"&gt;documented my reasons&lt;/a&gt; for keeping them &lt;strong&gt;separate&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assembly
&lt;/h2&gt;

&lt;p&gt;With the Go SDK published, I “simply” have to then expose the Runner resource-classes and tokens in the Terraform provider codebase.&lt;/p&gt;

&lt;p&gt;The main work was done within &lt;a href="https://github.com/kelvintaywl/terraform-provider-circleci/pull/40"&gt;a pull request here&lt;/a&gt;. This also included acceptance tests, and examples.&lt;/p&gt;

&lt;p&gt;Ultimately, I noted self-hosted (machine) runners are also available for CircleCI's Server customers (i.e., self-hosted CircleCI). We would want to extend and ensure this addition can be used by platform teams using CircleCI Server.&lt;/p&gt;

&lt;p&gt;It turned out that the Runner API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is via &lt;a href="https://runner.circleci.com"&gt;https://runner.circleci.com&lt;/a&gt; for CircleCI Cloud&lt;/li&gt;
&lt;li&gt;is via &lt;a href="https://YOUR-SELF-HOSTED-DOMAIN"&gt;https://YOUR-SELF-HOSTED-DOMAIN&lt;/a&gt; for CircleCI Server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thankfully, this was &lt;a href="https://github.com/kelvintaywl/terraform-provider-circleci/pull/42"&gt;a quick patch&lt;/a&gt;. I was also able to verify this fix against my own CircleCI Server instance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I learnt
&lt;/h2&gt;

&lt;p&gt;This feature was satisfying for me to build, and I had many learning points along the journey.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Read the code: This feature would not have been completed if I did not dig deeper into the publicly-available source code 📖&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep trying: I am still learning (and failing) at Go. However, I think it is important to keep trying and learning. Keeping this source code open-sourced forces me to keep myself honest too about my lack of knowledge. For fellow engineers out there, let's keep at it! 🤓&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://write.as/kelvintaywl/tag:terraform"&gt;#terraform&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:circleci"&gt;#circleci&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:runner"&gt;#runner&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:go"&gt;#go&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Understanding the nuances of using a Docker image for your CI/CD job</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Sun, 26 Mar 2023 03:31:14 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/understanding-the-nuances-of-using-a-docker-image-for-your-cicd-job-12a8</link>
      <guid>https://dev.to/kelvintaywl/understanding-the-nuances-of-using-a-docker-image-for-your-cicd-job-12a8</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WjI0BIvs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.snap.as/4sO2a50m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WjI0BIvs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.snap.as/4sO2a50m.jpg" alt="" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many CI/CD providers, like &lt;a href="https://docs.github.com/en/actions/using-jobs/running-jobs-in-a-container"&gt;GitHub Actions&lt;/a&gt; and &lt;a href="https://circleci.com/docs/executor-intro/#docker"&gt;CircleCI&lt;/a&gt;, offer the options to run your CI/CD job using Docker images today.&lt;/p&gt;

&lt;p&gt;This is a useful feature since you can ensure your job is always running with the same &lt;strong&gt;pre-installed&lt;/strong&gt; dependencies. Teams may choose to bring their own Docker image, or use readily-available community images on Docker Hub for instance.&lt;/p&gt;

&lt;p&gt;One challenge is that the Docker image in use may not have been intended for use in CI/CD automation. Your team may thus find yourselves trying to debug puzzles like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'm pretty sure XYZ is installed. Why does the CI/CD job fail to find XYZ?&lt;/li&gt;
&lt;li&gt;Why is the FOOBAR environment variable different from what we have defined in the Docker image?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Docker image 101
&lt;/h2&gt;

&lt;p&gt;When you execute the &lt;code&gt;docker container run ...&lt;/code&gt; command, Docker will, by default, run a Docker container as a process based on the &lt;a href="https://docs.docker.com/engine/reference/builder/#entrypoint"&gt;ENTRYPOINT&lt;/a&gt; and &lt;a href="https://docs.docker.com/engine/reference/builder/#cmd"&gt;CMD&lt;/a&gt; definitions of your image. Docker will also load the environment variables declared in the &lt;a href="https://docs.docker.com/engine/reference/builder/#env"&gt;ENV&lt;/a&gt; definitions.&lt;/p&gt;

&lt;p&gt;Your ENTRYPOINT and CMD may be defined to run a long-running process (e.g., web application), or a short process (e.g., &lt;a href="https://github.com/wework/speccy#using-docker"&gt;running Speccy&lt;/a&gt; to validate your OpenAPI spec). This will depend on the intended use of your image.&lt;/p&gt;

&lt;p&gt;In addition, Docker images will be designed to come with just-enough tools to run its intended purpose. For example, &lt;a href="https://hub.docker.com/r/wework/speccy"&gt;the &lt;code&gt;wework/speccy&lt;/code&gt; image&lt;/a&gt; understandably &lt;strong&gt;does not come installed with &lt;code&gt;git&lt;/code&gt; or &lt;code&gt;curl&lt;/code&gt; (see &lt;a href="https://github.com/wework/speccy/blob/master/Dockerfile"&gt;Dockerfile&lt;/a&gt;)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Docker images may also be published for specific OS architectures only (e.g., &lt;code&gt;linux/amd64&lt;/code&gt;). You will want to confirm which OS and architecture the image can be run on.&lt;/p&gt;

&lt;p&gt;These are &lt;strong&gt;important contexts&lt;/strong&gt; , when designing CI/CD jobs using Docker images.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Docker images for CI/CD
&lt;/h2&gt;

&lt;p&gt;Generally, for CI/CD automation, your job will run a series of shell commands in the build environment.&lt;/p&gt;

&lt;p&gt;CI/CD providers like &lt;a href="https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#override-the-entrypoint-of-an-image"&gt;GitLab CI&lt;/a&gt; and &lt;a href="https://circleci.com/docs/custom-images/#adding-an-entrypoint"&gt;CircleCI&lt;/a&gt; achieve this by override your Docker image's entrypoint with&lt;code&gt;/bin/sh&lt;/code&gt; or &lt;code&gt;/bin/bash&lt;/code&gt; when executing them as containers.&lt;/p&gt;

&lt;p&gt;This is why you would want to use &lt;a href="https://github.com/GoogleContainerTools/kaniko#debug-image"&gt;the &lt;code&gt;-debug&lt;/code&gt; tag variant for Kaniko's Docker image&lt;/a&gt; when using in CircleCI for instance.&lt;/p&gt;

&lt;p&gt;Additionally, your Docker image may not come with the required tools for your CI/CD automation. For example, you would require &lt;code&gt;git&lt;/code&gt; in order to clone the repository as part of the CI/CD job steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debug Cheatsheet
&lt;/h2&gt;

&lt;p&gt;With this information in mind, here is a list of commands you can run &lt;strong&gt;locally&lt;/strong&gt; to debug your chosen Docker image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# inspect the "built-in" environment variables of an image
$ docker image inspect docker.io/amazon/aws-glue-libs:glue_libs_2.0.0_image_01 | jq ".[0].Config.Env"
[
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "LANG=en_US.UTF-8",
  "PYSPARK_PYTHON=python3",
  "SPARK_HOME=/home/glue_user/spark",
  "SPARK_CONF_DIR=/home/glue_user/spark/conf",
  "PYTHONPATH=/home/glue_user/aws-glue-libs/PyGlue.zip:/home/glue_user/spark/python/lib/py4j-0.10.7-src.zip:/home/glue_user/spark/python/",
  "PYSPARK_PYTHON_DRIVER=python3",
  "HADOOP_CONF_DIR=/home/glue_user/spark/conf"
]

# check the default entrypoint
$ docker image inspect docker.io/amazon/aws-glue-libs:glue_libs_2.0.0_image_01 | jq ".[0].Config.Entrypoint"
[
  "bash",
  "-lc"
]

# check the default cmd
$ docker image inspect docker.io/amazon/aws-glue-libs:glue_libs_2.0.0_image_01 | jq ".[0].Config.Cmd" 
[
  "pyspark"
]

# check tools installed
$ docker container run --rm docker.io/amazon/aws-glue-libs:glue_libs_2.0.0_image_01 "git --version"
...
git version 2.37.1

$ docker container run --rm docker.io/amazon/aws-glue-libs:glue_libs_2.0.0_image_01 "python --version"
...
Python 2.7.18

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

&lt;/div&gt;



&lt;p&gt;You can also find an example of this debugging for a CircleCI use-case here:&lt;a href="https://github.com/kelvintaywl-cci/docker-executor-explore/blob/main/.circleci/config.yml"&gt;https://github.com/kelvintaywl-cci/docker-executor-explore/blob/main/.circleci/config.yml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://write.as/kelvintaywl/tag:docker"&gt;#docker&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:cicd"&gt;#cicd&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:debug"&gt;#debug&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:cheatsheet"&gt;#cheatsheet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Prism: a useful developer tool for OpenAPI specs</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Sun, 12 Feb 2023 02:54:58 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/prism-a-useful-developer-tool-for-openapi-specs-hi2</link>
      <guid>https://dev.to/kelvintaywl/prism-a-useful-developer-tool-for-openapi-specs-hi2</guid>
      <description>&lt;p&gt;If your service exposes a HTTPS API, you may already be documenting it via &lt;a href="https://www.openapis.org/" rel="noopener noreferrer"&gt;an OpenAPI spec&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For instance, HSBC provides an OpenAPI spec &lt;em&gt;(read: Swagger)&lt;/em&gt; for their Personal Credit Cards API (&lt;a href="https://developer.hsbc.com.hk/#/documentation/personal-credit-cards-p2" rel="noopener noreferrer"&gt;example&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At a previous career with a company that integrates with financial institutions, we developed the culture to describe our APIs with OpenAPI 3.0.&lt;/p&gt;

&lt;p&gt;We had the case where our mobile frontend developers were building the UI features faster than our backend team can develop the API endpoints.&lt;/p&gt;

&lt;p&gt;Because we agreed on an API contact using OpenAPI 3.0, we were able to provide mock backend servers for them to test with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And we did it easily with &lt;a href="https://stoplight.io/open-source/prism" rel="noopener noreferrer"&gt;Stoplight's Prism&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All we needed was to provide our OpenAPI spec, and we had a mock backend ready for our mobile frontend. This unblocked both teams, and we always can rely and refer on our API contract as our agreement terms.&lt;/p&gt;

&lt;p&gt;Recently, I have been developing a Terraform Provider. Since the underlying cloud service has a HTTPS REST API, I was able to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Describe the underlying service's API &lt;a href="https://github.com/kelvintaywl/circleci-webhook-go-sdk/blob/main/openapi.yaml" rel="noopener noreferrer"&gt;as a OpenAPI spec&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Generate &lt;a href="https://pkg.go.dev/github.com/kelvintaywl/circleci-webhook-go-sdk" rel="noopener noreferrer"&gt;a Go client SDK&lt;/a&gt; based on this OPenAPI spec&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kelvintaywl/terraform-provider-circleci/commit/733d8316237f8e6714cf077192f0e28c52f19aa8" rel="noopener noreferrer"&gt;Mock the service with Prism for some quick acceptance tests&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Prism does more than mocking; You can also use it to inspect any discrepancies between your API implementation and the API spec. You can find out more on their GitHub page:&lt;a href="https://github.com/stoplightio/prism" rel="noopener noreferrer"&gt;https://github.com/stoplightio/prism&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Highly recommended for developers who use OpenAPI specs as contracts between components/services!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://write.as/kelvintaywl/tag:openapi" rel="noopener noreferrer"&gt;#openapi&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:mock" rel="noopener noreferrer"&gt;#mock&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:testing" rel="noopener noreferrer"&gt;#testing&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:API" rel="noopener noreferrer"&gt;#API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl" rel="noopener noreferrer"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Reflecting on HashiCorp Certified: Terraform Associate 002</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Sat, 21 Jan 2023 03:56:41 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/reflecting-on-hashicorp-certified-terraform-associate-002-4ojp</link>
      <guid>https://dev.to/kelvintaywl/reflecting-on-hashicorp-certified-terraform-associate-002-4ojp</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%2Feqpqkr897y92hcuj8gcm.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%2Feqpqkr897y92hcuj8gcm.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I passed the &lt;a href="https://developer.hashicorp.com/terraform/tutorials/certification" rel="noopener noreferrer"&gt;HashiCorp Certified: Terraform Associate 002&lt;/a&gt; exam on Jan 14th 2023. This was &lt;a href="https://www.credly.com/badges/559bdc0f-110e-4a6b-b8f4-547f2b1e0769" rel="noopener noreferrer"&gt;my first try&lt;/a&gt;, fortunately.&lt;/p&gt;

&lt;p&gt;In terms of my Terraform experience prior to the exams, I have yet to build any Terraform project at a production level. My recent exposure was mainly around trying to play around with &lt;a href="https://github.com/circleci-public/server-terraform" rel="noopener noreferrer"&gt;CircleCI’s Nomad client Terraform setup&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivations
&lt;/h2&gt;

&lt;p&gt;In my past career, I have used loads of AWS CloudFormation. _Yes, I have had some battle scars re: IaC._I always wanted to learn more about Terraform, given that it supports more than 1 cloud platform.&lt;/p&gt;

&lt;p&gt;In particular, I am interested in contributing a Terraform provider for CircleCI. This means creating a provider/plugin for creating CircleCI webhooks / scheduled pipelines via Terraform for example.&lt;/p&gt;

&lt;p&gt;This above may likely be a lofty ambition, but I thought I’d hedge this by also trying for the certification. Kill two birds in one quarter, as they say.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breakdown of Score
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Content Area&lt;/th&gt;
&lt;th&gt;Score (%)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Understand infrastructure as code (IaC) concepts&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Understand Terraform’s purpose (vs other IaC)&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Understand Terraform basics&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use the Terraform CLI (outside of core workflow)&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interact with Terraform modules&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Navigate Terraform Workflow&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implement and maintain state&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read, generate and modify configuration&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Understand Terraform Cloud and Enterprise capabilities&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Overall, I scored 84% (70% required).&lt;/p&gt;

&lt;h2&gt;
  
  
  Word of Advice
&lt;/h2&gt;

&lt;p&gt;If you are not using Terraform on a daily basis, practice Terraform CLI commands definitely!&lt;/p&gt;

&lt;p&gt;The exam has a few questions where they may test you to type the code / command required. See sample questions &lt;a href="https://developer.hashicorp.com/terraform/tutorials/certification/associate-questions" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I did have a “doh!” moment, since it wasn’t clear how “complete“ the answer should be.&lt;/p&gt;

&lt;p&gt;In particular, one question I got was: How would you reference the &lt;code&gt;vpc_id&lt;/code&gt; from this module in the code snippet?&lt;/p&gt;

&lt;p&gt;To reference the module output, it would be &lt;code&gt;module.aws_vpc.vpc_id&lt;/code&gt; for example. I think the full answer should be: &lt;code&gt;vpc_id = module.aws_vpc.vpc_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I had only typed &lt;code&gt;module.aws_vpc.vpc_id&lt;/code&gt; due to lack of clarity in the question. I think I likely lost points there!&lt;/p&gt;

&lt;p&gt;In terms of studying for it, I highly recommend the following Udemy course + practice exam!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/terraform-associate-practice-exam/" rel="noopener noreferrer"&gt;HashiCorp Certified: Terraform Associate Practice Exams 2023&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/terraform-certified/" rel="noopener noreferrer"&gt;More than Certified in Terraform&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lastly, there will be a newer exam version (003). I understand this update would remove older questions referring to already-deprecated commands (e.g., &lt;code&gt;taint&lt;/code&gt;). So if you can wait, do go for the 003 version instead!&lt;/p&gt;

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

&lt;p&gt;It was a fun exam to take, for sure!&lt;/p&gt;

&lt;p&gt;Given that it is really about a tool and its ecosystem, I’d highly encourage folks to try out Terraform while practicing for the exam.&lt;/p&gt;

&lt;p&gt;Your mileage on the Terraform tool will go a long way if you practice. This way, the exam questions will make way more sense too, as you practice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl" rel="noopener noreferrer"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
      <category>ai</category>
      <category>quantum</category>
      <category>discuss</category>
      <category>science</category>
    </item>
    <item>
      <title>empathy in these times</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Sun, 11 Dec 2022 06:58:41 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/empathy-in-these-times-580l</link>
      <guid>https://dev.to/kelvintaywl/empathy-in-these-times-580l</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%2Fhjc1a9bcjxx4exnbxjj9.jpeg" 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%2Fhjc1a9bcjxx4exnbxjj9.jpeg" alt="I am here in Taipei for 2 weeks" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I survived a &lt;a href="https://circleci.com/blog/ceo-jim-rose-email-to-circleci-employees/" rel="noopener noreferrer"&gt;17% reduction (layoff) at CircleCI last week&lt;/a&gt;. As soon as the CEO letter was published, many recruiters reached out.&lt;/p&gt;

&lt;p&gt;I can understand that. However, one email irked me bad, that I had to respond in curt.&lt;/p&gt;

&lt;p&gt;Without naming the company and the actual person, here is the snippet in raw form:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We learned about the CircleCI lay-offs on Linkedin via your post and [redacted]'s post. It looks like you are not affected, which is great news, but with such incident striking instability for a previously believed to be COVID-proof and recession-proof business, would it have spiked some of your interests to hear out available jobs in the market?&lt;/p&gt;

&lt;p&gt;So feel free to refer us [redacted], any other colleague you may know in CircleCI affected by the lay-offs, or anyone in Japan open for a job change in Software Engineering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In these times, we see many tech companies reducing their workforce. These are sudden events for people affected; No one wants to be in such positions. As a recruiter, &lt;em&gt;please please&lt;/em&gt; &lt;strong&gt;please&lt;/strong&gt; give your words some more thought before pressing “send”.&lt;/p&gt;

&lt;p&gt;If your team is looking for amazing engineers and people in Japan and beyond, please check out this link of our CircleCI alumni:&lt;a href="https://docs.google.com/spreadsheets/u/0/d/1A_1uk6qP_a0C2bwKcvV7G-meypWCgW-giK9O2UG8p_k/htmlview" rel="noopener noreferrer"&gt;https://docs.google.com/spreadsheets/u/0/d/1A_1uk6qP_a0C2bwKcvV7G-meypWCgW-giK9O2UG8p_k/htmlview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl" rel="noopener noreferrer"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
      <category>php</category>
      <category>backend</category>
    </item>
    <item>
      <title>Terraforming all the things</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Thu, 01 Dec 2022 12:08:27 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/terraforming-all-the-things-1on1</link>
      <guid>https://dev.to/kelvintaywl/terraforming-all-the-things-1on1</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%2Fzzrclybuchmzg5m48zwb.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%2Fzzrclybuchmzg5m48zwb.jpg" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Infrastructure as Code (IaC) is not a new concept for many. Prior to joining CircleCI, I have been wrangling with AWS CloudFormation long enough (2 years) to bear some of its pain-points.&lt;/p&gt;

&lt;p&gt;Since joining CircleCI, I have been exposed to Terraform through internal and external projects. So far, I really like that Terraform is not tied to specific cloud providers.&lt;/p&gt;

&lt;p&gt;I also like that any service can contribute a &lt;a href="https://registry.terraform.io/browse/providers" rel="noopener noreferrer"&gt;Terraform provider&lt;/a&gt;, thereby allowing users to define your service's resources as code. (Any cloud resource that exposes an CRUD / RESTful API is a good candidates for Terraform.)&lt;/p&gt;

&lt;p&gt;Recently, I have been wishing many things to be “Terraform-able”.&lt;/p&gt;

&lt;p&gt;As a support engineer, I use Zendesk daily. We create &lt;a href="https://support.zendesk.com/hc/en-us/articles/4408844187034#topic_zlk_nf1_dsb" rel="noopener noreferrer"&gt;Zendesk macros&lt;/a&gt; for canned responses in particular. Overtime, these macros grow, and it may be hard to manage or validate changes to our macros. I do wish Zendesk has a Terraform provider, so we can institute our macros in code.&lt;/p&gt;

&lt;p&gt;Recently, I also wished that I could Terraform my resume. Then, I snapped out of it.&lt;/p&gt;

&lt;p&gt;When you have a powerful hammer like Terraform, everything looks like nails.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://write.as/kelvintaywl/tag:terraform" rel="noopener noreferrer"&gt;#terraform&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:infrastructureascode" rel="noopener noreferrer"&gt;#infrastructureascode&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:declarative" rel="noopener noreferrer"&gt;#declarative&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl" rel="noopener noreferrer"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Do I continue working at my current job?</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Sun, 06 Nov 2022 02:56:35 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/do-i-continue-working-at-my-current-job-1bh9</link>
      <guid>https://dev.to/kelvintaywl/do-i-continue-working-at-my-current-job-1bh9</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1mmmNTCZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.snap.as/BMCyvKAB.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1mmmNTCZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.snap.as/BMCyvKAB.jpg" alt="man on bicycle" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Primer
&lt;/h2&gt;

&lt;p&gt;This post reflects my opinions on how I decide to continue staying at the current job, or consider switching.&lt;/p&gt;

&lt;p&gt;As such, this is &lt;strong&gt;purely&lt;/strong&gt; from my perspective. You would likely have your own principles and outlook on life and career; If anything, I hope this post motivates you to &lt;em&gt;reflect, rethink, and refresh&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For context, I work a full-time job with no additional side gigs or secondary jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Guiding Principles
&lt;/h2&gt;

&lt;p&gt;I use the following 3 factors to decide if I should continue with the current job:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compensation&lt;/li&gt;
&lt;li&gt;Job Fulfillment&lt;/li&gt;
&lt;li&gt;Work-Life Balance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You likely have your own principles, so you can replace this list with your own!&lt;/p&gt;

&lt;p&gt;I find that realistically, most jobs should hit 2 out of the 3 factors at least.&lt;/p&gt;

&lt;p&gt;When I find myself seriously contemplating a career change, I like to check this list. If I evaluate that the current opportunity hits only 1 factor (i.e., score of 1/3), it is a good indication that &lt;em&gt;I can do better&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Compensation
&lt;/h3&gt;

&lt;p&gt;Without mincing my words, this is just about the main salary. I am not swayed by or overly concerned with stock options, or welfare benefits.&lt;/p&gt;

&lt;p&gt;If you are working in Japan, I do encourage you to check out &lt;a href="https://opensalary.jp/"&gt;https://opensalary.jp/&lt;/a&gt;. This can help you get some idea about what others with similar tech backgrounds are compensated.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Job Fulfillment
&lt;/h3&gt;

&lt;p&gt;This can a tough one to judge or measure.&lt;/p&gt;

&lt;p&gt;You can go all logical about it (i.e., making a list of the positives and negatives).&lt;/p&gt;

&lt;p&gt;Or, you can also simply base it on gut feeling (e.g., say 8 out of 10).&lt;/p&gt;

&lt;p&gt;For me, I tend to find my answer by asking myself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If someone asks me what I do for a living, how enthusiastic would I be about introducing my current job?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In terms of motivation, I like to measure how I feel when I get up on a Monday morning.&lt;/p&gt;

&lt;p&gt;I like to point out that a good team can also offer so much support at work. Your motivation and fulfillment can be influenced greatly by your colleagues.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Work-Life Balance
&lt;/h3&gt;

&lt;p&gt;I like to think that we spend half of our waking hours &lt;em&gt;working&lt;/em&gt;. That is, 8 out of 16 hours trading our skills for compensation.&lt;/p&gt;

&lt;p&gt;You may work longer than 8 hours on some days due to circumstances. However, if overwork becomes consistent, something is not healthy with your current environment.&lt;/p&gt;

&lt;p&gt;Realistically, not everyone is built to grind out 10+ hours everyday. This is not sustainable for yourself, and your team.&lt;/p&gt;

&lt;p&gt;You also likely have aspirations outside of work, hobbies you want to pursue, and family members you want to spend time with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ensure that you have time for them.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;This is just a general guide, based on my perspectives.&lt;/p&gt;

&lt;p&gt;That said, I understand there can be inertia to “go”; It feels easier to stay, naturally. I have left out any discussions around evaluating the other opportunities available. This is purely focused on evaluating your current job.&lt;/p&gt;

&lt;p&gt;My (check)list describes my definition of what work means to me. I would encourage you to think what work means for you and your family.&lt;/p&gt;

&lt;p&gt;Happy to connect, and talk about this over coffee if you are in Tokyo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://write.as/kelvintaywl/tag:career"&gt;#career&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:motivation"&gt;#motivation&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:principles"&gt;#principles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>How-to: encourage the read to click on links</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Sun, 16 Oct 2022 03:30:27 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/how-to-encourage-the-read-to-click-on-links-45go</link>
      <guid>https://dev.to/kelvintaywl/how-to-encourage-the-read-to-click-on-links-45go</guid>
      <description>&lt;p&gt;We communicate to our readers in documentations, responses, and also comments. Today's communication tools allows us to include links easily in many ways.&lt;/p&gt;

&lt;p&gt;This sentence &lt;a href="https://www.w3.org/DesignIssues/LinkMyths.html"&gt;includes a link within itself&lt;/a&gt;, but does not stop you from reading the entire message.&lt;/p&gt;

&lt;p&gt;I find such links useful when the linked article is &lt;strong&gt;supplementary&lt;/strong&gt; to your message.&lt;/p&gt;

&lt;p&gt;In situations where I want to direct the reader to click on the link explicitly, I find it best to simply show them raw below:&lt;a href="https://www.w3.org/DesignIssues/LinkMyths.html"&gt;https://www.w3.org/DesignIssues/LinkMyths.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Personally, I find that showing the link raw (as-is) at the end helps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;draw attention, especially if the main point is about the linked article&lt;/li&gt;
&lt;li&gt;to allow readers to inspect the link URL, which can help in credibility too&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to: Create Sequential Workflows in CircleCI pipeline</title>
      <dc:creator>Kelvin Tay</dc:creator>
      <pubDate>Thu, 29 Sep 2022 14:03:03 +0000</pubDate>
      <link>https://dev.to/kelvintaywl/how-to-create-sequential-workflows-in-circleci-pipeline-2dcd</link>
      <guid>https://dev.to/kelvintaywl/how-to-create-sequential-workflows-in-circleci-pipeline-2dcd</guid>
      <description>&lt;h2&gt;
  
  
  Preface
&lt;/h2&gt;

&lt;p&gt;In a CircleCI &lt;a href="https://circleci.com/docs/glossary#pipeline"&gt;pipeline&lt;/a&gt;, &lt;a href="https://circleci.com/docs/glossary#workflow"&gt;workflows&lt;/a&gt; run independent of one another. As such, there is no built-in feature to ensure workflow B runs after workflow A.&lt;/p&gt;

&lt;p&gt;However, you can still achieve ordering, through some trickery.&lt;/p&gt;

&lt;h2&gt;
  
  
  How
&lt;/h2&gt;

&lt;p&gt;To achieve ordering, we simply set &lt;a href="https://circleci.com/docs/sample-config#approval-job"&gt;an approval job&lt;/a&gt; as &lt;strong&gt;the first job&lt;/strong&gt; for workflow B.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# contrived snippet of a .circleci/config.yaml

workflows:
  aaa:
    jobs:
      - one
      - two
  bbb:
    jobs:
      - start:
          type: approval
      - next:
          requires:
            - start

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

&lt;/div&gt;



&lt;p&gt;Subsequent jobs in workflow B will only run when the approval job is approved. As such, you can “force” a wait, and only approve this job when workflow A is completed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; that this requires manual intervention, of course.&lt;/p&gt;

&lt;p&gt;However, a benefit in this approach is that your team can take the time to confirm the outcomes of workflow A. For example, workflow A has deployed some infrastructure changes (e.g., &lt;code&gt;terraform apply&lt;/code&gt;), and you prefer inspecting these changes before running workflow B.&lt;/p&gt;

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

&lt;p&gt;You can automate this approval, at the end of workflow A, via &lt;a href="https://circleci.com/docs/api/v2/index.html#operation/approvePendingApprovalJobById"&gt;the &lt;em&gt;Approve a job&lt;/em&gt; API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Specifically, you would need to create a job that does the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://circleci.com/docs/api/v2/index.html#operation/listWorkflowsByPipelineId"&gt;Find workflow B's ID from the current pipeline&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://circleci.com/docs/api/v2/index.html#operation/listWorkflowJobs"&gt;Find the approval job's ID from the invoked workflow B&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://circleci.com/docs/api/v2/index.html#operation/approvePendingApprovalJobById"&gt;Approve the job&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jobs:
  ...
  approve-workflow:
    parameters:
      workflow-name:
        type: string
        description: workflow name
      job-name:
        type: string
        description: name of approval job in workflow
    docker:
      - image: cimg/base:current
    steps:
      - run:
          name: Find Workflow ID for &amp;lt;&amp;lt; parameters.workflow-name &amp;gt;&amp;gt;
          command: |
            curl -H "Circle-Token: $CIRCLE_TOKEN" https://circleci.com/api/v2/pipeline/&amp;lt;&amp;lt; pipeline.id &amp;gt;&amp;gt;/workflow &amp;gt; workflows.json
            WORKFLOW_ID=$(jq -r '.items | map(select(.name == "&amp;lt;&amp;lt; parameters.workflow-name &amp;gt;&amp;gt;")) | .[0].id' workflows.json)
            echo "export WORKFLOW_ID='${WORKFLOW_ID}'" &amp;gt;&amp;gt; $BASH_ENV
      - run:
          name: Find Job ID for &amp;lt;&amp;lt; parameters.job-name &amp;gt;&amp;gt;
          command: |
            curl -H "Circle-Token: $CIRCLE_TOKEN" "https://circleci.com/api/v2/workflow/${WORKFLOW_ID}/job" &amp;gt; jobs.json
            APPROVAL_JOB_ID=$(jq -r '.items | map(select(.name == "&amp;lt;&amp;lt; parameters.job-name &amp;gt;&amp;gt;" and .type == "approval")) | .[0].id' jobs.json)
            echo "export APPROVAL_JOB_ID='${APPROVAL_JOB_ID}'" &amp;gt;&amp;gt; $BASH_ENV
      - run:
          name: Approve job
          command: |
            curl -X POST -H "Circle-Token: $CIRCLE_TOKEN" "https://circleci.com/api/v2/workflow/${WORKFLOW_ID}/approve/${APPROVAL_JOB_ID}" | jq .

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

&lt;/div&gt;



&lt;p&gt;In the spirit of sharing, I have created a CircleCI Orb that codifies the above job for your convenience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://circleci.com/developer/orbs/orb/kelvintaywl/control-flow"&gt;https://circleci.com/developer/orbs/orb/kelvintaywl/control-flow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope this article and the Orb will be useful. Keep on building, folks!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://write.as/kelvintaywl/tag:circleci"&gt;#circleci&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:cicd"&gt;#cicd&lt;/a&gt; &lt;a href="https://write.as/kelvintaywl/tag:workflow"&gt;#workflow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kelvintaywl"&gt;buy Kelvin a cup of coffee&lt;/a&gt; ☕&lt;/p&gt;

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