<?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: Jochen Lillich</title>
    <description>The latest articles on DEV Community by Jochen Lillich (@geewiz).</description>
    <link>https://dev.to/geewiz</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%2F145217%2F0d9d095c-2dd6-4463-ae13-2bf330b47090.jpeg</url>
      <title>DEV Community: Jochen Lillich</title>
      <link>https://dev.to/geewiz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/geewiz"/>
    <language>en</language>
    <item>
      <title>A homelab is a skill booster</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Sat, 09 Aug 2025 11:50:04 +0000</pubDate>
      <link>https://dev.to/geewiz/a-homelab-is-a-skill-booster-48kg</link>
      <guid>https://dev.to/geewiz/a-homelab-is-a-skill-booster-48kg</guid>
      <description>&lt;p&gt;In her article &lt;a href="https://www.paigerduty.com/sre-biggest-problem/" rel="noopener noreferrer"&gt;“What’s the biggest unsolved problem within Site Reliability Engineering?”&lt;/a&gt;, Paige Cruz identifies a critical challenge facing our industry: how do we pass the hard-won knowledge of veteran system administrators down to a new generation that has never worked outside cloud infrastructure?&lt;/p&gt;

&lt;p&gt;Cruz makes a compelling case that this knowledge transfer gap represents SRE’s biggest unsolved problem. However, I take issue with one of her conclusions. She argues that “It’s also not acceptable or sustainable or accessible in my opinion to continue to expect people set up home-labs and experiment themselves. We don’t ask veterinarians to practice surgery in their free time at home and I don’t think we should expect that from future SRE.”&lt;/p&gt;

&lt;p&gt;I respectfully disagree. A home lab represents the best investment a future SRE can make to secure their career growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The home lab advantage
&lt;/h2&gt;

&lt;p&gt;The veterinarian comparison doesn’t hold up under scrutiny. Veterinarians need live animals, surgical equipment, and sterile environments – resources that are neither practical nor ethical to maintain at home. Particle physicists need billion-dollar accelerators. But what does a sysadmin or SRE need to experiment with infrastructure? A few decommissioned Lenovo ThinkCentre boxes and a network switch.&lt;/p&gt;

&lt;p&gt;The barrier to entry is remarkably low, and the learning potential is enormous.&lt;/p&gt;

&lt;p&gt;Scientific research consistently shows that skill development requires more than passive consumption of learning materials. Growing expertise demands practical exploration – running into problems, analyzing failures, and working through solutions. A home lab provides exactly this environment, free from the constraints and pressures of production systems.&lt;/p&gt;

&lt;p&gt;You don’t need a data centre in your basement. One or a few small networked PCs will serve you well. These machines consume minimal power and don’t need to run around the clock. Fire them up when you want to experiment with a new service mesh, test disaster recovery procedures, or break something just to see what happens.&lt;/p&gt;

&lt;p&gt;For those who can’t or don’t want to maintain physical hardware, alternatives exist. “Pubmox” – the shared Proxmox Virtual Environment I maintain for members of “&lt;a href="https://monospacementor.com/community/" rel="noopener noreferrer"&gt;The Server Room&lt;/a&gt;” – offers free access to virtual infrastructure for hands-on learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The learning laboratory
&lt;/h2&gt;

&lt;p&gt;A home lab creates space for the kind of curiosity-driven exploration that builds deep technical intuition. When you’re troubleshooting a networking issue at 2 AM in your home lab, you’re not worried about affecting customers or violating change management policies. You can take risks, make mistakes, and learn from the consequences.&lt;/p&gt;

&lt;p&gt;This environment encourages the experimental mindset that separates great SREs from those who merely follow runbooks. You learn to ask “what if” questions and then actually test your hypotheses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge transfer requires community
&lt;/h2&gt;

&lt;p&gt;While I advocate strongly for home labs as skill boosters, they’re not the complete answer to Cruz’s original question about knowledge preservation. The solution to transferring veteran sysadmin wisdom doesn’t lie in solitary exploration – it requires collaborative knowledge transfer.&lt;/p&gt;

&lt;p&gt;Home labs excel at building technical skills, but they can’t replace the mentorship and context that comes from working alongside experienced practitioners. The real magic happens when hands-on experimentation combines with guided learning from those who’ve solved these problems before.&lt;/p&gt;

&lt;p&gt;This is why I’m launching “&lt;a href="https://monospacementor.com/courses/linsys-1/" rel="noopener noreferrer"&gt;Basic Linux System Administration&lt;/a&gt;” – an instructor-led course backed by “The Server Room” community. Participants get free access to Pubmox, allowing them to practice what they learn while benefiting from my decades of system administration experience.&lt;/p&gt;

&lt;p&gt;It’s the best of both worlds: the freedom to experiment and break things, combined with the guidance to understand why systems fail and how to make them more reliable.&lt;/p&gt;

&lt;p&gt;A home lab won’t solve SRE’s knowledge transfer problem on its own. But for individual practitioners looking to deepen their skills and advance their careers, it remains an invaluable investment. The combination of practical experimentation and collaborative learning creates the foundation for the next generation of systems experts our industry desperately needs.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://monospacementor.com/2025/08/a-homelab-is-a-skill-booster/" rel="noopener noreferrer"&gt;A homelab is a skill booster&lt;/a&gt; appeared first on &lt;a href="https://monospacementor.com" rel="noopener noreferrer"&gt;The Monospace Mentor&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>linux</category>
      <category>skills</category>
    </item>
    <item>
      <title>80-hour weeks don’t make a great engineer. They’ll break a great engineer.</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Tue, 16 Apr 2024 07:00:00 +0000</pubDate>
      <link>https://dev.to/geewiz/80-hour-weeks-dont-make-a-great-engineer-theyll-break-a-great-engineer-ff</link>
      <guid>https://dev.to/geewiz/80-hour-weeks-dont-make-a-great-engineer-theyll-break-a-great-engineer-ff</guid>
      <description>&lt;p&gt;I’m not exaggerating when I say I was shocked by a question about working hours that I got during a recent office hour live stream. &lt;em&gt;“So I heard from a developer that he would code and learn for like 80 hours a week when he started in order to be come an amazing engineer. I can barely do 8 hours a day and I want to be an amazing engineer. Advice on that?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here’s the TL;DR: &lt;strong&gt;Working 80 hours a week is neither healthy nor effective.&lt;/strong&gt; I’d go as far as to saying it’s impossible. Sitting in front of a screen for 80 hours? Yeah, maybe, if that’s your thing. But doing actual work for 80 hours? You might very well be fooling yourself, but you’re not fooling me.&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%2Fmonospacementor.com%2Fwp-content%2Fuploads%2F2024%2F03%2Fmuhammad-raufan-yusup-rYRE6ju-2K8-unsplash-1024x679.jpg" 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%2Fmonospacementor.com%2Fwp-content%2Fuploads%2F2024%2F03%2Fmuhammad-raufan-yusup-rYRE6ju-2K8-unsplash-1024x679.jpg" alt="Person sitting at a laptop at night, putting in long work hours"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Muhammad Raufan Yusup on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More negative side effects than benefits
&lt;/h2&gt;

&lt;p&gt;Now, before we get into how many hours of work per week you really should invest into your growth, let’s first consider the side effects of spending 80 hours per week working. That is 16 hours every weekday or more than 11 hours every single day, working on your engineering career. Even if we count necessities like eating and pooping as part of work time, it’ll still leave only between 8 and 12 hours per day for the non-work parts of your life. Parts like, you know, hobbies, social life and sleep.&lt;/p&gt;

&lt;p&gt;And it’s scientifically proven that for most people, any amount of sleep below 7 hours a night is not enough. The body needs time to recover physically and mentally. In other words, if you sacrifice sleep for other things for more than a very short time, you’re going to ruin your health. Let’s see how not only your career but your whole life flourishes while you’re dealing with the consequences of burnout (or falling asleep driving your car).&lt;/p&gt;

&lt;h2&gt;
  
  
  Way to sabotage yourself
&lt;/h2&gt;

&lt;p&gt;Total work time also has severely diminishing returns. In other words, putting in more and more time will yield less and less additional results. Effective work requires effective rest. Why do you think Ford and his fellow industrialists themselves introduced the 40-hour work week? And that was just about physical work. Every athlete knows that muscle growth doesn’t benefit from endless training. There needs to be downtime during which the body can recuperate and grow to meet demand.&lt;/p&gt;

&lt;p&gt;For our brain, it’s similar, but it’s even more limited in how long it can work at high performance. For knowledge workers, an 8-hour day is like a 16-hour day for the industrial laborer. It’s just not possible to keep your focus for that long, not only because people keep interrupting you, but also for physiological reasons. The brain needs time and rest to build new tissue such as the myelin that grows around neurons.&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s not about the working hours at all
&lt;/h2&gt;

&lt;p&gt;There’s also the aspect of how much you can even achieve on your own. There’s that story of someone who shipwrecked on an island with just a chess board, and ten years later returned as a grand master. That’s bullshit, because you need other people to beat the Dunning/Kruger effect, i.e. you don’t know what you don’t know. The only way to find the solutions that your brain couldn’t come up with by itself is collaboration. Grand masters learn from other grand masters, amazing engineers learn from other amazing engineers. That’s why I’m so excited about The Server Room, the &lt;a href="https://dev.to/devops-learning-community"&gt;community of DevOps practitioners&lt;/a&gt; I’m going to launch soon.&lt;/p&gt;

&lt;p&gt;The good news is that success is not about the total time you spend working at all. Rather, it’s about how much focus time you can get in. In his book “Deep Work”, Cal Newport explains how he manages to thrive as a busy author and academic. “Three to four hours a day, five days a week, of uninterrupted and carefully directed concentration, it turns out, can produce a lot of valuable output.” Just 15 to 20 hours of focused work per week will do the trick. And you’ll still have plenty of time left that you can spend schmoozing and snoozing.&lt;/p&gt;

&lt;p&gt;Please don’t blindly believe those hustle culture tech bros who tout how they built their success on relentless work. Even if there’s a kernel of truth to their claims, what they don’t tell you is that they also had the means to mitigate the negative consequences of their self-abuse. Instead, I recommend that you read the book “&lt;a href="https://maxfrenzel.com/time-off" rel="noopener noreferrer"&gt;Time Off: A Practical Guide to Building Your Rest Ethic and Finding Success Without the Stress&lt;/a&gt;“. It’s full of good advice like this one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But as entrepreneurs, managers, and individuals, it’s a dangerous and vicious cycle if we keep assuming that we are productive and effective only because we put in a crazy amount of hard work and long hours, grinding it out. All too often, we get stuck in mediocrity because we are afraid, or maybe just too lazy and comfortable, to question the status quo and the rules set by societal norms.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;John Fitch, Max Frenzel, and Mariya Suzuki, “Time Off”&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This article was originally published in my newsletter, “News From the Server Room”. To get my column “Mentor Monologue” fresh when I publish it, &lt;a href="https://monospacementor.com/devops-know-how/" rel="noopener noreferrer"&gt;subscribe here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://monospacementor.com/2024/04/working-hours/" rel="noopener noreferrer"&gt;80-hour weeks don’t make a great engineer. They’ll break a great engineer.&lt;/a&gt; appeared first on &lt;a href="https://monospacementor.com" rel="noopener noreferrer"&gt;The Monospace Mentor&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>companyculture</category>
      <category>mentalhealth</category>
      <category>teamwork</category>
    </item>
    <item>
      <title>Startup lessons: 5 mistakes I made when I chose my brand name</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Mon, 06 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/geewiz/startup-lessons-5-mistakes-i-made-when-i-chose-my-brand-name-92</link>
      <guid>https://dev.to/geewiz/startup-lessons-5-mistakes-i-made-when-i-chose-my-brand-name-92</guid>
      <description>&lt;p&gt;Choosing “Opsitive” as the brand name for my teaching and mentoring business was a mistake. I know that now, and in this article, I’ll explain what made me realize that there’s much more to branding than just being clever. I’ll outline the tests that helped my identify the weaknesses of my current brand and verify that my new choice, “Monospace Mentor”, is going to be much stronger.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I discovered “&lt;a href="https://podcast.creatorscience.com/"&gt;Creator Science&lt;/a&gt;”, a podcast for content creators I can already highly recommend. One of the latest episodes peaked my interest in particular: “&lt;a href="https://podcast.creatorscience.com/alexandra-watkins/"&gt;How to invent a GREAT brand name.&lt;/a&gt;”. For years, I’ve been dissatisfied with my hosting company’s branding, so I was eager to learn more about this topic. And learn I did!&lt;/p&gt;

&lt;p&gt;On the podcast, branding expert Alexandra Watkins outlined two acronyms she invented to gauge the quality of a brand name; one checks the attributes to aim at, the other points out pitfalls to avoid. These acronyms are “SMILE” and “SCRATCH”, and you can find their detailed explanations over on Alexandra’s website, “&lt;a href="https://eatmywords.com/free-name-evaluation-test/"&gt;Eat my words&lt;/a&gt;”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failing the SCRATCH test
&lt;/h2&gt;

&lt;p&gt;Applying these checks to our hosting product confirmed my gut feeling – its name bombed spectacularly. We’ll address this issue in the marketing strategy development process that we’ve just launched recently. But then I did the same test with “Opsitive”, and it dropped on me that it was weak sauce, too!&lt;/p&gt;

&lt;p&gt;First of all, the term “Opsitive”, while being a play on the words “Ops” and “Positive”, does look like a typo and thus fails the first “S” in the SCRATCH test, “Spelling challenged”. The fact that I kept getting emails meant for an online shop for women’s healthcare should have alerted me early on.&lt;/p&gt;

&lt;p&gt;Its wordplay character also makes the name suffer from the “Curse of knowledge”, symbolized by the second “C” in SCRATCH. If you’re not familiar with the fact that “Ops” is short for “IT Operations”, you’ll not get the joke.&lt;/p&gt;

&lt;p&gt;Taking a less negative perspective, the name is unfortunately also lacking all of the qualities you should search for in a brand name according to the SMILE guidelines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s not &lt;em&gt;suggestive&lt;/em&gt;. It doesn’t say much at all, really.&lt;/li&gt;
&lt;li&gt;As a made-up play on words, it’s hard to &lt;em&gt;memorize&lt;/em&gt;. Was it “Opsitive”, or “Opositive” like the blood type, or maybe just “Opsitiv”?&lt;/li&gt;
&lt;li&gt;It doesn’t conjure any &lt;em&gt;image&lt;/em&gt; because it’s abstract at best and nonsensical at worst.&lt;/li&gt;
&lt;li&gt;It doesn’t have much &lt;em&gt;legs&lt;/em&gt; in that it can be extended to other topics. In fact, its explicit emphasis on “Ops” already puts software development out of scope, an area I definitely want to cover!&lt;/li&gt;
&lt;li&gt;For the same reasons for which it fails to spur imagination, it’s also not &lt;em&gt;emotional&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s another important shortcoming of the old name. It doesn’t put me in the centre, even though that’s the core of my business model: It’s not about the topics I teach, it’s about how &lt;em&gt;I&lt;/em&gt; teach them, about &lt;em&gt;my unique way&lt;/em&gt; to guide my mentees to their success.&lt;/p&gt;

&lt;p&gt;So I needed a new name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding a new name
&lt;/h2&gt;

&lt;p&gt;Coming up with a new name was hard. At first, it seemed that all the good names were already taken. My main problem was finding a name that could accommodate both sides of DevOps, operations and development, but wasn’t at the same time terribly generic. I used several thesaurus websites to research variations on the themes of teaching and mentorship. After many experiments and letting ideas germinate in my brain for days, inspiration finally hit me. There is one thing that unites all system administrators and software developers: they use terminal emulators, text editors and IDEs. And in those, they use monospace fonts. Nerds love their fonts. There are dozens of websites showcasing the huge spectrum of programming fonts, and some people like me even pay good money for a neat commercial one.&lt;/p&gt;

&lt;p&gt;And since I just can’t shake my silliness completely, I went for an alliteration as my new brand name. &lt;strong&gt;From here on out, I’ll be the “Monospace Mentor”, and my web presence is now at &lt;a href="https://www.monospacementor.com"&gt;www.monospacementor.com&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s do the SMILE check again.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Monospace Mentor” is &lt;em&gt;suggestive&lt;/em&gt; of personal teaching, and it conjures the &lt;em&gt;image&lt;/em&gt; of a programmer’s computer screen.&lt;/li&gt;
&lt;li&gt;It is easy to &lt;em&gt;memorize&lt;/em&gt;, helped by the alliteration.&lt;/li&gt;
&lt;li&gt;It does have &lt;em&gt;legs&lt;/em&gt; for expansion in the area of DevOps education.&lt;/li&gt;
&lt;li&gt;Is it emotional? I’m not sure, but it’s definitely whimsical!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Did I eliminate the problems of the old name?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It doesn’t look like a typo.&lt;/li&gt;
&lt;li&gt;It’s not confusingly similar to the brand of anyone in the teaching space I know of.&lt;/li&gt;
&lt;li&gt;It doesn’t restrict later expansion.&lt;/li&gt;
&lt;li&gt;It’s not annoying.&lt;/li&gt;
&lt;li&gt;It’s not too tame or bland.&lt;/li&gt;
&lt;li&gt;No curse of knowledge issue.&lt;/li&gt;
&lt;li&gt;And it’s easy and unambiguous to pronounce.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Much better!&lt;/p&gt;

&lt;h1&gt;
  
  
  Lots of work ahead
&lt;/h1&gt;

&lt;p&gt;I’ll admit that I’m a bit self-conscious about making this kind of a sharp turn. Curiously, we don’t have these inhibitions when we’re coding. Hey, naming and cache invalidation, amirite? 😄 And after all, &lt;em&gt;learning in public is at the core of what I do&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Since I never had any marketing training, I’m grateful that people like Alexandra Watkins share their expertise so others like me can learn from it. The SMILE and SCRATCH tests were tremendously helpful in finding a name that doesn’t make me anxious it’ll lose me potential business simply for the reason that it doesn’t really work as a brand.&lt;/p&gt;

&lt;p&gt;Now I’ve got my work cut out for myself. I have to create new brand assets and update the many places where my teaching business is already present.&lt;/p&gt;

&lt;p&gt;I’m happy with the new name. Are you, too? Please let me know what you think on my new &lt;a href="https://floss.social/@monospace"&gt;Mastodon account&lt;/a&gt; or on the Opsitive – wait, no – &lt;a href="https://www.monospacementor.com/discord"&gt;Monospace Mentor Discord&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>startup</category>
      <category>business</category>
      <category>branding</category>
    </item>
    <item>
      <title>Un-breaking breaking changes using feature flags</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Tue, 24 Oct 2023 23:00:00 +0000</pubDate>
      <link>https://dev.to/geewiz/un-breaking-breaking-changes-using-feature-flags-1d1d</link>
      <guid>https://dev.to/geewiz/un-breaking-breaking-changes-using-feature-flags-1d1d</guid>
      <description>&lt;p&gt;When we got a feature request that we really wanted to implement because it would be a great improvement to our product, we found ourselves in a bind. The problem was that the change would most likely break the workflows of other customers. In this article, I describe how I managed to roll out the change without triggering a flood of angry emails.&lt;/p&gt;

&lt;p&gt;Recently, a customer of our &lt;a href="https://www.freistilbox.com"&gt;managed hosting platform for Drupal and WordPress&lt;/a&gt; platform asked us to tighten the security of their website deployment. We realized that the necessary changes would not only help this customer but also improve website safety for all our customers. We love this kind of universally useful feature request because for operational efficiency reasons, we try to avoid making changes for individual customers only.&lt;/p&gt;

&lt;p&gt;However, it was easy to see that the restrictions we had to implement for this feature request came with a high risk of breaking existing workflows. People were accustomed to the current level of restrictions, and when you’re above a certain number of customers, you can be sure that some of them will have set up processes that rely on this exact status quo.&lt;/p&gt;

&lt;p&gt;A breaking change requires copious advance notice. But the customer who had raised the issue was more or less blocked until we shipped a solution. So how do you make a change in your production environment, but limit its effects to exactly those customers whom it will benefit, not disrupt?&lt;/p&gt;

&lt;p&gt;The solution to this Catch 22 came to me late at night, right before falling asleep. (Let me know if you have the same kind of brain.) It’s called “feature flags”.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature flags
&lt;/h3&gt;

&lt;p&gt;Feature flags are used to enable new features for a limited number of users only. Common reasons to limit the use of a feature to a smaller circle, at least initially, are that you’d like to prevent bursts in resource usage, or that you want to quickly discover issues that only show up in production without the risk that they’ll impact all your customers at once.&lt;/p&gt;

&lt;p&gt;Technically, a feature flag allows you to add code paths additional or alternative to existing ones, and switch those new code paths on or off based on specific conditions. Because the state of a feature flag is usually based on information outside of your code, you can enable or disable a feature at any time without having to deploy updates.&lt;/p&gt;

&lt;p&gt;Usually, state of a feature flag is derived from other data, for example a database field or an environment variable. If you have an early access program, the feature condition could be &lt;code&gt;customer.eap_member == true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In a gradual rollout scenario, you might want to make the new feature available to only a fraction of your customer base for starters. You could pick those customers in a targeted or random way, write their customer ID’s to a database table with a feature identifier, and define the feature state like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature_enabled?(customer: current_user.customer_id, feature: 17)`

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

&lt;/div&gt;



&lt;p&gt;It’s easy to build a simple feature flag implementation yourself. In more complex scenarios, I recommend you check out mature solutions like the Ruby gems &lt;a href="https://github.com/FetLife/rollout"&gt;Rollout&lt;/a&gt; and &lt;a href="https://github.com/flippercloud/flipper"&gt;Flipper&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature flags for breaking changes
&lt;/h3&gt;

&lt;p&gt;In my security change situation, I realized that I was dealing with just another feature rollout, only with the tiniest of target groups. I basically had to create an “early security improvement program” with the customer who requested the change as its only member. This would enable us to roll out the change immediately for them, and after a generous notice period, for all our customers.&lt;/p&gt;

&lt;p&gt;The resulting logic in our infrastructure code turned out very simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set_up_website_environment

if feature_active?(:full_isolation)
  set_more_restrictive_permissions
else
  set_the_usual_permissions
end

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

&lt;/div&gt;



&lt;p&gt;By the time of writing, the new code has long been deployed to production. Funnily enough, it’s still completely dormant because our customer just could not find a good time for its activation yet. We might end up doing the full rollout process right away. Thanks to the feature flag being already in place, we’ll apply the change first to customers in our Early Access Program, and a bit later to everyone else — including the customer who initiated the whole project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Feature flags allow you to have your cake, and eat it, too. You can roll out new code, but limit its activation dynamically in a data-driven manner.&lt;/p&gt;

&lt;p&gt;Next time you have to introduce a code change that might not make everyone equally happy, consider using a feature flag to control its blast radius.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>infrastructureascode</category>
      <category>featureflags</category>
      <category>deployment</category>
    </item>
    <item>
      <title>Use the Rails console to do a manual Mastodon link verification</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Wed, 16 Nov 2022 16:31:00 +0000</pubDate>
      <link>https://dev.to/geewiz/use-the-rails-console-to-do-a-manual-mastodon-link-verification-11m4</link>
      <guid>https://dev.to/geewiz/use-the-rails-console-to-do-a-manual-mastodon-link-verification-11m4</guid>
      <description>&lt;p&gt;When someone on Mastodon asked for help with a Ruby question, my friend and business partner Markus kindly referred them to me, knowing that I’m always happy to help other Ruby developers. Their question was about executing Mastodon code from a custom script. In this post, I describe how I solved this problem using the Rails console and a custom subclass.&lt;/p&gt;

&lt;p&gt;The problem the person wanted to solve was testing the logic Mastodon uses for verifying the ownership of a user’s websites.&lt;/p&gt;

&lt;p&gt;For details on how Mastodon verifies websites, see the section “Link verification” in the &lt;a href="https://docs.joinmastodon.org/user/profile/"&gt;Mastodon user profile documentation&lt;/a&gt;. In short, you have to add a link from your website back to your Mastodon account, using either a &lt;code&gt;&amp;lt;a&lt;br&gt;
rel="me" ...&amp;gt;&lt;/code&gt; link in the page body or a &lt;code&gt;&amp;lt;link rel="me" ...&amp;gt;&lt;/code&gt; reference in its header.&lt;/p&gt;

&lt;p&gt;Ideally, this test would use the original Mastodon codebase to make sure it worked across application updates.&lt;/p&gt;
&lt;h2&gt;
  
  
  Not the solution: standalone script
&lt;/h2&gt;

&lt;p&gt;On my &lt;a href="https://watch.geewiz.dev"&gt;live stream&lt;/a&gt;, I first attempted to write a standalone script. My thought was to instantiate the &lt;code&gt;VerifyLinkService&lt;/code&gt; class from&lt;a href="https://github.com/mastodon/mastodon/blob/main/app/services/verify_link_service.rb"&gt;&lt;code&gt;app/services/verify_link_service.rb&lt;/code&gt;&lt;/a&gt;. I was hoping I’d get away with requiring a few dependencies from the Mastodon application, and maybe replacing a few classes with mocks. But I quickly ended up including &lt;code&gt;ActionSupport&lt;/code&gt; and the kitchen sink, which made this approach unviable.&lt;/p&gt;
&lt;h2&gt;
  
  
  The solution: Rails console
&lt;/h2&gt;

&lt;p&gt;In order to use the original verification code, I had to run it in the context of the Mastodon application. The easiest way to do this is using the Rails console. However, spinning up a Rails console requires a working Rails application–database and all. Before I describe how to solve this, let’s first build the code we’re going to run inside the Rails console to test the verification.&lt;/p&gt;
&lt;h2&gt;
  
  
  Building the test
&lt;/h2&gt;

&lt;p&gt;Maybe I would have been able to use the original &lt;code&gt;VerifyLinkService&lt;/code&gt; class with a few tweaks, but after closer inspection, I was actually only interested in its methods &lt;code&gt;perform_request!&lt;/code&gt; and &lt;code&gt;link_back_present?&lt;/code&gt;. One fetches the website in question, the other checks if it contains a valid link back to Mastodon.&lt;/p&gt;

&lt;p&gt;Unfortunately, both methods use instance variables set in the constructor using Mastodon user data. And, to make matters worse, they’re (rightfully) private methods, which meant that nobody is allowed to call them. And just when I told my viewers, “Well, nobody but the class itself, of course”, inspiration hit me: Not only a class is allowed to call its private methods, but also its &lt;em&gt;child classes&lt;/em&gt;! All I had to do is create a subclass of &lt;code&gt;VerifyLinkService&lt;/code&gt;, provide our test details in its constructor, and call the two methods required to execute the verification. This is what I ended up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ManualVerifyLinkService&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;VerifyLinkService&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;
    &lt;span class="vi"&gt;@link_back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://mastodon.social/@geewiz"&lt;/span&gt;
    &lt;span class="vi"&gt;@url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://www.geewiz.dev"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;
    &lt;span class="n"&gt;perform_request!&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;link_back_present?&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Verification successful."&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Verification failed."&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Spinning up Mastodon
&lt;/h2&gt;

&lt;p&gt;This left the problem of getting Mastodon running. The fastest way to run a Rails application with its auxiliary services and not have to do lots of manual installation is generally with Docker containers, and Mastodon is no exception. Conveniently, the Mastodon code repository already comes with a&lt;code&gt;docker-compose.yml&lt;/code&gt; definition that contains everything we need. I found a &lt;a href="https://gist.github.com/TrillCyborg/84939cd4013ace9960031b803a0590c4"&gt;How-To&lt;/a&gt; on the web that describes the launch process well. All I had to do was follow it until, and including, the step where the whole setup is started by the&lt;code&gt;docker-compose up -d&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;In this state, I was able to launch a Rails console inside the already running web application container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose exec -it web bundle exec rails console

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running the test
&lt;/h2&gt;

&lt;p&gt;Into this console, I pasted the definition of my &lt;code&gt;ManualVerifyLinkService&lt;/code&gt; class from above.&lt;/p&gt;

&lt;p&gt;And finally, I was able to execute the verification by instantiating an object and calling its &lt;code&gt;check&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=ManualVerifyLinkService.new
v.check

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

&lt;/div&gt;



&lt;p&gt;Since my website is already verified by Mastodon, the result was positive.&lt;/p&gt;

&lt;p&gt;This was a fun experiment, and as is often the case when I help someone, I’ve learned something myself in the process.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>How I do remote administration using ngrok</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Tue, 12 Apr 2022 00:00:00 +0000</pubDate>
      <link>https://dev.to/geewiz/how-i-do-remote-administration-using-ngrok-2hl7</link>
      <guid>https://dev.to/geewiz/how-i-do-remote-administration-using-ngrok-2hl7</guid>
      <description>&lt;p&gt;This month, a new intern from Spain started at my company. While we used to use Macbooks for our interns, he was the first to get a Linux laptop. Nothing fits the DevOps use case better, after all.&lt;/p&gt;

&lt;p&gt;I set up the machine with Manjaro Linux in my office, but I had to solve the problem of later installing and upgrading software after the laptop was handed over. It’ll always access the internet from a private network behind a router, and therefore will not be visible for me from the outside. And I certainly don’t want to commute to Dublin, where we book a coworking space for our interns, every time maintenance is required.&lt;/p&gt;

&lt;p&gt;In the end, I chose a minimalist approach by using &lt;code&gt;ngrok&lt;/code&gt;. This nifty command line tool, paired with the online service at &lt;a href="https://ngrok.com"&gt;ngrok.com&lt;/a&gt;, allows developers to create network tunnels with an endpoint on the public internet. Its main purpose is for web developers to share access to an application running on their personal machine. In other words, it allows people with whom you share the connection details to connect their web browser to your development laptop, even if it’s inside a closed WiFi network. However, &lt;code&gt;ngrok&lt;/code&gt; extends this functionality beyond the HTTP protocol and port 80.&lt;/p&gt;

&lt;p&gt;When our intern asked me to install Discord and VS Code earlier today, I asked him to run a simple command and tell me the tunnel endpoint address. The command was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok tcp 22

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

&lt;/div&gt;



&lt;p&gt;It sets up the network tunnel as well as a local website on which it lists the details of each connection. Our intern then gave me the listed address &lt;code&gt;tcp://0.tcp.ngrok.io:14463&lt;/code&gt;, from which I constructed an SSH command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -p 14463 geewiz@0.tcp.ngrok.io

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

&lt;/div&gt;



&lt;p&gt;Within a second, I was logged into his laptop. A few minutes of installing new packages and upgrading existing ones later, I was done and asked him to cut the connection. It doesn’t get much simpler than that, does it?&lt;/p&gt;

</description>
      <category>devops</category>
    </item>
    <item>
      <title>YT channel recommendation for neovim and zsh users</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Mon, 10 Jan 2022 13:32:00 +0000</pubDate>
      <link>https://dev.to/geewiz/yt-channel-recommendation-for-neovim-and-zsh-users-14fb</link>
      <guid>https://dev.to/geewiz/yt-channel-recommendation-for-neovim-and-zsh-users-14fb</guid>
      <description>&lt;p&gt;I don’t think I ever copied more vim or zsh configuration from anyone than from ChrisAtMachine. Looks like I found a soulmate. 😊 His &lt;a href="https://www.youtube.com/channel/UCS97tchJDq17Qms3cux8wcA"&gt;YouTube channel&lt;/a&gt; is well worth watching!&lt;/p&gt;

</description>
      <category>vim</category>
      <category>zsh</category>
    </item>
    <item>
      <title>dotenv and direnv for better developer QoL</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Wed, 23 Jun 2021 11:46:12 +0000</pubDate>
      <link>https://dev.to/geewiz/dotenv-and-direnv-for-better-developer-qol-114m</link>
      <guid>https://dev.to/geewiz/dotenv-and-direnv-for-better-developer-qol-114m</guid>
      <description>&lt;p&gt;A &lt;a href="https://www.rubytapas.com/"&gt;RubyTapas&lt;/a&gt; tutorial taught me the difference between the &lt;a href="https://github.com/bkeepers/dotenv"&gt;&lt;code&gt;dotenv&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://direnv.net/"&gt;&lt;code&gt;direnv&lt;/code&gt;&lt;/a&gt; tools. While they have significant overlap, they complement each other quite nicely. &lt;code&gt;dotenv&lt;/code&gt; simplifies both development and production ops by importing environments variables either from a &lt;code&gt;.env&lt;/code&gt; file or the application hosting platform. &lt;code&gt;direnv&lt;/code&gt; on the other hand augments the dev environment even further; not only can it add dev-only variables, but also modify shell settings like extending &lt;code&gt;$PATH&lt;/code&gt; on a per-project basis.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Verify your assumptions</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Fri, 18 Jun 2021 14:42:24 +0000</pubDate>
      <link>https://dev.to/geewiz/verify-your-assumptions-5hfi</link>
      <guid>https://dev.to/geewiz/verify-your-assumptions-5hfi</guid>
      <description>&lt;p&gt;That’s what I keep preaching to my team but still fail at myself every so often.&lt;/p&gt;

&lt;p&gt;This week, I wasted a whole day implementing a fix for a bug that wasn’t there. My task was to add one line to a configuration file in a Chef cookbook. When I ran its test suite, it surprisingly failed and it was clear that my simple change couldn’t be the cause. I assumed it was due to recent changes in software packages installed by the cookbook. So I started adapting our old code to these changes, and one change led to another, and another, until I finally realised that over the course of multiple hours, my one-line bugfix had turned into a full code overhaul. How did I get here?&lt;/p&gt;

&lt;p&gt;I decided to start from scratch. &lt;code&gt;git reset --hard HEAD&lt;/code&gt;. I quickly fixed my config file and ran the tests. When they failed again, closer inspection revealed that it was actually just the same test failing twice. The cause was a bug that had found its way into the main branch without breaking the CI pipeline (finding the reason for this will be &lt;em&gt;interesting&lt;/em&gt;). It had been there all along! After another one-line fix, my change was ready for review. Round 2 had taken me less than half an hour.&lt;/p&gt;

&lt;p&gt;The lesson: Don’t rush into battle blindly. Look closely. Identify assumptions and verify them. It might just be windmills!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>dev</category>
    </item>
    <item>
      <title>Weeknote W5 2021</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Sat, 30 Jan 2021 18:32:00 +0000</pubDate>
      <link>https://dev.to/geewiz/weeknote-w5-2021-f0o</link>
      <guid>https://dev.to/geewiz/weeknote-w5-2021-f0o</guid>
      <description>&lt;h2&gt;
  
  
  To tile or not to tile
&lt;/h2&gt;

&lt;p&gt;Looking at Twitch streams and Youtube videos around Linux, it seemed to me that everyone was into tiling window managers. This week, I decided to finally try this approach of filling and subdividing the whole screen area. On macOS, I installed &lt;a href="https://github.com/koekeishiya/yabai/wiki"&gt;yabai&lt;/a&gt;, and on Linux (more on that below), I chose the popular &lt;a href="https://i3wm.org/"&gt;i3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After a few days of the tiling life, my conclusion is that I don’t see much benefit in forcing my application windows to fill up all the available screen real estate. Maybe it’s because I already have a habit of tiling my windows manually – when it makes sense. However, often it just doesn’t make sense. Some windows really don’t like to be squeezed into a tiny space, and even on a 13” screen, a full-size terminal window isn’t of much use to me. I’ll keep my windows floating. If I really want to tile them, there’s always &lt;a href="https://folivora.ai/docs/docs/102_window_snapping_advanced.html"&gt;BetterTouchTool&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linux on Apple hardware
&lt;/h2&gt;

&lt;p&gt;Another item of curiosity this week (is this some kind of lockdown syndrome?) was if 2021 could be the year of Linux on the Desktop for me. While I still enjoy the stability and user-friendliness of the macOS ecosystem, some of its constraints do annoy me from time to time. I have an unused Macbook Pro 13” from 2015, and it’s now running Ubuntu 20.04. My go-to applications like Brave, VS Code and Obsidian worked fine out of the box. But when it came to more specialised use cases, I quickly realised how much macOS spoils me with its choice of well-polished applications.&lt;/p&gt;

&lt;p&gt;Maybe I will pursue a “best of both worlds” approach, where I do my management work on the Mac and my DevOps work on Linux. That is, if the hardware issues that drove me into Apple’s arms more than a decade ago don’t spoil it for me again. For example, there’s a 50:50 chance that after powering up the laptop, Bluetooth doesn’t work, preventing me from using a proper mouse and keyboard. Sigh.&lt;/p&gt;

</description>
      <category>devjournal</category>
    </item>
    <item>
      <title>Clean Chef code: Depend on public cookbook interfaces</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Wed, 22 Jul 2020 20:48:00 +0000</pubDate>
      <link>https://dev.to/geewiz/clean-chef-code-depend-on-public-cookbook-interfaces-2dkb</link>
      <guid>https://dev.to/geewiz/clean-chef-code-depend-on-public-cookbook-interfaces-2dkb</guid>
      <description>&lt;p&gt;For about a year, we’ve been cleaning up the Chef Infra code for &lt;a href="https://www.freistilbox.com/"&gt;freistilbox&lt;/a&gt; to make updating dependencies, Chef versions and even operating systems easier. It’s a lot of work because our early code is functional but not pretty. There have been many instances of “we didn’t know better”, and that’s what refactoring is for. But I also came to realise that we were missing a critical fact: &lt;strong&gt;Common software engineering principles and practices apply to infrastructure code like they do to any other type of code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or as early Chef developer &lt;a href="https://twitter.com/jtimberman/status/1283089569395740672"&gt;Joshua Timberman&lt;/a&gt; puts it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey, ya’ll remember when devops really just meant you knew how to write all your bash in ruby instead?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ouch. Making this connection earlier would have saved us weeks of work. That’s why I’m going to share my findings in a series of posts.&lt;/p&gt;

&lt;p&gt;In this post, I’m going to advocate for treating a Chef cookbook as a unit of software that provides explicit interfaces instead of tempting its users to depend on implementation details.&lt;/p&gt;

&lt;p&gt;Chef Infra cookbooks use node attributes as variable parameters for system configuration. In software engineering terms, &lt;em&gt;node attributes are global variables.&lt;/em&gt; They’re implementation details of a cookbook. In consequence, using a cookbook’s node attributes for any purpose other than defining setup parameters creates a dependency on implementation details which can change at any time.&lt;/p&gt;

&lt;p&gt;For example, it’s common practice to use a search on node attributes for service discovery. As node attributes are global variables, any cookbook can do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service_nodes = search(:node, "webservice_id:myservice")

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

&lt;/div&gt;



&lt;p&gt;From this code, we can tell that web service nodes are identified by a node attribute named &lt;code&gt;webservice_id&lt;/code&gt;; nodes sharing the same &lt;code&gt;webservice_id&lt;/code&gt; value belong to the same web service.&lt;/p&gt;

&lt;p&gt;The problem with using this information outside the cookbook which provides it is that this particular implementation can change at any time. This kind of tight coupling is a liability. For example, a second attribute &lt;code&gt;webservice_status&lt;/code&gt; might get introduced, reducing the node set by adding &lt;code&gt;AND webservice_status:active&lt;/code&gt; to the query. Since this change in semantics is not necessarily a breaking change, there’s no simple way like semantic versioning to inform everyone who depends on this unofficial interface.&lt;/p&gt;

&lt;p&gt;How about we provide an public API instead? Our web service cookbook could for example provide a class we can use for service discovery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webservice = Company::Cookbook::Webservice::Discovery.new("myservice")
service_nodes = webservice.nodes

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

&lt;/div&gt;



&lt;p&gt;This is easy to implement as a cookbook library. By using namespaces, we make sure that method names don’t conflict. In my practice, I tend to use the camel-cased cookbook name under the namespace &lt;code&gt;Cookbook&lt;/code&gt; and the company namespace.&lt;/p&gt;

&lt;p&gt;With service discovery encapsulated and &lt;em&gt;hidden behind a public interface&lt;/em&gt;, we could even reimplement the cookbook’s service discovery using a different technology like Consul without breaking any code outside our cookbook.&lt;/p&gt;

&lt;p&gt;But even if other cookbooks depending on our implementation isn’t a concern, implementing auxiliary logic in a central library instead of scattering it across recipe files makes it much easier to maintain. I’m going to talk about “Plain Old Ruby versus Chef DSL” in a separate post.&lt;/p&gt;

</description>
      <category>chef</category>
      <category>ruby</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>DIRECT - The seven core topics of remote team communication</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Fri, 22 May 2020 11:59:00 +0000</pubDate>
      <link>https://dev.to/geewiz/direct-what-do-you-share-with-your-distributed-team-4513</link>
      <guid>https://dev.to/geewiz/direct-what-do-you-share-with-your-distributed-team-4513</guid>
      <description>&lt;p&gt;Pick any guide on remote work (oh, there are so many…) and it’ll tell you that communication is essential when you work in a distributed team. The problem is that it’s not obvious where exactly the centre of balance is between sharing too little and sharing too much. That’s why I’ve created a framework that uses a simple acronym to remind you of good opportunities to keep your distributed team in the loop.&lt;/p&gt;

&lt;p&gt;You can watch it here or on YouTube. I’m already working on my next videos, so don’t forget to subscribe to my YouTube channel!&lt;/p&gt;

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

</description>
      <category>teamwork</category>
      <category>remote</category>
      <category>communication</category>
    </item>
  </channel>
</rss>
