<?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>Forem: Schuster Braun</title>
    <description>The latest articles on Forem by Schuster Braun (@schusterbraun).</description>
    <link>https://forem.com/schusterbraun</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%2F119017%2F2a0aeb83-a23b-4d12-9878-4e8ce4605695.jpg</url>
      <title>Forem: Schuster Braun</title>
      <link>https://forem.com/schusterbraun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/schusterbraun"/>
    <language>en</language>
    <item>
      <title>Agentic AI in Your Daily Workflow</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Tue, 01 Apr 2025 15:59:18 +0000</pubDate>
      <link>https://forem.com/schusterbraun/agentic-ai-in-your-daily-workflow-3jja</link>
      <guid>https://forem.com/schusterbraun/agentic-ai-in-your-daily-workflow-3jja</guid>
      <description>&lt;h3&gt;
  
  
  The Next Evolution in Workplace Automation
&lt;/h3&gt;




&lt;h2&gt;
  
  
  Agenda (15 Minutes)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Understanding Agentic AI (3 min)&lt;/li&gt;
&lt;li&gt;Benefits &amp;amp; Challenges (4 min)&lt;/li&gt;
&lt;li&gt;Impact on Teams &amp;amp; Business (3 min)&lt;/li&gt;
&lt;li&gt;Getting Started Guide (4 min)&lt;/li&gt;
&lt;li&gt;Q&amp;amp;A (1 min)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Understanding Agentic AI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beyond passive AI&lt;/strong&gt;: From tools that respond to tools that act&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What makes AI "agentic"&lt;/strong&gt;: Autonomous goal-directed behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key capabilities&lt;/strong&gt;: Planning, executing, learning from feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Examples&lt;/strong&gt;: AI agents that schedule meetings, research topics, draft documents, and coordinate tasks without constant supervision&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Agentic AI doesn't just answer your questions—it completes your tasks."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Benefits of Agentic AI Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Advanced workflow automation:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handles multi-step processes autonomously&lt;/li&gt;
&lt;li&gt;Manages coordination between different tools and systems&lt;/li&gt;
&lt;li&gt;Proactively anticipates needs and takes initiative&lt;/li&gt;
&lt;li&gt;Learns from feedback to continuously improve performance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cognitive offloading:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Manages entire projects, not just individual tasks&lt;/li&gt;
&lt;li&gt;Maintains continuity across complex workflows&lt;/li&gt;
&lt;li&gt;Handles follow-ups and persistent tasks&lt;/li&gt;
&lt;li&gt;Reduces context-switching and cognitive load&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Challenges to Consider
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Implementation complexities:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Setting appropriate boundaries and permissions&lt;/li&gt;
&lt;li&gt;Creating effective delegation instructions&lt;/li&gt;
&lt;li&gt;Managing agent oversight and intervention points&lt;/li&gt;
&lt;li&gt;Higher stakes for errors compared to passive AI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team adaptation:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Transitioning from directing work to supervising agents&lt;/li&gt;
&lt;li&gt;Potential resistance to high-autonomy tools&lt;/li&gt;
&lt;li&gt;Need for new skills in agent management&lt;/li&gt;
&lt;li&gt;Clarifying human-agent accountability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Impact on Teams &amp;amp; Business
&lt;/h2&gt;

&lt;h3&gt;
  
  
  On work relationships:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Shifts human role toward strategic direction and quality control&lt;/li&gt;
&lt;li&gt;Changes collaboration patterns (human-agent-human workflows)&lt;/li&gt;
&lt;li&gt;Creates new team roles for agent supervision and optimization&lt;/li&gt;
&lt;li&gt;Redefines productivity metrics and work evaluation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Business implications:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dramatically accelerated execution capabilities&lt;/li&gt;
&lt;li&gt;Potential for 24/7 operational continuity&lt;/li&gt;
&lt;li&gt;Higher upfront investment but greater long-term efficiency&lt;/li&gt;
&lt;li&gt;New security and governance considerations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Getting Started Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Assess Potential Agent Tasks (Day 1)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identify workflow sequences&lt;/strong&gt; with clear inputs and outputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map decision trees&lt;/strong&gt; in your routine processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document coordination points&lt;/strong&gt; between systems and tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List recurring projects&lt;/strong&gt; that follow consistent patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Select Your First Agent Implementation (Day 2-3)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with bounded tasks&lt;/strong&gt;: Clear scope, manageable risk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose process-heavy work&lt;/strong&gt;: Multiple steps, rules-based decisions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider visibility&lt;/strong&gt;: Select tasks where you can easily monitor results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommended starter implementations&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Research agents: AutoGPT, GPT Researcher&lt;/li&gt;
&lt;li&gt;Project coordination: Adept AI, Cognition Labs&lt;/li&gt;
&lt;li&gt;Document workflows: Mem, NotionAI&lt;/li&gt;
&lt;li&gt;Customer interaction: ChatDev, Anthropic Claude&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Design Effective Agent Instructions (Day 4-5)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Define clear objectives&lt;/strong&gt; with success criteria&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Establish boundaries&lt;/strong&gt; and permission structures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create intervention points&lt;/strong&gt; for human review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set feedback mechanisms&lt;/strong&gt; for continuous improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Implement Oversight Protocols (Day 6-7)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Regular performance audits&lt;/strong&gt; of agent outputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Establish verification checkpoints&lt;/strong&gt; for critical decisions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document edge cases&lt;/strong&gt; for future training&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create escalation pathways&lt;/strong&gt; for complex situations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Measuring Success
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;End-to-end process time&lt;/strong&gt; reduction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human attention hours&lt;/strong&gt; freed for strategic work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completion quality&lt;/strong&gt; compared to human-only work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novel solutions&lt;/strong&gt; discovered by agents&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;Successful agentic AI adoption:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focuses on systems thinking, not just individual tasks&lt;/li&gt;
&lt;li&gt;Requires clear delegation and oversight protocols&lt;/li&gt;
&lt;li&gt;Transforms your role from "doer" to "director"&lt;/li&gt;
&lt;li&gt;Maintains human judgment at critical decision points&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Q&amp;amp;A
&lt;/h2&gt;

</description>
    </item>
    <item>
      <title>Skills and Day to Day for an AI Dev</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Wed, 08 Jan 2025 15:36:35 +0000</pubDate>
      <link>https://forem.com/schusterbraun/skills-and-day-to-day-for-an-ai-dev-ee5</link>
      <guid>https://forem.com/schusterbraun/skills-and-day-to-day-for-an-ai-dev-ee5</guid>
      <description>&lt;p&gt;This is a response to a &lt;a href="https://www.linkedin.com/posts/tanyadua_jobsontherise-techonlinkedin-techstack-activity-7282492676501901312-HwA7" rel="noopener noreferrer"&gt;Linkedin Post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think the field for building Agentic AI systems lends itself to technologists with a wide array of skills. These systems use programmatic glue to chain and orchestrate multiple AI calls and systems together. Tools I've needed so far is a fine understanding of Python (Jupyter notebooks is nice) and access to an LLM. The specific AI skill I've leveraged most is inspecting and evaluating the output and updating my system accordingly. I've read quite a few research papers to help learn some of the design patterns being researched as well. I haven't deep dove the different models and have focused mostly on chaining and orchestration challenges.&lt;/p&gt;

&lt;p&gt;Day to day: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make an "Agent" (LLM call with user message and system message)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save the output to a file, inspect that file (see if I like it or not). If no iterate on the prompts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make another Agent. Pipe the output from the last step into the new agent. Inspect new file output.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find bug, refactor previous 2 agents, make third because I was asking too much from the last 2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once I understand what's goodish. Make evaluating/critiquing agent. If evaluations are good you can automate this pipeline by asking the evaluator if the task is complete.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get a couple good pipelines and then start working on orchestrating between the pipes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oh, while you're doing all this it becomes more difficult to understand the system by looking at the text file outputs so you're going need to constantly tune your logging (observability) system so that you can determine Signal vs Noise.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agentic</category>
    </item>
    <item>
      <title>Journal: Getting Back into Live Talks</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Wed, 20 Nov 2024 03:01:46 +0000</pubDate>
      <link>https://forem.com/schusterbraun/journal-getting-back-into-live-talks-5e4e</link>
      <guid>https://forem.com/schusterbraun/journal-getting-back-into-live-talks-5e4e</guid>
      <description>&lt;p&gt;Gave my first live talk in about four years. It felt great to be back in front of people. There's definitely a different vibe now. &lt;br&gt;
&lt;a href="https://www.canva.com/design/DAGWaCZfM3I/ZBZDSrUyMgCbsAKkKqnPuQ/edit" rel="noopener noreferrer"&gt;Presentation Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The landscape of live presentation has changed quite a bit in that time. As I was up there I was struck with the thoughts of &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"How do we give presentations now post-covid, post Tik Tok and higher social media consumption than what I was seeing before?" &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"What genuinely engages audience with a talk and how does AI fit into it?"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"What's the Right Size level of effort for these things now a days?"&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The meta conversation plagued my presentation (sorry folks to be subjected to my musings). How much do you share with an audience that you've used AI? What's the Responsible AI disclaimer?&lt;/p&gt;

&lt;p&gt;I found the AI generated graphics engaging. I used Canva's "Magic Design" AI and it created some pretty amazing stuff. I also used ChatGPT for the content. Up front I shared with everyone that the slides were GPT generated and that they're there just to look pretty. I tried to keep the tone conversational and engaging. It felt like the promise of AI was being fulfilled at that moment for me. I was freed to really engage with the audience and think about the content without having to worry about the artifact losing me trust points. &lt;/p&gt;

&lt;p&gt;My big concern is though I do wonder if folks feel like they lost out on something due to using simulated content. This talk felt very meta for me since it was about right sizing projects. I tried to advocate to do more with less. At the same time I tried to do more presentation with less effort. Like I shared with my talk walking that line can feel dangerous at times. But I feel emboldened that I'm usually my harshest critic. &lt;/p&gt;

&lt;p&gt;Take a look at the presentation if you've read this far and let me know if you think I did enough work. If I don't get feedback I got other AI powered presentations brewing.&lt;/p&gt;

</description>
      <category>techtalks</category>
      <category>meetup</category>
    </item>
    <item>
      <title>Built a Ngrok replacement</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Sun, 25 Aug 2024 16:48:55 +0000</pubDate>
      <link>https://forem.com/softground/built-a-ngrok-replacement-212m</link>
      <guid>https://forem.com/softground/built-a-ngrok-replacement-212m</guid>
      <description>&lt;p&gt;TL;DR (Not worth it)&lt;/p&gt;

&lt;p&gt;I'm building an app that requires an authentication callback. You can't just use localhost. The internet can't route to it. I've used &lt;a href="https://ngrok.com/docs/" rel="noopener noreferrer"&gt;Ngrok&lt;/a&gt; before. I wasn't a fan of how the URL keeps changing when you use the Ngrok free tier. Also, there's a limit to Ngrok requests. So I thought to myself I should just build a Ngrok replacement. &lt;/p&gt;

&lt;p&gt;What we needed is a reverse proxy server.  This server would act as our local app while we develop. That server has a domain name that we could register as a callback url. &lt;/p&gt;

&lt;p&gt;So I built a virtual machine in Azure, setup the routing, installed and configured Nginx. Then I stopped because I had to configure my home's network firewall to allow for traffic to stream via an ssh tunnel from laptop to the proxy server. That was way too much for me. I could do it, I've done it before. But I work a lot from other networks and don't have access to those routers and firewalls. &lt;/p&gt;

&lt;p&gt;So I came back to Ngrok. Their software is an agent that doesn't require any networking setup. It's pretty cool and now I have a deepr understanding how convenient their product is to use. &lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;Wanted to share the code and how to do it here if you're interested in setting up a reverse proxy server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.tf&lt;/span&gt;
&lt;span class="c1"&gt;# We strongly recommend using the required_providers block to set the&lt;/span&gt;
&lt;span class="c1"&gt;# Azure Provider source and version being used&lt;/span&gt;
&lt;span class="k"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;azurerm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hashicorp/azurerm"&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt;4.0.1"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"azurerm"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;features&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="nx"&gt;NGROK_ALT_UNAME&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"description"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="nx"&gt;NGROK_ALT_PWD&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"description"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;



&lt;span class="c1"&gt;# Resource Group&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_resource_group"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ngrok-alt-rg"&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"West Europe"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Virtual Network&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_virtual_network"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ngrok-alt-vnet"&lt;/span&gt;
  &lt;span class="nx"&gt;address_space&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Subnet&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                 &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"subnet1"&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;virtual_network_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_virtual_network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;address_prefixes&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.1.0/24"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Public IP&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_public_ip"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ngrok-alt-ip"&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;allocation_method&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Static"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;# Virtual Machine&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_linux_virtual_machine"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ngrok-alt-vm"&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
  &lt;span class="nx"&gt;size&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Standard_B1s"&lt;/span&gt;

  &lt;span class="nx"&gt;admin_username&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NGROK_ALT_UNAME&lt;/span&gt;
  &lt;span class="nx"&gt;admin_password&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NGROK_ALT_PWD&lt;/span&gt;  &lt;span class="c1"&gt;# Use a more secure method in production!&lt;/span&gt;

  &lt;span class="nx"&gt;network_interface_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;azurerm_network_interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;os_disk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;caching&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ReadWrite"&lt;/span&gt;
    &lt;span class="nx"&gt;storage_account_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Standard_LRS"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;source_image_reference&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Canonical"&lt;/span&gt;
    &lt;span class="nx"&gt;offer&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"UbuntuServer"&lt;/span&gt;
    &lt;span class="nx"&gt;sku&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"18.04-LTS"&lt;/span&gt;
    &lt;span class="nx"&gt;version&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"latest"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;computer_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ngrok-alt-vm"&lt;/span&gt;
  &lt;span class="nx"&gt;admin_ssh_key&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;username&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NGROK_ALT_UNAME&lt;/span&gt;
    &lt;span class="nx"&gt;public_key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"~/.ssh/ngrok-key.pub"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Network Interface&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_network_interface"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ngrok-alt-nic"&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;

  &lt;span class="nx"&gt;ip_configuration&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;                          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"internal"&lt;/span&gt;
    &lt;span class="nx"&gt;subnet_id&lt;/span&gt;                     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
    &lt;span class="nx"&gt;private_ip_address_allocation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Dynamic"&lt;/span&gt;
    &lt;span class="nx"&gt;public_ip_address_id&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_public_ip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Network Security Group&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_network_security_group"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ngrok-alt-nsg"&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;

  &lt;span class="nx"&gt;security_rule&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;                       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AllowSSH"&lt;/span&gt;
    &lt;span class="nx"&gt;priority&lt;/span&gt;                   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
    &lt;span class="nx"&gt;direction&lt;/span&gt;                  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Inbound"&lt;/span&gt;
    &lt;span class="nx"&gt;access&lt;/span&gt;                     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Allow"&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;                   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;source_port_range&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"*"&lt;/span&gt;
    &lt;span class="nx"&gt;destination_port_range&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"22"&lt;/span&gt;
    &lt;span class="nx"&gt;source_address_prefix&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"*"&lt;/span&gt;
    &lt;span class="nx"&gt;destination_address_prefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"*"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_network_interface_security_group_association"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;network_interface_id&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_network_interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;network_security_group_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_network_security_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# DNS Zone&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_dns_zone"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"yourdomain.com"&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# A Record&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_dns_a_record"&lt;/span&gt; &lt;span class="s2"&gt;"proxy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tunnel"&lt;/span&gt;
  &lt;span class="nx"&gt;zone_name&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_dns_zone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;ttl&lt;/span&gt;                 &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
  &lt;span class="nx"&gt;records&lt;/span&gt;             &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;azurerm_public_ip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ip_address&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll need public a key at &lt;code&gt;~/.ssh/ngrok-key.pub&lt;/code&gt; and &lt;code&gt;/.ssh/ngrok-key.pem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Set Env var for subscription: &lt;code&gt;export ARM_SUBSCRIPTION_ID=00000000-xxxx-xxxx-xxxx-xxxxxxxxxxxx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;terraform apply -var-file local.tfvars&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To ssh you'll have to update the permission on the key. Or else ssh will determine the connection insecure and refuse the connection.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chmod 400 ~/.ssh/ngrok-key.pem&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh -i ~/.ssh/ngrok-key.pem adminuser@[public-ip]&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/nginx/sites-available/tunnel.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Append the below configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;tunnel.yourdomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The below steps do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Link configuration&lt;/li&gt;
&lt;li&gt;Test configuration&lt;/li&gt;
&lt;li&gt;If test successful restart service
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/tunnel.yourdomain.com /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The below setups an ssh tunnel. However, you'll also have to go to your router/firewall and open up your development port so this tunnel would work.&lt;br&gt;
&lt;code&gt;ssh -R &amp;lt;azure-port&amp;gt;:localhost:&amp;lt;local-laptop-port&amp;gt; &amp;lt;laptop-username&amp;gt;@&amp;lt;laptop-public-ip-or-domain&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To make the tunnel more reliable setup with &lt;a href="https://linux.die.net/man/1/autossh" rel="noopener noreferrer"&gt;autossh&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Product Development for New Developers</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Sat, 10 Aug 2024 15:25:58 +0000</pubDate>
      <link>https://forem.com/schusterbraun/product-development-for-new-developers-481l</link>
      <guid>https://forem.com/schusterbraun/product-development-for-new-developers-481l</guid>
      <description>&lt;p&gt;As you begin your journey into software development, you'll often find yourself wearing many hats—one of the most critical being that of a Product Manager. In a traditional company setting, the role of a Product Manager involves using tools and data to translate business challenges into technical challenges. However, when you're just starting out, you may not have access to the same metrics and resources. But don’t worry—the essence of product management is something you can still apply: storytelling.&lt;/p&gt;

&lt;p&gt;Storytelling isn’t just for books or movies; it’s a powerful tool in product development. When you approach your projects with a story in mind, it keeps you focused, drives your feature development, and prevents you from getting lost in the myriad of directions you could go. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Power of Storytelling in Product Development&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Imagine you’re working on your first major project after graduating from a code boot camp. You’ve learned a lot. Now, you want to showcase these skills by building a portfolio website. Sounds like a great idea, right?&lt;/p&gt;

&lt;p&gt;But here’s the thing: without a clear story guiding your development, you might end up building something that’s technically impressive but doesn’t necessarily serve the purpose you intended. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Example 1: The Unfocused Portfolio&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s say you jump right in and build a portfolio with all the bells and whistles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A carousel showcasing your projects&lt;/li&gt;
&lt;li&gt;Smooth section transitions&lt;/li&gt;
&lt;li&gt;A personal blog&lt;/li&gt;
&lt;li&gt;Animated hover effects&lt;/li&gt;
&lt;li&gt;A light mode/dark mode toggle&lt;/li&gt;
&lt;li&gt;An integrated Google Analytics to track visitors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s an awesome website, no doubt. But it's a lot of work. After a few months, you realize you focused on development and haven’t applied to many jobs, and those you have applied to haven’t gotten back to you. You check your Google Analytics, and the traffic is disappointingly low. You start to wonder: “What went wrong?”&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Example 2: The Story-Driven Strategy&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now, let’s approach the same situation with a product manager’s mindset.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step 1: Define Your Problem Statement&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;: A code boot camp graduate has successfully completed an intensive coding program, acquiring technical skills in web development, software engineering, and data management. However, they face significant challenges in translating their newly acquired skills into securing a full-time job in the tech industry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Despite their technical training, the graduate struggles to navigate the competitive job market, which requires not only technical proficiency but also a strong portfolio, effective networking, and the ability to articulate their value to potential employers. The lack of real-world experience, limited industry connections, and difficulty in crafting a compelling personal brand hinder their ability to stand out among other candidates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;**Objective&lt;/em&gt;*: The goal is to develop a strategy that helps the graduate bridge the gap between their boot camp education and landing a job. This strategy should include guidance on building a professional portfolio, networking within the tech community, improving soft skills such as communication and interviewing, and crafting a personal brand that resonates with employers. The solution should empower the graduate to confidently pursue job opportunities and successfully transition from boot camp to a rewarding career in tech.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step 2: Develop Your Story&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Your story might look something like this:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“I’m a recent code boot camp graduate, eager to land my first job in tech. My goal is to create a portfolio that not only showcases my technical skills but also tells the story of my growth as a developer. This portfolio should highlight the projects that are most relevant to the jobs I’m applying for, and it should make it easy for employers to see my potential.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This story guides your feature development. Instead of adding every cool feature you can think of, you focus on what supports your story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Highlight relevant projects&lt;/strong&gt;: Choose 2-3 projects that align with the types of jobs you’re applying for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write case studies&lt;/strong&gt;: For each project, write a brief case study that explains the problem you solved, the technologies you used, and the impact of your solution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make navigation simple&lt;/strong&gt;: Ensure that employers can quickly find your contact information, resume, and LinkedIn profile.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why This Approach Works&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;By developing your product with a clear story in mind, you create something with purpose. You'll also find that your portfolio is just a piece of your strategy to find a job. It can play different roles depending on the strategy you want to take. &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Your Turn: Crafting Your Story&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For your next project, take a step back before you start coding and think about the story you want to tell. Determine the strategy you want to take to develop that story.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Every Software Developer Should Learn Project Management Skills</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Wed, 24 Jul 2024 14:36:37 +0000</pubDate>
      <link>https://forem.com/schusterbraun/why-every-software-developer-should-learn-project-management-skills-6b6</link>
      <guid>https://forem.com/schusterbraun/why-every-software-developer-should-learn-project-management-skills-6b6</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As a software developer, maintaining motivation and focus throughout a project can be challenging. Initially, I dive into coding with passion and excitement, but as the project scales and complexity increases, it's easy to lose direction and enthusiasm. This often leads to frustration and abandoned projects. Project management skills can be the solution, helping you stay on track and pushing through to completion.&lt;/p&gt;

&lt;p&gt;In my experience, the hardest part of software development is maintaining motivation until the end. I start coding with tons of passion, but as projects grow in complexity, I often lose the thread of what I was doing. This leads to frustration and doubts about the project's worth. Eventually, I might drop the project, feeling discouraged by the lack of progress. Imagine if, during these tough times, you could maintain a "just another feature" mentality. This is where project management can be incredibly helpful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Management Goals
&lt;/h2&gt;

&lt;p&gt;At its core, project management is about maintaining focus, forward motion, and a sense of accomplishment. The software industry offers various tools and methodologies to support these practices, though their implementation can vary. The key is to keep the overarching goals in mind. Project management tools help you prioritize and focus your time effectively.&lt;/p&gt;

&lt;p&gt;The process involves breaking down a goal into actionable steps. Start with a product vision, typically provided by a product owner or stakeholder, who understands the project's purpose and success metrics. The vision is then broken down into a hierarchy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Epics:&lt;/strong&gt; Descriptions that encompass User Stories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Stories:&lt;/strong&gt; Descriptions that can include a series of tasks or be a task themselves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tasks:&lt;/strong&gt; Specific steps a developer needs to take.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Completing enough tasks and epics will help solve business problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Project Management Matters for Early Career Developers
&lt;/h2&gt;

&lt;p&gt;Many early career developers I've spoken with have gaps in their experience. This isn't their fault, but rather a result of not pushing projects to production systems and scaling them. Project management can help address this by providing a structured framework. It enforces accountability and encourages developers to build to a certain scale, filling in those experience gaps. Ultimately, project management helps you accomplish tasks you might otherwise overlook.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Project management isn't just for large teams or businesses—it's a valuable skill for every software developer. By implementing project management practices, you can maintain focus, stay motivated, and push your projects to completion. Whether you're working on a solo project or part of a team, these skills will help you achieve your goals and build better software.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Build a Career on a Growth Mindset</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Mon, 25 Sep 2023 18:14:50 +0000</pubDate>
      <link>https://forem.com/schusterbraun/build-a-career-on-a-growth-mindset-2j2m</link>
      <guid>https://forem.com/schusterbraun/build-a-career-on-a-growth-mindset-2j2m</guid>
      <description>&lt;p&gt;I'm currently a software developer but have not always been one. I joined the US Navy as a linguist where I had to learn a language in a single year to working proficiency. I then had to learn technical systems to accomplish my job. I became a senior operator and then started leading people. I was then selected for my aptitude for leading and became a manager of folks based around research and development, which led to leading more people. After the Navy, I became a coder. I've been doing this for about 7 years now, but it hasn't always been the same work. I started as a frontend dev, then became a teacher. That made me more well-rounded pushing my career towards tooling. Then since I was doing tooling I started to become a professional in infrastructure. These days I've been moving from infrastructure towards AI. &lt;/p&gt;

&lt;p&gt;I say all that not to brag but to show a career based on growth. I seized the opportunities presented. I have had pushback against my career trajectory. Some folks like to specialize and dig really deep into something or have a passion for a certain field. Your career doesn't have to look like mine. But I do want to share tactical advice on how to do it if you're interested still.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cables in the corner
&lt;/h2&gt;

&lt;p&gt;My dad is an experienced network engineer who has been in the field for many years. When I started out in tech he gave me this piece of advice "There's always cables in the corner". The story goes as a junior engineer when he first started in a data center he was given a manual and told not to touch anything. Well, that was all well and good, we should learn our jobs, train, and onboard. But if his job was to work on the servers then he needed to touch them right? Wrong! After exploring the data center for a while he found a corner where all these ethernet cables were tangled up. There must have been a recent migration? Or maybe they were just thrown there as extras. Who knows, but he just started coiling them up and organizing them. The lesson is that there are always going to be simple house-cleaning chores/tasks out there that you can do. Successfully helping on the simple stuff helps build trust. As you build more expertise things that used to feel complicated become more simple. This is growth, learning, and evolving. Often I've found in my career that I get rewarded for working on stuff that no one else wants to work on. When I was a frontend dev on a frontend team, no one wanted to do deployments, build server work, or dependency management. So I did those tasks in between feature work. I then became the infra and tooling person. Some see it as a grunt work, I see it as an opportunity to be helpful and a place where I can work without being told what to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Growth is painful
&lt;/h2&gt;

&lt;p&gt;I don't know if it's like this for everyone but learning really hurts my brain. When I spend hours staring at documentation or using flashcards to learn a new skill I can feel drained. I feel like my brain is jelly. I believe it when folks say that the brain is a muscle. You have to take it to the brain gym to make it stronger. But boy it can get sore. When it's your job to work your brain out though, it can get really tired. I've had it where it's at the gym day in and day out. I come home exhausted barely able to think. I walk my dog daily with my wife and we chat. But the whole year I worked at AWS it felt like my brain was hijacked. I couldn't focus outside of work and it just consumed my every thought. I didn't mean to take my work home. But sometimes management can make you feel like you need to operate at that level. &lt;/p&gt;

&lt;h2&gt;
  
  
  Priorities over problems
&lt;/h2&gt;

&lt;p&gt;We all want Work-life balance (please leave a comment if you don't, I would love to know why). For me, the problem is that even though I value it, and my work gives me "unlimited Paid Time Off (PTO)" I still find myself burning out. Why you might ask? Well, because there are always "cables in the corner". I've reached a level of expertise in my career that now I look at the data center analogy and see tech debt and toxic culture and just general problems everywhere. On top of that folks are now relying on my expertise to help solve the problems they see. So there's definitely more work than time to do it. So now comes the skill of prioritizing. One of my favorite Cognitive Behavioral Therapies (CBTs) that I got from my therapist to treat my ADHD diagnosis was to learn how to make TODO lists and prioritize them. Splitting tasks into categories and priorities. That single skill of prioritizing has saved me so much burnout. The reason he gave at the time was that with my ADHD I was focusing on tasks that I could accomplish and get the dopamine hit. So if I have competing tasks and one is going to deliver more excitement, I'm going to do that one first pushing off the other one til a later date. However, by consciously prioritizing I can offload the "what do I do next" internal conversation to a list, which makes that decision so much easier to make. All of that to say that I don't know what Work life balance looks like for you. But I know there is a list of tasks that improve me, my relationship, and my living environment. So I call those tasks life and I consciously prioritize those against my work tasks. &lt;/p&gt;

&lt;h2&gt;
  
  
  Day to day
&lt;/h2&gt;

&lt;p&gt;It's all well and good to be excited about task lists and priorities. However, the most dangerous times for me, where I get off task the most is when I just want to flow between tasks. That flow-state feeling is pretty addictive. One of the reasons I succeeded in this tech career is because I historically would hyper-focus on work problems at the expense of my life challenges. I've learned after going through several burnout phases that it's not enjoyable in the long run. I haven't talked with my therapist about this, but my guess is it's the addictive mindset of looking for higher highs, but then dealing with lower lows. You want consistency and the middle road. So, if you've read this long, the reason I'm even writing this is to talk about the day-to-day struggle of how to build a mellowed-out routine. I'm learning when stuck on a tough problem to not bang my head against it. There will be times when I feel like I just need to keep sitting at my computer and staring, thinking that I'll solve it. I've had guilt walking away from my computer during the day. But I've been adding more and more time into my day when I stand up and do other things. I know you've probably heard this from other folks, it's not novel advice. But by working through your priorities you can actually visually see your work-life balance. That practice of getting away from your computer will help you at the end of the day to mentally detach from work and have that balance at home. I know this is coming from a place of privilege. But I hope it is nice for someone to hear that there is light at the end of the tunnel. Sometimes I just need to be told that it's okay to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Individual Tasks
&lt;/h2&gt;

&lt;p&gt;Oh boy, it feels so nice to accomplish tasks. One reason they say to make your bed in the morning is so you can start your day with a win. I love doing tasks. It's quite a bit of work sometimes to break something down from a problem to a series of tasks. Give yourself that space to do that. It's a task to think about tasks. Now to double down on the last paragraph I want to tell you that not only are you learning to walk away but you're also learning to do the &lt;strong&gt;bad words&lt;/strong&gt; CONTEXT SWITCH! I think what triggered my ADHD diagnosis from my therapist was my ranting on how much it felt like context switching was intellectual violence. It honestly felt painful to context switch for me before. A little anecdote, I get vertigo sometimes when I context switch. I organized a conference a few years ago and at the end of it had vertigo for like 2 weeks. Context switching can be rough. But this is the thing, if you're time-boxing your tasks, you don't end up getting into work as deeply and so it becomes easier to context switch. So there definitely are trade-offs there. But just know at least for myself it's helpful to know that context switching can be dangerous. Furthermore, know that some tasks can be painful like when you're in the brain gym. So scoping tasks to effort level and taking rest breaks will help to know when you need to stop and recover.&lt;/p&gt;

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

&lt;p&gt;It's hard to make tasks, scope them, and stick with them. Work about work is important to help you defend your mental health and to consistently move forward. You should be able to report back to your family every day that you learned something new, no matter how small. The name of the game isn't about what you've achieved, it's about the progress you make every day and keep on going.&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>career</category>
    </item>
    <item>
      <title>Idea Generation Guide</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Tue, 12 Sep 2023 14:13:41 +0000</pubDate>
      <link>https://forem.com/schusterbraun/idea-generation-guide-1b29</link>
      <guid>https://forem.com/schusterbraun/idea-generation-guide-1b29</guid>
      <description>&lt;h1&gt;
  
  
  Idea Generation Guide
&lt;/h1&gt;

&lt;p&gt;A challenge when learning any new skill is to be able to apply that knowledge. Many programming students end up in tutorial hell&lt;sup&gt;&lt;a href="https://www.freecodecamp.org/news/tag/tutorial-hell/" rel="noopener noreferrer"&gt;1&lt;/a&gt; &lt;a href="https://www.reddit.com/r/learnprogramming/comments/qrlx5m/what_exactly_is_tutorial_hell/" rel="noopener noreferrer"&gt;2&lt;/a&gt;&lt;/sup&gt;. This guide aims to outline general challenges that new students can apply programming concepts to solve with any language.&lt;/p&gt;

&lt;p&gt;The core of computing is a &lt;a href="https://www.bloomberg.com/graphics/2015-paul-ford-what-is-code/#lets-begin" rel="noopener noreferrer"&gt;series of switches&lt;/a&gt; that turn on and off. &lt;a href="https://www.codecademy.com/resources/blog/how-to-think-like-a-programmer/" rel="noopener noreferrer"&gt;Thinking like a programmer&lt;/a&gt; is the process of turning something that's complicated and messy (like the real world) and breaking it down into individual problems. Then solve each individual challenge. After solving enough problems you've built a program. Hopefully this guide will help to create a basic mental model for some early programming concepts along with guiding some early practice to fully grasp fundamental principles before jumping into some overly complicated tutorials.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do stuff (operations)
&lt;/h3&gt;

&lt;p&gt;The most simple programs do something and return an output. The simplest program that every student should first write is print &lt;a href="http://helloworldcollection.de/" rel="noopener noreferrer"&gt;"Hello, World!"&lt;/a&gt; to the output. From there, apply basic math operations and see the output. Just knowing these basic math operations you can automate quite a lot in your life.&lt;/p&gt;

&lt;h4&gt;
  
  
  Code Challenges
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Calculate the tip for a meal&lt;/li&gt;
&lt;li&gt;Prints a school schedule&lt;/li&gt;
&lt;li&gt;Make a program that prints a shopping list&lt;/li&gt;
&lt;li&gt;Create a program that prints the solution of

&lt;ul&gt;
&lt;li&gt;Adding some numbers together&lt;/li&gt;
&lt;li&gt;Subtracting some numbers&lt;/li&gt;
&lt;li&gt;Adding some numbers to a string&lt;/li&gt;
&lt;li&gt;Subtracting from a string&lt;/li&gt;
&lt;li&gt;Adding a number plus a boolean&lt;/li&gt;
&lt;li&gt;Dividing some numbers and multiplying others&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Store stuff (variables)
&lt;/h3&gt;

&lt;p&gt;Operations are the fundamental heart of any program. But, it can get hard to read fast if it's all on one line. This is where &lt;a href="https://launchschool.com/books/javascript/read/variables" rel="noopener noreferrer"&gt;variables&lt;/a&gt; come into play. The ability to have a storage container levels up a program and gives it the ability to perform operations one at a time instead of all at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision making (Control flow)
&lt;/h3&gt;

&lt;p&gt;The ability for a program to do operations on something and to decide what to do with that output are the two key &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do stuff (operations)&lt;/li&gt;
&lt;li&gt;Storage (variables)&lt;/li&gt;
&lt;li&gt;Decision making (Conditionals)&lt;/li&gt;
&lt;li&gt;Repetition (loops)&lt;/li&gt;
&lt;li&gt;Organization (functions)&lt;/li&gt;
&lt;li&gt;Modules (dependencies)&lt;/li&gt;
&lt;li&gt;Project Example&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/tag/tutorial-hell/" rel="noopener noreferrer"&gt;Free Code Camp Tutorial Hell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/learnprogramming/comments/qrlx5m/what_exactly_is_tutorial_hell/" rel="noopener noreferrer"&gt;Reddit Tutorial Hell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bloomberg.com/graphics/2015-paul-ford-what-is-code/#lets-begin" rel="noopener noreferrer"&gt;What is Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codecademy.com/resources/blog/how-to-think-like-a-programmer/" rel="noopener noreferrer"&gt;How to think like a programmer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://helloworldcollection.de/" rel="noopener noreferrer"&gt;Hello world in every programming language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://launchschool.com/books/javascript/read/variables" rel="noopener noreferrer"&gt;LaunchSchool Variables&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>watercooler</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Empathy: The Unseen Foundation of Effective Teams</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Tue, 12 Sep 2023 14:05:59 +0000</pubDate>
      <link>https://forem.com/schusterbraun/how-to-build-empathetic-teams-4g43</link>
      <guid>https://forem.com/schusterbraun/how-to-build-empathetic-teams-4g43</guid>
      <description>&lt;p&gt;Empathy, often described as a deep one-on-one understanding, is a quality that's challenging to scale in a team setting due to the sheer number of connections it requires (&lt;a href="https://www.leadingagile.com/2018/02/lines-of-communication-team-size-applying-brooks-law/"&gt;Brooks' Law&lt;/a&gt;). Unfortunately, it's also a skill that remains largely overlooked in education and investment. In this blog post, we'll explore the significance of empathy, its relevance in various contexts, and how to cultivate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Importance of Empathy
&lt;/h2&gt;

&lt;p&gt;Having served in the military, I know firsthand how crucial empathy is for achieving collective goals. In high-pressure situations, trust in your team is paramount. When you're in the midst of a tactical operation, you shouldn't be grappling with communication and expectations; the mission should be your sole focus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Empathy
&lt;/h2&gt;

&lt;p&gt;Empathy, as defined as "the ability to understand and share the feelings of another," hinges on education. To reach this level of understanding, you must actively learn about others' experiences and set your own aside. It's important to stress that apathy is a significant barrier to empathy. Apathy often manifests as assuming you already understand someone's experience, leading to a lack of curiosity or further inquiry. Building empathy is a two-way street; both parties must engage in the process. If someone is dismissive when you're trying to help them understand your perspective, it can discourage open communication and feedback.&lt;/p&gt;

&lt;p&gt;The path to empathy involves active listening and independent research. The responsibility for learning should not rest solely on the person you're trying to learn from. However, there's a delicate balance to maintain, especially in contexts where empathy could be used against you. For example, if you're concerned about productivity monitoring, you might not disclose the extensive trips you have planned. Instead, you may opt to provide minimal notice for each trip to avoid potential repercussions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empathy Metrics
&lt;/h2&gt;

&lt;p&gt;Developing empathetic trust within a team has several benefits, including access to privileged information and the formation of deeper relationships based on trust. This trust can lead to higher retention rates, a valuable outcome in business terms. Organizational-level empathy building requires resources and should not be pitted against morale-building or diversity and inclusion initiatives. These components all contribute to an organization's "culture map." However, for truly effective teams, empathy must be a central goal, reflected in metrics like reduced surprises and increased open feedback.&lt;/p&gt;

&lt;p&gt;Tracking surprises can be enlightening. If you're working on a feature that takes longer than expected, is it a surprise, or was it discussed as a known risk with ongoing updates? The failure case here occurs when individuals work in isolation, avoiding communication due to a fear of failure. Empathy should guide the team in setting expectations, just as it does when building new features.&lt;/p&gt;

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

&lt;p&gt;In conclusion, despite the abundance of material available on building empathetic organizations and teams, the act of writing this blog post is an exercise in empathy for me. It's a personal exploration of my own stance on empathy and a call to action for you, the reader. Developing your empathetic skills can enrich your life with a profound depth of experience and make your day-to-day interactions more meaningful. If you've made it this far, thank you for reading. I'd love to hear your thoughts on the journey through this piece and your own experiences with empathy.&lt;/p&gt;

</description>
      <category>empathy</category>
      <category>workplace</category>
      <category>career</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>The Dev Grind is Real</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Tue, 02 May 2023 19:56:00 +0000</pubDate>
      <link>https://forem.com/vetswhocode/the-dev-grind-is-real-2na</link>
      <guid>https://forem.com/vetswhocode/the-dev-grind-is-real-2na</guid>
      <description>&lt;p&gt;I'm a social media junky and there are all these dev lifestyle accounts. A lot of them put on this fake veneer of happiness and ease about work. But, that's not been my experience. &lt;/p&gt;

&lt;p&gt;I wanted to make this post because this peachy perspective is actually detrimental to those joining the industry. I got boot camp students who are afraid to push incomplete git commits because they don't have a shiny veneer. They're afraid to share their authentic selves even though that's the most valuable thing they have.&lt;/p&gt;

&lt;p&gt;We should normalize how hard development is. That's why I'm a huge fan of the &lt;a href="https://twitter.com/gitlost"&gt;Developers Swearing Twitter account&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--soRvyRkz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ovbnaw2h5kvqkw1jtcw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--soRvyRkz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ovbnaw2h5kvqkw1jtcw.png" alt="Developers Swearing Twitter account" width="593" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It normalizes that we're out here struggling and it ain't all peaches and rainbows. Sometimes development is banging your head against a wall a whole bunch and then asking for help and it finally clicks. This is normal and in fact healthy. &lt;/p&gt;

&lt;p&gt;Here's me troubleshooting build issues&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qU-iyZ3d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvt0y39rzj2qtmzshb3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qU-iyZ3d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvt0y39rzj2qtmzshb3a.png" alt="A list of build issues on September 2nd" width="720" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What a great green box on my git chart&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r3t50Aq6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yq01egbxsy4xzfkeh8nu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r3t50Aq6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yq01egbxsy4xzfkeh8nu.png" alt="Github contribution chart with 36 commits on September 2nd" width="720" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can tell that the day of September 2nd was not fun. &lt;/p&gt;

&lt;p&gt;In the end, troubleshooting doesn't mean you're a bad developer. I propose the opposite in fact, because once you get out on the other side usually that knowledge won't go to waste. It's okay to bet on yourself and not always be perfect.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>devlive</category>
    </item>
    <item>
      <title>Guide to Accessibility Advocacy</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Thu, 23 Mar 2023 16:39:25 +0000</pubDate>
      <link>https://forem.com/vetswhocode/guide-to-accessibility-advocacy-3ddb</link>
      <guid>https://forem.com/vetswhocode/guide-to-accessibility-advocacy-3ddb</guid>
      <description>&lt;p&gt;You work at a company and some pages of the website aren't addressing accessibility concerns. You don't own those pages, but would like to advocate for accessibility at your company. Here's a guide on how to advocate for accessibility at your company.&lt;/p&gt;

&lt;h2&gt;
  
  
  Legal exposure
&lt;/h2&gt;

&lt;p&gt;Digital accessibility is a legal requirement as put forth by the Americans with Disabilities Act (ADA).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In February [2023], 181 lawsuits were filed. 86% were filed in New York; MARS KHAIMOV LAW, PLLC filed 47 lawsuits in New York; 7 Plaintiffs filed 44% of lawsuits; and 17% of the litigated websites used overlay tools.&lt;br&gt;
~ &lt;a href="https://www.accessibility.com/digital-lawsuits"&gt;https://www.accessibility.com/digital-lawsuits&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's important that companies take accessibility issues seriously because users do. Accessibility is not a nice to have it is a legal requirement like GDPR and privacy compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build reports
&lt;/h2&gt;

&lt;p&gt;Create a metric that teams can use to move a needle and prove progress. You could use &lt;a href="https://developer.chrome.com/docs/lighthouse/overview/"&gt;Lighthouse&lt;/a&gt; to help you accessibility audit single pages. If you need to do something more at scale and can code you could build an &lt;a href="https://www.npmjs.com/package/accessibility-checker"&gt;accessibility checker&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Path to Success
&lt;/h2&gt;

&lt;p&gt;Once an organization is convinced to make the investment here are some resources to help build on that success and scope work.&lt;br&gt;
&lt;a href="https://www.ibm.com/able/toolkit"&gt;IBM Equal Access Toolkit&lt;/a&gt; will help you to plan, design, develop, verify, and launch accessible digital products. There is also the &lt;a href="https://www.a11yproject.com/"&gt;A11y Project&lt;/a&gt; who also build accessibility tooling and resources.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Documentation is Agile</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Thu, 23 Mar 2023 15:56:19 +0000</pubDate>
      <link>https://forem.com/vetswhocode/documentation-isnt-anti-agile-2hbm</link>
      <guid>https://forem.com/vetswhocode/documentation-isnt-anti-agile-2hbm</guid>
      <description>&lt;p&gt;A question came across the Vets Who Code community where they asked about "where does documentation come in the dev process?" They further explained that folks on their team believe that documentation is "anti-agile" and boy I have opinions. &lt;/p&gt;

&lt;h2&gt;
  
  
  Where does Documentation come into the Dev Process
&lt;/h2&gt;

&lt;p&gt;Different forms of documentation fall into different stages of the dev process for me. Though I probably have a looser definition of what documentation is than some. This is just my ideal workflow&lt;/p&gt;

&lt;h3&gt;
  
  
  Ticket
&lt;/h3&gt;

&lt;p&gt;I think a general ticket should be started by someone who's not going to take on the work. This is the requirement for building of a system. It's a piece of documentation that will tell you who the owner is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design
&lt;/h3&gt;

&lt;p&gt;Depending on complexity of that ticket you may need to get multiple eyes on mapping out a solution. This piece of documentation can be a motivating factor to get everyone's goals aligned and get general expectations of the products.&lt;/p&gt;

&lt;h3&gt;
  
  
  Epic/User Stories
&lt;/h3&gt;

&lt;p&gt;Again depending on complexity build out general technical user stories that folks should be able to pick up and with the context of the design should be able to execute on (it's okay if there are questions).&lt;/p&gt;

&lt;h3&gt;
  
  
  Tasks/sub-tasks/User Stories
&lt;/h3&gt;

&lt;p&gt;I'll document all the work that I'm doing (pretty much my standup updates) get turned into sub tasks or comments on my user story. This way, if folks aren't paying attention in standup, which I found often is the case they can check progress via tickets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code comments
&lt;/h3&gt;

&lt;p&gt;I think if something doesn't fit the general pattern comment it. If there are side effects that could possibly be unexpected, comment it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Function/Variable naming
&lt;/h3&gt;

&lt;p&gt;Make them explicit, it's a form of documentation&lt;/p&gt;

&lt;h3&gt;
  
  
  PR Reviews
&lt;/h3&gt;

&lt;p&gt;Are a type of documentation. When using Git Blame you can find the PR that the piece of code comes from. I've gone back to those PRs to find out the point of the feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Confluence/Wikis
&lt;/h3&gt;

&lt;p&gt;Document workflows and full features that folks need to know about to be able to complete certain tasks. These are guides that can be shareable between teams. They're good for onboarding. They also reduce fragility of a team, so folks can feel like they can take time off.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Docs
&lt;/h3&gt;

&lt;p&gt;If you're building an API that's meant to be consumed by anyone, please set these up for the love of Bob.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Agile Sentiment
&lt;/h2&gt;

&lt;p&gt;I've heard this anti-agile sentiment before. The challenge here is that they're possibly mis-using the concept.&lt;br&gt;
They could be saying that it's anti-agile because it could feel like waterfall. I've had push back when I do design docs because folks believe that's waterfall. It could be a waterfall practice if it was meant to be a source of truth as opposed to a general plan.&lt;br&gt;
The second reason I've heard folks misuse the "anti-agile" concept is that they believe docs slow teams down. I disagree with the concept that agile means fast. I've always interpreted it as agile means flexible.&lt;br&gt;
In the end though when it comes to documentation I have yet to see a verbal argument win. What I do is document as much as possible. You create the trail of breadcrumbs and people find it and are grateful. Sometimes I'll get told that I'm special and like to document. But honestly if you just have it as a part of your workflow folks eventually join, because you're providing value and people will see it.&lt;br&gt;
Warning it may get frustrating because you're the only one doing it. Or maybe folks will tell you to stop. In any case, documentation is good for you and will help you grow irregardless. A team agreement doesn't have to block you from providing value.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>agile</category>
      <category>community</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
