<?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: Natik Gadzhi</title>
    <description>The latest articles on DEV Community by Natik Gadzhi (@natikgadzhi).</description>
    <link>https://dev.to/natikgadzhi</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%2F1103992%2F21732e45-4506-4700-9a1b-1489dfd4efcb.jpeg</url>
      <title>DEV Community: Natik Gadzhi</title>
      <link>https://dev.to/natikgadzhi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/natikgadzhi"/>
    <language>en</language>
    <item>
      <title>Remote Team Health Check</title>
      <dc:creator>Natik Gadzhi</dc:creator>
      <pubDate>Mon, 03 Jul 2023 21:58:06 +0000</pubDate>
      <link>https://dev.to/natikgadzhi/remote-team-health-check-2en3</link>
      <guid>https://dev.to/natikgadzhi/remote-team-health-check-2en3</guid>
      <description>&lt;p&gt;I've been away from my team for almost a month and a half. No checking-in on Slack, no reading weekly posts on Basecamp. I didn't know what was happening, and of course, I was anxious about it.&lt;/p&gt;

&lt;p&gt;We're a fully remote company, and every time I get back from time off, I scan for how the team is feeling. You can usually scan your team's communication channels in just a few minutes to get a picture of whether the team is happy, motivated, and productive, or stressed, burned out, and confused.&lt;/p&gt;

&lt;p&gt;Here's the list of things I look for to get that picture. Your list may vary: each team has their own culture, so their "happy place" will be different. But the principle stays the same — quick scan to see where your attention is needed most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are people working in the open?
&lt;/h2&gt;

&lt;p&gt;Do you see folks talking about their day-to-day work in the open Slack channels (or Discord, or whatever else you use)? Asking for a review, syncing up between platform and product, frontend and backend engineers, quick asks about different pieces of your system, or product or design questions — do you see them in the open?&lt;/p&gt;

&lt;p&gt;Working in the open channels is essential (to me) in remote environments: it lets others chime in, understand how things work, see the progress, or search for that topic in the future, or support the work if the team needs help, or if someone has a few days off, and someone else is picking up their work.&lt;/p&gt;

&lt;p&gt;If you don't see open chatter — it's either because no one is talking about day-to-day work at all (unlikely, but that's a different problem), or because everyone is siloed in their DMs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you've seen the chatter &lt;em&gt;before&lt;/em&gt; you left, but it died out without you — think about why nobody else sees talking in the open as beneficial, or why are they afraid to or shy to post in the open. Do you see judgement, "well, actually", or other form of lack of support when people did talk in the open previously?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Are people asking for help?
&lt;/h2&gt;

&lt;p&gt;Do you see people asking for help and advice? Sharing their in-progress work? Admitting they're struggling with a task, or admitting mistakes?&lt;/p&gt;

&lt;p&gt;Some teams prefer a more open and direct culture than others. But in all teams where people respect and care for each other, they would support their teammates when they need help. But to share a work-in-progress, or admit a mistake, people on the team need a pretty high level of trust with each other, and with their organization leadership. &lt;em&gt;Nobody would share their mistakes if they thought that doing so would affect their next performance review in a bad way&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So if you don't see any of the vulnerability and camaraderie in the team, it could be that no one needs help, or makes mistakes, or gets blocked ever (lol no, they do). However, it's much more likely that people are afraid to talk about their mistakes in the open because they don't trust that other people on the team, or you, will not use that against them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In my experience, that kind of trust starts with leadership. Believe it or not, &lt;strong&gt;nobody expects you to &lt;em&gt;always be right&lt;/em&gt;&lt;/strong&gt;. &lt;strong&gt;And when you tell your team that you need help, or ask for help for help, or tell them that you made a mistake — it empowers your team to do the same.&lt;/strong&gt; Of course, that only works if you don't punish people for making honest mistakes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Are people debating ideas?
&lt;/h2&gt;

&lt;p&gt;Do you see any new RFCs, or just discussions about how to build a feature, or what architecture would work best? Do you see respectful disagreements and debates? Strong arguments and spikes to support ideas?&lt;/p&gt;

&lt;p&gt;RFCs, Disagreements, and debates are all critical to building a resilient, open, serene organization that sources ideas from all the talented people on the team. But it's pretty hard to get right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discussions take time to think and prepare through a problem at hand.&lt;/strong&gt; Articulating engineering opinion is both a communication task (writing and presenting), and an engineering task (research, proof of concept or a spike). It's your job as a leader to balance your team's backlog &lt;a href="https://fs.blog/slack/"&gt;in a way that gives them enough slack-time&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disagreeing in public and taking time for research work can feel scary for the people on your team.&lt;/strong&gt; If that work is not recognized, or if the discussions are routinely shut down and discarded because of a pressing deadline — no one will risk taking the time to articulate and post their opinion anymore. Which is pretty bad for your team's culture, and for the company as a whole, as it limits where you get new ideas. Why hire the smartest people you could find, and then shut them down?&lt;/p&gt;

&lt;p&gt;So, if you don't see any back-and-forth on ideas on how to implement features, and close to zero feedback on pull requests overall — you should absolutely dive deeper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do people have a shared goal, a path forward, and a clear indication of their progress?
&lt;/h2&gt;

&lt;p&gt;To stay engaged (with the company) and energized, people really need a plan that makes sense to them, an explanation of why that plan is important, a picture of what everyone else in the company is doing, and an indication of how they're doing as a team and as a company.&lt;/p&gt;

&lt;p&gt;In the first few 1:1 conversations, ask about what goal do they think their team is working towards, and what are the next steps for them. Is there a consistent picture of the team's goals? Do people know what they're working towards, how it contributes to the company, and where they are on the path to that goal?&lt;/p&gt;

&lt;p&gt;For people to stay engaged with the company strategy, someone has to connect them to it, and consistently relay any changes in strategy, and broadcast the current state, and the path forward.&lt;/p&gt;

&lt;p&gt;It's your job as a leader to communicate the strategic goals, and the tactical goals to your team. If you put the right systems and communication channels in place, then your team should at the very least be informed and well-connected internally. However, your time away puts those communications systems to a serious stress test — you were not there to course correct if they didn't work.&lt;/p&gt;

&lt;p&gt;The same goes for understanding where the company, the organization, and the team is now in their path towards the goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are people cheerful?
&lt;/h2&gt;

&lt;p&gt;Do you see folks recognize each other's work, and support each other?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your team has daily written check-ins, do you see people reacting to each other's check-ins? Congratulating each other on work well done? Do people check-in at all? If you see any outliers that dropped the habit, can you figure out why?&lt;/li&gt;
&lt;li&gt;If you have regular sync calls to check in — do people gladly share their work in progress with each other, and ask questions, or do you have to call out each team member one by one and inquire about their progress?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engaged teams work together. The recognition and energy helps &lt;em&gt;push&lt;/em&gt; the project forward. If you have to &lt;em&gt;pull&lt;/em&gt; the progress out of people on your team, and the morale seems down — it's likely a combination of factors described above. Lack of clarity, lack of autonomy, lack of recognition, lack of support, or an otherwise toxic environment.&lt;/p&gt;




&lt;p&gt;If your team culture does decay, it usually starts slow, but then snowballs. Lost trust is very difficult to rebuild, so hopefully you catch the first signs of problems in just one area before it's too late, and immediately make time and a plan to improve on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;More on leading and supporting fully remote teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.alexandras.dev/book"&gt;Remote Engineering Management&lt;/a&gt; book by Alexandra Sunderland is awesome, with excellent detail, examples, and great care for supporting the team's psychological safety in a work environment.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.oreilly.com/library/view/remote-engineering-management/9781484285848/"&gt;Same, but on O'Reilly&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.forbes.com/sites/tracybrower/2023/01/29/managers-have-major-impact-on-mental-health-how-to-lead-for-wellbeing/"&gt;Manager's impact on a person's mental wellbeing is equal to that of their partner&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;As you grow as a leader, &lt;a href="https://respawn.io/posts/hiring-engineering-managers"&gt;here's how to hire great managers who care for a lot about their teams&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>remote</category>
      <category>management</category>
      <category>career</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Automating Swift DocC with GitHub Actions</title>
      <dc:creator>Natik Gadzhi</dc:creator>
      <pubDate>Fri, 16 Jun 2023 07:00:00 +0000</pubDate>
      <link>https://dev.to/natikgadzhi/automating-swift-docc-with-github-actions-2k44</link>
      <guid>https://dev.to/natikgadzhi/automating-swift-docc-with-github-actions-2k44</guid>
      <description>&lt;p&gt;Some languages have nice documentation tooling: Yardoc for Ruby, Pydoc for Python, Godoc for Go. Swift has DocC, and it can export docs as a static website, too.&lt;/p&gt;

&lt;p&gt;In this post, you'll take the Vue.js app that Swift DocC builds, host it on GitHub Pages, and write a GitHub Action to automatically rebuild and update your docs when the source code changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up a GitHub Pages site for your documentation
&lt;/h3&gt;

&lt;p&gt;On GitHub, go to your repository Settings → Pages, and set it to deploy from a branch. Select &lt;code&gt;gh-pages&lt;/code&gt; branch, and &lt;code&gt;/docs&lt;/code&gt; folder. If the &lt;code&gt;gh-pages&lt;/code&gt; is not on the list of available branches — create it, and push it up.&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="nv"&gt;$ &lt;/span&gt;git switch &lt;span class="nt"&gt;-c&lt;/span&gt; gh-pages
&lt;span class="nv"&gt;$ &lt;/span&gt;git push origin gh-pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This guide assumes that you'll be hosting your docs on &lt;code&gt;github.io&lt;/code&gt;, and your GitHub Pages site URL will look like &lt;code&gt;${username}.github.io/${repository}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you'd like to deploy DocC site to a custom domain — that'll work, too, but you will need to not set &lt;code&gt;--hosting-base-path&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Manually deploying the documentation to GitHub Pages
&lt;/h3&gt;

&lt;p&gt;For this example, I've &lt;a href="https://github.com/natikgadzhi/swift-package-manager"&gt;forked out &lt;code&gt;apple/swift-package-manager&lt;/code&gt;&lt;/a&gt;. The code examples below work on that repository.&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="c"&gt;# Assuming you're in the Swift project directory (in this case, swift-package-manager itself), &lt;/span&gt;
&lt;span class="c"&gt;# and that your `Package.swift` already has a dependency on swift-docc-plugin.&lt;/span&gt;
&lt;span class="c"&gt;# Runnig this will get output a `./docs` directory containing the site that we need.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;swift package &lt;span class="nt"&gt;--allow-writing-to-directory&lt;/span&gt; ./docs &lt;span class="se"&gt;\&lt;/span&gt;
    generate-documentation &lt;span class="nt"&gt;--target&lt;/span&gt; PackageDescription &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--output-path&lt;/span&gt; ./docs &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--disable-indexing&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--transform-for-static-hosting&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--hosting-base-path&lt;/span&gt; swift-package-manager

&lt;span class="c"&gt;# Make a new gh-pages branch&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git switch &lt;span class="nt"&gt;-c&lt;/span&gt; gh-pages
&lt;span class="nv"&gt;$ &lt;/span&gt;git add ./docs
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Swift DocC site in ./docs"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git push origin gh-pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It takes a few minutes to process, but when it's done, you'll get a &lt;a href="https://natikgadzhi.github.io/swift-package-manager/documentation/packagedescription/"&gt;webpage like this one&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Swift DocC site is only available in a subdirectory for your particular target: &lt;code&gt;/documentation/{targetName}&lt;/code&gt;. It would be great to have a root web page, but I don't yet know how to craft that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So far, you've generated Swift DocC documentation, exported it as a static website, and shipped it to GitHub pages. Now let's automate it, so every time you push an update to your library, you get the updated documentation website for free.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using a GitHub action to deploy documentation
&lt;/h3&gt;

&lt;p&gt;Here's a workflow that will build DocC website, and push it to GitHub pages automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build Swift DocC and publish on GitHub Pages&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# If you wanted to only trigger this flow on certain branches,&lt;/span&gt;
    &lt;span class="c1"&gt;# specify them here in &lt;/span&gt;
    &lt;span class="c1"&gt;# branches: &lt;/span&gt;
    &lt;span class="c1"&gt;# alternatively, you can trigger docs only on new tags pushed:&lt;/span&gt;
    &lt;span class="c1"&gt;# tags:&lt;/span&gt;
    &lt;span class="c1"&gt;#   - '*'&lt;/span&gt;

&lt;span class="c1"&gt;# `concurrency` specifices how this action is run. &lt;/span&gt;
&lt;span class="c1"&gt;# Setting concurrency group makes it so that only one build process runs at a time.&lt;/span&gt;
&lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pages"&lt;/span&gt;
  &lt;span class="na"&gt;cancel-in-progress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Build target specifies which target in your Swift Package to build documentation for.&lt;/span&gt;
  &lt;span class="c1"&gt;# To build all targets, remove this env variable, &lt;/span&gt;
  &lt;span class="c1"&gt;# and remove --target arg in the building step below.&lt;/span&gt;
  &lt;span class="na"&gt;BUILD_TARGET&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PackageDescription&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Swift environment&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fwal/setup-swift@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;swift-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;5.8'&lt;/span&gt;

    &lt;span class="c1"&gt;# Build the DocC website using swiftPM.&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build docs with SwiftPM&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;swift package --allow-writing-to-directory ./docs \&lt;/span&gt;
        &lt;span class="s"&gt;generate-documentation --target ${BUILD_TARGET} \&lt;/span&gt;
        &lt;span class="s"&gt;--output-path ./docs \&lt;/span&gt;
        &lt;span class="s"&gt;--disable-indexing \&lt;/span&gt;
        &lt;span class="s"&gt;--transform-for-static-hosting \&lt;/span&gt;
        &lt;span class="s"&gt;--hosting-base-path swift-package-manager&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Commit and push generated documentation&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;git config --local user.email "github-actions[bot]@users.noreply.github.com"&lt;/span&gt;
        &lt;span class="s"&gt;git config --local user.name "github-actions[bot]"&lt;/span&gt;
        &lt;span class="s"&gt;git switch gh-pages&lt;/span&gt;
        &lt;span class="s"&gt;git add ./docs&lt;/span&gt;
        &lt;span class="s"&gt;git commit -a -m "Generated Swift DocC"&lt;/span&gt;
        &lt;span class="s"&gt;git push origin gh-pages&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Apple's own gh pages builder bash script for &lt;code&gt;swift-docc-plugin&lt;/code&gt;: &lt;a href="https://github.com/apple/swift-docc-plugin/blob/main/bin/update-gh-pages-documentation-site"&gt;https://github.com/apple/swift-docc-plugin/blob/main/bin/update-gh-pages-documentation-site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;An overview of &lt;code&gt;swift-docc-plugin&lt;/code&gt; arguments, as well as the github pages publishing flow: &lt;a href="https://apple.github.io/swift-docc-plugin/documentation/swiftdoccplugin/publishing-to-github-pages/"&gt;https://apple.github.io/swift-docc-plugin/documentation/swiftdoccplugin/publishing-to-github-pages/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Example repository: &lt;a href="https://github.com/natikgadzhi/swift-package-manager"&gt;https://github.com/natikgadzhi/swift-package-manager&lt;/a&gt; and the docs site: &lt;a href="https://natikgadzhi.github.io/swift-package-manager/documentation/packagedescription/"&gt;https://natikgadzhi.github.io/swift-package-manager/documentation/packagedescription/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>swift</category>
      <category>githubactions</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
