<?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: alrex</title>
    <description>The latest articles on DEV Community by alrex (@codeboten).</description>
    <link>https://dev.to/codeboten</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%2F240232%2F8c476775-2a8b-4a56-96cc-8fa11688ea17.png</url>
      <title>DEV Community: alrex</title>
      <link>https://dev.to/codeboten</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codeboten"/>
    <language>en</language>
    <item>
      <title>Building the OpenTelemetry Collector</title>
      <dc:creator>alrex</dc:creator>
      <pubDate>Mon, 21 Aug 2023 00:00:18 +0000</pubDate>
      <link>https://dev.to/codeboten/building-the-opentelemetry-collector-15nl</link>
      <guid>https://dev.to/codeboten/building-the-opentelemetry-collector-15nl</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DfPp_Cjw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AUPdYZx95F3qocwGpgRYmtQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DfPp_Cjw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AUPdYZx95F3qocwGpgRYmtQ.jpeg" alt="" width="800" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://opentelemetry.io/docs/collector/custom-collector/"&gt;OpenTelemetry Collector Builder&lt;/a&gt; is a tool that allows users to compile their own custom instance of the &lt;a href="https://words.boten.ca/cloud-native-observability-excerpt/"&gt;Collector&lt;/a&gt;. This is useful in a few different scenarios. Maybe the existing distributions contain more components than you need. Choosing specific components reduces the complexity and size of the resulting Collector. In my experience, the fewer components you’re including in binaries shipped around production, the happier the security teams tend to be.&lt;/p&gt;

&lt;p&gt;Another reason you may need to use the Builder is that you’re producing custom Collector components. With the Builder, adding a component requires as little as a single line in the manifest file, and you can add a component hosted anywhere. Whatever your reason is, getting familiar with the Builder is a good practice if you’re in the business of deploying the Collector in your environment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using the Builder
&lt;/h4&gt;

&lt;p&gt;One thing I’ve been wanting to make easier still is the process of using the Builder. Today, if you’re looking at building a local instance of the collector, installing the Builder and using it can be done in a few steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the Builder&lt;/li&gt;
&lt;li&gt;Create a manifest.yaml file&lt;/li&gt;
&lt;li&gt;Run the builder with a -config manifest.yaml flag&lt;/li&gt;
&lt;li&gt;Profit!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Of course, building binaries on a local machine, then shipping it off to a production environment isn’t often a recommended practice. The better way to go about it is to put your configuration in a repository, and use a build pipeline to do all the work. This will ensure repeatability (usually…) of the build, along with keeping a record of the changes to your build. Unfortunately, having built a few different custom Collectors has caused me to copy and paste a lot of unnecessary code around. Could a custom action do it instead? It sure can!&lt;/p&gt;

&lt;h4&gt;
  
  
  Collector Builder GitHub Action
&lt;/h4&gt;

&lt;p&gt;In order to reduce the amount of required boiler plate code, I wrote a custom &lt;a href="https://github.com/codeboten/collector-builder-action/tree/main"&gt;GitHub action&lt;/a&gt; runs a Docker container with the Builder already installed. A user of this action specifies the path of the manifest file to use as configuration via the manifest-file input. The action will then produce a custom Collector binary! The following shows an example GitHub action configuration that clones the current repository, uses the collector-builder-action, and uploads the resulting Collector binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;on: [push]

jobs:
  custom-collector-action:
    runs-on: ubuntu-latest
    name: A job to build a custom OpenTelemetry Collector
    steps:
      - uses: actions/checkout@v3

      - name: Custom Collector Step
        uses: codeboten/collector-builder-action@v1

      - uses: actions/upload-artifact@v3
        with:
          name: otelcolaction
          path: _build/otelcolaction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my &lt;a href="https://github.com/codeboten/custom-collector/tree/main"&gt;test repository&lt;/a&gt;, the manifest looks like any other Collector manifest file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist:
  module: github.com/open-telemetry/opentelemetry-demo/src/otelcollector
  name: otelcol-demo
  description: OpenTelemetry Collector for OpenTelemetry Demo
  version: 0.81.0
  output_path: ./_build
  otelcol_version: 0.81.0

receivers:
  - gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.81.0
exporters:
  - gomod: go.opentelemetry.io/collector/exporter/loggingexporter v0.81.0
  - gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.81.0
  - gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.81.0
processors:
  - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.81.0
connectors:
  - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.81.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s all you need in your repository. Once the GitHub action is run, the Collector Builder Action should produce an artifact as it did in my case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iTwzC-1V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AGKaKSxNmZ0LQmFSg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iTwzC-1V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AGKaKSxNmZ0LQmFSg.png" alt="" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So what next? Well, the initial release of this action is full of sharp edges. There’s no support for multiple architectures. It would be great if this action could produce a Docker image. And I’m pretty sure there are many more things I’d like to improve. If this is useful to you, please let me know via whatever social platform. You can also open an issue or a pull request! And who knows, maybe this will eventually be donated to the OpenTelemetry project. In the meantime, enjoy building your Collector, now with even fewer steps!&lt;/p&gt;

&lt;p&gt;Cover Photo by &lt;a href="https://unsplash.com/@martzzl?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Marcel Strauß&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/rxGN4Z6wN5s?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://words.boten.ca/building-the-collector/"&gt;&lt;em&gt;https://words.boten.ca&lt;/em&gt;&lt;/a&gt; &lt;em&gt;on August 21, 2023.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opentelemetry</category>
      <category>collector</category>
      <category>observability</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Disabling go modules in Visual Studio Code</title>
      <dc:creator>alrex</dc:creator>
      <pubDate>Tue, 26 May 2020 04:00:03 +0000</pubDate>
      <link>https://dev.to/codeboten/disabling-go-modules-in-visual-studio-code-31mp</link>
      <guid>https://dev.to/codeboten/disabling-go-modules-in-visual-studio-code-31mp</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Acp_JMGIX5mdRidp8k9eFuQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Acp_JMGIX5mdRidp8k9eFuQ.jpeg"&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@jjames25?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Jeff James&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/knobs?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I couldn’t find a good answer to this question and I looked for hours. Ultimately, I decided to document it here for the next time I need it and for anyone else out there who’s looking to disable go modules in in Visual Studio Code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open up Settings (⌘,) and search for “go tools env vars”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ALg2ZLyijFgvAigQm0LSBYg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ALg2ZLyijFgvAigQm0LSBYg.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click “Edit in settings.json” and set GO111MODULE to off&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F344%2F1%2AarPRPbdlc8FLjZOOCXOScA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F344%2F1%2AarPRPbdlc8FLjZOOCXOScA.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also disabled the go language server as it was burning a hole through my lap:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A1YYT46if0mGahsOs8i7A1g.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A1YYT46if0mGahsOs8i7A1g.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well that’s all there was to it! I’m now able to use VSCode for all my editing needs.&lt;/p&gt;

</description>
      <category>go</category>
      <category>softwaredevelopment</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Tests, delivery and other important things in software development</title>
      <dc:creator>alrex</dc:creator>
      <pubDate>Tue, 01 Oct 2019 04:28:57 +0000</pubDate>
      <link>https://dev.to/codeboten/tests-delivery-and-other-important-things-in-software-development-5bj5</link>
      <guid>https://dev.to/codeboten/tests-delivery-and-other-important-things-in-software-development-5bj5</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VodaWVxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AGqQKZjPQD8698bu0CjNjlg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VodaWVxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AGqQKZjPQD8698bu0CjNjlg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tests, delivery and other important things in software development
&lt;/h3&gt;

&lt;p&gt;There’s a scene from the Simpson episode “&lt;a href="https://en.wikipedia.org/wiki/Lisa_the_Simpson"&gt;Lisa the Simpson&lt;/a&gt;” where Lisa appears on a television broadcast to make an appeal to the audience. She urges citizens to use and treasure their brain, in fear that she was about to lose her own due to the “Simpson gene”. As I was leaving my previous employer, I had a similar fear that my brain would turn to mush. I’m writing this article in the event that my true destiny of turning into a couch potato becomes fulfilled and I no longer have full use of my brain. The advice below is a little all over the map, but all of it has helped teams I worked with be more effective.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WwhlbziY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/665/1%2AP7oUlzTvO13AqLJYSbjsSg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WwhlbziY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/665/1%2AP7oUlzTvO13AqLJYSbjsSg.png" alt=""&gt;&lt;/a&gt;Credit: 20th Century Fox&lt;/p&gt;

&lt;h3&gt;
  
  
  Treat your Continuous Integration Continuous Delivery tooling like production
&lt;/h3&gt;

&lt;p&gt;When starting a project, it’s easy to get caught up in building software and getting it deployed somewhere. Often in that excitement, someone says “Let’s get this into CICD”, at which point, someone else will volunteer to set the thing they know about up somewhere (ie. Jenkins, concourse, drone). As soon as the software is building and deploying, boom, let’s move on to the next thing. This is a key point in the project. It’s easy to say, in the name of building more features, this works for now, it’s fine. However, this is also the point in time at which we’ll look back to, on the day where something important &lt;strong&gt;MUST&lt;/strong&gt; be shipped and we can’t because Jenkins is caught in an unrecoverable state, or the concourse workers have died and for some inexplicable reason, restarting them doesn’t fix the problem. There’s no need to spend days and weeks making CICD completely bulletproof, but some simple steps can ensure even a catastrophic failure doesn’t cause the development team pain down the road.&lt;/p&gt;

&lt;h4&gt;
  
  
  check-in configuration
&lt;/h4&gt;

&lt;p&gt;One of the easiest ways to recover something, and also ensure it passes the &lt;a href="https://en.wikipedia.org/wiki/Bus_factor"&gt;bus factor&lt;/a&gt; test, check it in! Whether choosing to check-in configuration for the host, or create images to redeploy hosts easily, there’s more than one way to accomplish this.&lt;/p&gt;

&lt;h4&gt;
  
  
  centralize logging
&lt;/h4&gt;

&lt;p&gt;No one looks at logs, that is until, something goes wrong. So it’s problematic when those logs are no longer accessible. The easy solution here is to ship the logs somewhere, anywhere. Use a centralized syslog system or some third party service. Ideally, the logs are shipped somewhere that makes monitoring and alerting on them easy.&lt;/p&gt;

&lt;h4&gt;
  
  
  alerting
&lt;/h4&gt;

&lt;p&gt;Use your own discretion here, but some level of advanced warning when things are about to go BOOM is nice. We used to alert on Jenkins 24/7, and most of the time, these alerts could have waited until regular business hours. Some of the metrics we monitored were the usual suspects: disk, memory, CPU. Some other metrics that are handy to watch for is build times for known components.&lt;/p&gt;

&lt;h4&gt;
  
  
  document setup and recovery procedure
&lt;/h4&gt;

&lt;p&gt;Anytime I join a team, I get to be the annoying person that asks questions about where things are documented. Often times, the thing that’s least documented is how someone put together the deployment pipeline and what to do when things go wrong with it. Document it, and test out the documentation.&lt;/p&gt;

&lt;h4&gt;
  
  
  apply chaos engineering practices
&lt;/h4&gt;

&lt;p&gt;If you’re not familiar with chaos engineering, here’s a great &lt;a href="https://principlesofchaos.org/?lang=ENcontent"&gt;website&lt;/a&gt; to get you started. In short, it means to break systems intentionally to figure out how to make them more resilient. I’ve worked in places that host break-a-thons or fire drills to achieve similar goals. In the case of a CICD system, I would use chaos engineering principles to test that the recovery procedure works, and that no significant data loss occurs in the case of a failure of the system.&lt;/p&gt;

&lt;h4&gt;
  
  
  backup and store artifacts separately
&lt;/h4&gt;

&lt;p&gt;Losing the CICD is bad. Losing all the artifacts the company has shipped because there was only one copy and it lived on the CICD host can be disastrous. Yes, this has happened to me and no it wasn’t all that long ago. It was not a good week, but thankfully it was early enough in the project that we hadn’t shipped anything yet. An easy option for storing artifacts is to ship them to an online storage solution like Amazon’s S3. Concourse provides a &lt;a href="https://github.com/concourse/s3-resource"&gt;custom resource&lt;/a&gt; for storing things in S3, and Jenkins provides this functionality via a &lt;a href="https://wiki.jenkins.io/display/JENKINS/Artifact+Manager+S3+Plugin"&gt;plugin&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  don’t maintain it
&lt;/h4&gt;

&lt;p&gt;Unless an organization’s bread and butter is providing a CICD solution, it’s likely that the build pipeline is just another &lt;em&gt;required&lt;/em&gt; tool. Don’t waste engineering time on it, if it’s in the budget, use a hosted solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Emit events when deploying builds
&lt;/h3&gt;

&lt;p&gt;Tying in deployments with changes in the code is awesome. I like to hypothesize about the impact of a change. One of my favourite feelings is that sense of accomplishment that comes from seeing it being deployed and observing its impact on a dashboard. Being able to correlate changes in the behaviour of a system with deployments is super duper helpful when troubleshooting what went wrong. Key information I’ve found useful in the past:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;commit and link to change in source control&lt;/li&gt;
&lt;li&gt;link to build logs&lt;/li&gt;
&lt;li&gt;start and end of deployment&lt;/li&gt;
&lt;li&gt;phase, if applicable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Write tests
&lt;/h3&gt;

&lt;p&gt;I’m not about to preach about test coverage, or unit testing all the things everywhere all the time. I know that’s not practical in all cases, and in some cases, the value add of the unit tests would be close to none (ie. when the test mocks 95% of the functionality and the rest of the code is just shim around what’s being mocked). But writing tests when starting to tackle a piece of logic that is tricky, or even a piece of logic that appears trivial but requires a fair amount of code, almost always pays off. And not only does it provide coverage for regressions and more safety for other engineers, but it also feels great. I don’t know, when I write tests and I finish shipping the code, it just makes me feel like I’ve done my job right. When writing tests, here’s a couple of things to keep in mind.&lt;/p&gt;

&lt;h4&gt;
  
  
  make it easy
&lt;/h4&gt;

&lt;p&gt;There’s a ton of tools and frameworks out there to provide additional functionality for folks writing unit tests. My general rule of thumbs here is that tools used in unit tests should not make writing and running tests harder for folks on the team. Adding barriers to writing tests will ultimately drive developers away from writing them. It’s important to keep things as simple as possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  test what makes sense
&lt;/h4&gt;

&lt;p&gt;A lot has been documented about code coverage and about quality of code based on that coverage. I’m a big fan of testing what makes sense in a codebase. It’s easy to get a false sense of security about the codebase based on the amount of the code that is covered. It’s also easy to get into the trap of writing so many tests, that writing a line of code means modifying dozens of tests in a more or less meaningless way.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Pair with people
&lt;/h3&gt;

&lt;p&gt;Take the time to pair with people. No matter how important delivering a particular feature seems, ensuring others are empowered to take over whatever task at any given time is precious. This works both for the person learning and the person offloading their knowledge. In my last few weeks at my previous job, I took every opportunity I had to ensure everyone around me would know what I was working on. I’ll admit, sometimes it felt like uncovering a pile of dirt I had swept under the rug, but somehow, I still felt better after doing it.&lt;/p&gt;

&lt;h4&gt;
  
  
  it feels scary
&lt;/h4&gt;

&lt;p&gt;It’s important to acknowledge that not everyone feels comfortable pairing. Different personalities, experience levels and biases based on previous experiences with pairing will all play a role in it. Even after years of pairing, occasionally a spike in adrenaline happens when someone asks me to pair. Imposter syndrome is real, and there’s always a chance to be found out when pairing.&lt;/p&gt;

&lt;h4&gt;
  
  
  it’s intense
&lt;/h4&gt;

&lt;p&gt;Pairing can be quite intense. Writing code while continuously working with someone else on what is next can be quite taxing. It’s important to remember to take breaks, and to limit the amount of pairing done daily.&lt;/p&gt;

&lt;h4&gt;
  
  
  different tools
&lt;/h4&gt;

&lt;p&gt;Tooling can be a real barrier when pairing. Pairing on someone’s laptop usually means the person whose laptop is being used will do all the driving, or that the other person will keep asking how to do things. This leads to an increase in frustration and eventual abandonment of the process. The best setup I’ve ever had the chance to pair included dedicated pairing stations in the office. These were separate from individual workstations. Each pairing station was setup identically, with an image that was used to wipe and reset the stations regularly. This meant no one had any attachment to the pairing station, and all the tools that were used were installed as part of the base image. Another good way to pair has been through &lt;a href="https://www.hamvocke.com/blog/remote-pair-programming-with-tmux/"&gt;tmux shared sessions&lt;/a&gt; or using the &lt;a href="https://code.visualstudio.com/blogs/2017/11/15/live-share"&gt;Live Share&lt;/a&gt; extension &lt;a href="https://code.visualstudio.com"&gt;Visual Studio Code&lt;/a&gt;’s which allows everyone pairing to collaborate equally. A last resort method of pairing is using screen sharing through video conferencing software. The downside of this approach is one person is driving, while the other is passively involved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zSD8eBO0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-WosNzXumx9wbyGbgpcIlA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zSD8eBO0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-WosNzXumx9wbyGbgpcIlA.png" alt=""&gt;&lt;/a&gt;Credit: &lt;a href="https://xkcd.com/1513/"&gt;&lt;/a&gt;&lt;a href="https://xkcd.com/1513/"&gt;https://xkcd.com/1513/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of what I covered here can be experimented with cheaply in an organization. Starting with a couple of hours on a Friday and experimenting, seeing what works and what doesn’t. If something doesn’t work after having giving it an honest try, throw it away, and send me some feedback! I would love to learn from your experiences.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>continuousintegrati</category>
      <category>bestpractices</category>
      <category>agile</category>
    </item>
    <item>
      <title>The journey back to being an individual contributor</title>
      <dc:creator>alrex</dc:creator>
      <pubDate>Thu, 03 Jan 2019 06:24:18 +0000</pubDate>
      <link>https://dev.to/codeboten/the-journey-back-to-being-an-individual-contributor-312m</link>
      <guid>https://dev.to/codeboten/the-journey-back-to-being-an-individual-contributor-312m</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9PduNOAT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AzKCYM2WFz7uytzy07xNoZg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9PduNOAT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AzKCYM2WFz7uytzy07xNoZg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few people have asked me about my recent job title change. After managing an infrastructure team for two years, I switched career tracks back to an individual contribute role. I wanted to share some thoughts about the transition in hope that it might help others in similar situations.&lt;/p&gt;

&lt;h4&gt;
  
  
  The journey
&lt;/h4&gt;

&lt;p&gt;A few months ago, I was in one of those deep pits of self doubt. You know, the ones where you question everything you say and do. I was getting to the point where I was really starting to question whether or not I was still able to write code. In my first year as a manager, I was able to scrounge time outside of work to write code. But with toddler and a newborn at home, all my free time was spent parenting.&lt;/p&gt;

&lt;p&gt;Around the same time, I began reading &lt;a href="https://en.wikipedia.org/wiki/The_7_Habits_of_Highly_Effective_People"&gt;The Seven Habits of Highly Effective People&lt;/a&gt;. Many had recommended the book to me over the years, but I’d just never gotten around to reading it. The book drove me to start looking inwards at what I could control to increase my level of happiness. What did I have the power to change in my current situation? I wanted to write code to increase my happiness, but could not find the time to do it. So I looked for ways to cut out any time-wasting activities that were still in my daily routine. This allowed me to gain back little bits of time that I set aside specifically for programming. Soon I was getting so excited about writing minuscule amounts of code that I would stay up late into the night, waking up the next morning full of the excitement of getting something working the night before.&lt;/p&gt;

&lt;p&gt;This was the key turning point. One morning, I started telling my wife all about the mostly irrelevant piece of code I figured out the night before. She made a comment along the lines of not having seen me this excited in years. That’s when I knew something had to change.&lt;/p&gt;

&lt;h4&gt;
  
  
  The myth
&lt;/h4&gt;

&lt;p&gt;Some believe that moving to management is a promotion. That after being an individual contributor for over ten years it’s the only choice in order to move up. For a long time I believed this as well. In some industries, the management track is directly tied to financial compensation. The more people you’re responsible for, the more money you make. In the software industry, once you reach a certain level in your career, it becomes a set of parallel tracks. Becoming a manager isn’t about moving up in a career as much as it is moving in a different direction altogether. Instead of writing and designing solutions with code, you’re solving problems from a different dimension.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--toIFEUy1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AnEz9d-IkBP-LXO1Ow0OUtw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--toIFEUy1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AnEz9d-IkBP-LXO1Ow0OUtw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This myth caused me to spend weeks agonizing on whether or not I should have the discussion with my manager about wanting to change track. Was I taking a step back in my career? After all, I was managing up to eleven people in multiple projects at some point. Isn’t that how success is measured? Isn’t saying that I want to write code again like giving up?&lt;/p&gt;

&lt;h4&gt;
  
  
  Motivation
&lt;/h4&gt;

&lt;p&gt;One of the most common questions I get asked is about what motivated me to switch tracks. Looking back now I realize that there were a few things I know about myself that I didn’t before:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I &lt;strong&gt;love&lt;/strong&gt; writing code. Working with technology and exploring new problem spaces drives me. Enabling others via proof of concepts and building things gets me excited.&lt;/li&gt;
&lt;li&gt;I measure my success on what I &lt;strong&gt;personally accomplish&lt;/strong&gt;. As a manager, I viewed my job as enabling my team to succeed. When the team achieved success, I was excited for the members of my team. As folks grew and tackled bigger responsibilities, I was excited for them, but I never really felt a sense of accomplishment from it.&lt;/li&gt;
&lt;li&gt;I’m driven to create impact. After many talks with my partner, I was convinced that I could have a &lt;strong&gt;greater impact&lt;/strong&gt; for my organization by stepping away from my current role.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Learnings
&lt;/h4&gt;

&lt;p&gt;Though I decided to step off the management track, I’m happy to have had the opportunity to manage a great team. I learned a ton while being a manager. Some of these are things people told me early on, but didn’t quite register until later. Some might seem obvious, but they’re worth re-iterating.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stop worrying&lt;/strong&gt; about writing code. The sooner you can let go of the problems you &lt;em&gt;were&lt;/em&gt; solving, the sooner you can start thinking about the new problems you &lt;em&gt;must&lt;/em&gt; solve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reach out&lt;/strong&gt; to your new peers for help. All managers were new at this at some point. They understand the challenges of the role and can share valuable experiences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give responsibilities&lt;/strong&gt; to people on your team. It provides them a chance to step up, and you a chance to free up some of your time to look ahead. Owning a problem, product or project doesn’t mean you have to do everything yourself.&lt;/li&gt;
&lt;li&gt;Find a way to &lt;strong&gt;measure&lt;/strong&gt; your input and output for the week that motivates &lt;em&gt;you&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Find a &lt;strong&gt;good coach&lt;/strong&gt;. I was lucky enough to have access to some great coaches that helped me work through challenges I faced early on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zQp0bCSt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/612/1%2ASPsanXQmPly2j-UZ-6_u3Q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zQp0bCSt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/612/1%2ASPsanXQmPly2j-UZ-6_u3Q.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The future
&lt;/h4&gt;

&lt;p&gt;Folks ask me whether or not I am giving up on management altogether. The answer is I don’t know. What I do know is that at this point in my career, it’s not right for me. I’m happy to write code and believe this is where I can have the most impact at this time.&lt;/p&gt;

</description>
      <category>work</category>
      <category>softwaredevelopment</category>
      <category>leadership</category>
      <category>careerchange</category>
    </item>
  </channel>
</rss>
