<?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: Planet Argon</title>
    <description>The latest articles on Forem by Planet Argon (@planetargon).</description>
    <link>https://forem.com/planetargon</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%2Forganization%2Fprofile_image%2F217%2F20124321-e770-4442-a392-60818013ce15.png</url>
      <title>Forem: Planet Argon</title>
      <link>https://forem.com/planetargon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/planetargon"/>
    <language>en</language>
    <item>
      <title>When Reporting Quietly Becomes the Slowest Part of your Rails app</title>
      <dc:creator>Autumn</dc:creator>
      <pubDate>Wed, 18 Mar 2026 23:08:17 +0000</pubDate>
      <link>https://forem.com/planetargon/when-reporting-quietly-becomes-the-slowest-part-of-your-rails-app-n8g</link>
      <guid>https://forem.com/planetargon/when-reporting-quietly-becomes-the-slowest-part-of-your-rails-app-n8g</guid>
      <description>&lt;p&gt;Reporting rarely shows up as a problem on day one.&lt;/p&gt;

&lt;p&gt;It usually starts with something small and useful. You set up a dashboard, a few queries, and maybe a quick way to answer a question that used to take too long.&lt;/p&gt;

&lt;p&gt;This seems to work fine, so it gets left alone.&lt;/p&gt;

&lt;p&gt;Then the app grows.&lt;/p&gt;

&lt;p&gt;With more data, more questions, expanded filters, and more metrics, this process begins to carry more weight than it was designed for.&lt;/p&gt;

&lt;p&gt;At some point, it stops feeling simple.&lt;/p&gt;

&lt;p&gt;We start to see reporting become one of the slowest, most complex parts of an otherwise healthy Rails application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern we keep running into
&lt;/h2&gt;

&lt;p&gt;What’s interesting is that this doesn’t happen because of one bad decision. It’s usually a series of reasonable ones.&lt;/p&gt;

&lt;p&gt;A query gets a little more complex. Then another layer gets added. Active Record turns into raw SQL. Indexes are introduced to keep things fast. Views are added to organize the logic.&lt;/p&gt;

&lt;p&gt;Each step makes sense on its own, right?&lt;/p&gt;

&lt;p&gt;But over time, the system becomes harder to understand, slower to run, and more difficult to change. Upgrades get riskier, and even small changes start to feel expensive.&lt;/p&gt;

&lt;p&gt;Teams often try to fix this by adding more indexes or introducing views, but they don’t make queries faster. Materialized views can work for smaller datasets, but become costly to refresh as things grow&lt;/p&gt;

&lt;p&gt;None of these approaches are wrong. They just don’t always address the root of the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  A shift in how we approach reporting
&lt;/h2&gt;

&lt;p&gt;Instead of continuing to optimize increasingly complex queries, we step back.&lt;/p&gt;

&lt;p&gt;Most reporting is time-based: Days. Weeks. Months.&lt;/p&gt;

&lt;p&gt;That gives us a clue.&lt;/p&gt;

&lt;p&gt;Rather than calculating everything on the fly, we look for the smallest useful unit of data. Often that’s a day. Sometimes it’s something else. But there’s usually a clear base unit underneath the complexity.&lt;/p&gt;

&lt;p&gt;Once you find that, you can start shaping the data in advance rather than rebuilding it on every request.&lt;/p&gt;

&lt;h2&gt;
  
  
  What tends to work better in practice
&lt;/h2&gt;

&lt;p&gt;From here, a few patterns make reporting systems much easier to work with as they grow.&lt;/p&gt;

&lt;p&gt;We create tables that are designed specifically for reporting, storing only the data needed to answer those questions. Instead of querying across many tables with complex joins, we aim to keep reporting queries focused and predictable.&lt;/p&gt;

&lt;p&gt;We move heavy data processing out of request time, so user-facing performance doesn’t compete with reporting workloads. In some cases, this means using a follower database or a separate process to prepare reporting data in the background.&lt;/p&gt;

&lt;p&gt;And we accept a small tradeoff: not everything needs to be real-time. In many cases, slightly delayed but fast and reliable reporting is a much better experience than slow, live queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  We’re walking through this LIVE
&lt;/h2&gt;

&lt;p&gt;We’ve been seeing this pattern often enough in client work that we decided to put together a short session to walk through how we approach it.&lt;/p&gt;

&lt;p&gt;If reporting has started to feel heavier than it should, you’re welcome to join us.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/events/7438280088971935744?viewAsMember=true" rel="noopener noreferrer"&gt;Join the session&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod7xc7olmfybgsb6aqpn.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod7xc7olmfybgsb6aqpn.jpeg" alt="how to build reports with rails" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>development</category>
      <category>rails</category>
    </item>
    <item>
      <title>Ruby 4.0 and Ruby Box: What Changed and How to Upgrade Safely</title>
      <dc:creator>Autumn</dc:creator>
      <pubDate>Wed, 04 Feb 2026 17:04:47 +0000</pubDate>
      <link>https://forem.com/planetargon/ruby-40-and-ruby-box-what-changed-and-how-to-upgrade-safely-24en</link>
      <guid>https://forem.com/planetargon/ruby-40-and-ruby-box-what-changed-and-how-to-upgrade-safely-24en</guid>
      <description>&lt;p&gt;&lt;a href="https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released" rel="noopener noreferrer"&gt;Ruby 4.0 dropped over the holidays&lt;/a&gt;, bringing us all new primitives for isolation, parallelism, and performance, as well as upgrade anxiety (inevitable) and the perpetual temptation to just rewrite our entire app (resist!). Let’s dive in!&lt;/p&gt;

&lt;h2&gt;Ruby Box: Isolation without abandoning Ruby’s flexibility&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.ruby-lang.org/en/master/Ruby/Box.html" rel="noopener noreferrer"&gt;Ruby Box&lt;/a&gt; introduces a way to evaluate code inside an isolated environment. This means constants, classes, and monkey patches defined in a box do not leak out unless you explicitly expose them.&lt;/p&gt;

&lt;p&gt;At a high level, Ruby Box is a formal mechanism for scoping global state.&lt;/p&gt;

&lt;h3&gt;Basic example&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;box = RubyBox.new

box.eval do
  class User
    def role
      :admin
    end
  end
end

defined?(User)
# =&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outside the box, &lt;code&gt;User&lt;/code&gt; does not exist.&lt;/p&gt;

&lt;h3&gt;Selectively exposing behavior&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;box = RubyBox.new

user_class = box.eval do
  class User
    def role
      :admin
    end

    self
  end
end

user = user_class.new
user.role
# =&amp;gt; :admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;Why this matters in real applications&lt;/h3&gt;

&lt;p&gt;In legacy Rails apps, global state is often the hidden cost of change. Monkey patches, initializer side effects, and gem overrides accumulate quietly as tech debt over the years. Ruby Box gives us a new way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run isolated test scenarios without polluting the global runtime&lt;/li&gt;
&lt;li&gt;Experiment with alternative implementations safely&lt;/li&gt;
&lt;li&gt;Evaluate upgrades to dependencies without forking the app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is particularly relevant when incrementally modernizing older systems, which is exactly where we see the most rewrite pressure among new (and sometimes existing!) Planet Argon clients.&lt;/p&gt;

&lt;h2&gt;ZJIT: A new foundation for Ruby performance&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RUBYOPT="--zjit" ruby app.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ruby 4.0 introduces ZJIT, a next-generation JIT compiler designed to be more maintainable and extensible than previous implementations.&lt;/p&gt;

&lt;p&gt;ZJIT is not yet a universal replacement for YJIT, but it establishes a clear direction. Because it’s a work in progress, it's not enabled by default just yet. Here is a quote from the release notes. &lt;em&gt;“ZJIT is faster than the interpreter, but not yet as fast as YJIT. We encourage you to experiment with ZJIT, but maybe hold off on deploying it in production for now. Stay tuned for Ruby 4.1 ZJIT.”&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Enabling ZJIT&lt;/h3&gt;

&lt;h3&gt;What changes in practice&lt;/h3&gt;

&lt;p&gt;You do not write Ruby differently to use ZJIT. The benefit is structural, not syntactic. ZJIT introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cleaner internal compiler architecture&lt;/li&gt;
&lt;li&gt;Larger compilation units&lt;/li&gt;
&lt;li&gt;A path to future optimizations that do not require rewriting Ruby code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For teams running mature applications, this matters because it provides immediate and actual performance in runtime evolution instead of theoretical gains that could maybe possibly potentially come with a risky application rewrite.&lt;/p&gt;

&lt;h2&gt;Ractors: Continued progress toward true parallelism&lt;/h2&gt;

&lt;p&gt;Ractors were introduced in Ruby 3.0. Ruby 4.0 refines the model and reduces internal contention, making parallel execution more practical.&lt;/p&gt;

&lt;h3&gt;Basic Ractor usage&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r = Ractor.new do
  "Hello from another core"
end

r.take
# =&amp;gt; "Hello from another core"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;Structured communication with Ractor::Port&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;port = Ractor::Port.new

producer = Ractor.new(port) do |p|
  p.send("work item")
end

consumer = Ractor.new(port) do |p|
  p.receive
end

consumer.take
# =&amp;gt; "work item"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;Why this matters for Rails applications&lt;/h3&gt;

&lt;p&gt;Most Rails apps today rely on process-level concurrency. Ruby 4.0 continues the slow but intentional shift toward safer parallel execution within a single process.&lt;/p&gt;

&lt;p&gt;That unlocks future architectural options without forcing a move to an entirely different stack or runtime.&lt;/p&gt;

&lt;h2&gt;Core language and standard library improvements&lt;/h2&gt;

&lt;p&gt;Ruby 4.0 also includes a collection of smaller improvements that add up over time.&lt;/p&gt;

&lt;h3&gt;Improved conditionals&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if foo
  &amp;amp;&amp;amp; bar
  || baz
  do_work
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ruby 4.0 improves parsing and readability in complex multi-line expressions, reducing subtle bugs in legacy conditionals.&lt;/p&gt;

&lt;h3&gt;Array enhancements&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1, 2, 3, 4].rfind(&amp;amp;:even?)
# =&amp;gt; 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small additions like this reduce custom utility code that often proliferates in older codebases.&lt;/p&gt;

&lt;h3&gt;Better error context&lt;/h3&gt;

&lt;p&gt;Ruby 4.0 enhances error messages by showing both caller and callee context, making it easier to debug layered systems.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def a
  b
end

def b
  raise "boom"
end

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

&lt;/div&gt;



&lt;p&gt;The resulting stack trace now surfaces more actionable information, which is especially valuable in large applications with deep call chains.&lt;/p&gt;

&lt;h2&gt;Why We’re Excited about 4.0&lt;/h2&gt;

&lt;p&gt;At Planet Argon, most of our Ruby work starts with &lt;a href="https://www.planetargon.com/services/ruby-on-rails-development" rel="noopener noreferrer"&gt;systems that have a history&lt;/a&gt;, are in full use by a large customer base, and can’t afford a risky, drawn-out rewrite.&lt;/p&gt;

&lt;p&gt;Ruby 4.0 reinforces a belief we have held for years:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;You do not need to rewrite your application to modernize it.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’ll be using the new 4.0 features to: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Help isolate risk (Box)&lt;/li&gt;
&lt;li&gt;Help performance evolve independently of application code (ZJIT)&lt;/li&gt;
&lt;li&gt;Get better concurrency out of Ruby apps (Ractors)&lt;/li&gt;
&lt;li&gt;Reduce friction in our everyday maintenance work &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And how about that! None of these requires throwing away working software. :) &lt;/p&gt;

&lt;h2&gt;Upgrade strategy: How we recommend teams approach Ruby 4.0&lt;/h2&gt;

&lt;p&gt;Upgrading to Ruby 4.0 should be treated as an engineering initiative, not a version bump.&lt;/p&gt;

&lt;p&gt;Here is the strategy we typically recommend.&lt;/p&gt;

&lt;h3&gt;1. Establish a behavioral baseline&lt;/h3&gt;

&lt;p&gt;Before upgrading, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A reliable test suite&lt;/li&gt;
&lt;li&gt;CI visibility into failures&lt;/li&gt;
&lt;li&gt;Basic performance benchmarks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not about perfection. It is about confidence.&lt;/p&gt;

&lt;h3&gt;2. Upgrade Ruby before Rails&lt;/h3&gt;

&lt;p&gt;Move the Ruby version forward first while holding Rails constant where possible. This isolates runtime changes from framework changes, making failures easier to reason about.&lt;/p&gt;

&lt;h3&gt;3. Use Ruby Box experimentally&lt;/h3&gt;

&lt;p&gt;Do not start by restructuring your application. Use Ruby Box in test or tooling contexts first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolated test execution&lt;/li&gt;
&lt;li&gt;Dependency experiments&lt;/li&gt;
&lt;li&gt;Refactoring spikes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat it as a safety tool, not a refactor mandate.&lt;/p&gt;

&lt;h3&gt;4. Measure, then enable JIT options&lt;/h3&gt;

&lt;p&gt;Evaluate YJIT and ZJIT in staging or production-like environments. Measure memory, CPU, and latency. Choose deliberately.&lt;/p&gt;

&lt;p&gt;Performance gains should be empirical, not assumed.&lt;/p&gt;

&lt;h3&gt;5. Avoid the rewrite trap&lt;/h3&gt;

&lt;p&gt;The biggest risk we see is teams using upgrades as justification for a rewrite. Ruby 4.0 explicitly reduces the need for that by improving the runtime itself.&lt;/p&gt;

&lt;p&gt;Modernization works best when it is incremental, observable, and reversible.&lt;/p&gt;

&lt;h2&gt;Closing thoughts&lt;/h2&gt;

&lt;p&gt;Ruby 4.0 seems designed for giving long-lived systems room to keep evolving. For teams maintaining legacy Ruby and Rails applications, this release is a reminder that stability and progress are not opposites. With the right strategy, they actually reinforce each other!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This post was originally shared on [Planet Argon's blog](&lt;a href="https://blog.planetargon.com/blog" rel="noopener noreferrer"&gt;https://blog.planetargon.com/blog&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>upgrade</category>
      <category>developer</category>
    </item>
    <item>
      <title>How to Demo Your Application to a New Development Team</title>
      <dc:creator>Autumn</dc:creator>
      <pubDate>Thu, 14 Aug 2025 19:00:23 +0000</pubDate>
      <link>https://forem.com/planetargon/how-to-demo-your-application-to-a-new-development-team-1dia</link>
      <guid>https://forem.com/planetargon/how-to-demo-your-application-to-a-new-development-team-1dia</guid>
      <description>&lt;p&gt;When you start &lt;a href="https://blog.planetargon.com/blog/entries/client-onboarding-what-to-expect-in-your-first-month-with-planet-argon" rel="noopener noreferrer"&gt;working with a new development team&lt;/a&gt;, one of the first and most valuable things you can do is walk them through your application. It's more than just clicking around—it's about sharing the story of your app: what it does, who it serves, and how it's built.&lt;/p&gt;

&lt;p&gt;We’ve seen a lot of client-led demos, and we’ve learned what makes them effective—and what leaves teams guessing. This post outlines a simple framework for &lt;strong&gt;walking a development team through your application&lt;/strong&gt;. It includes key talking points to help you deliver a clear and helpful overview that saves time and builds shared understanding from the start.&lt;/p&gt;

&lt;p&gt;We’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to introduce your business and users.&lt;/li&gt;
&lt;li&gt;What technical details are most beneficial to share early on.&lt;/li&gt;
&lt;li&gt;What’s changed in your app recently—and what’s coming up.&lt;/li&gt;
&lt;li&gt;How to prepare the team for emergencies and escalations.&lt;/li&gt;
&lt;li&gt;What kind of support you need from the dev team week-to-week.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll have a helpful checklist for your next application walkthrough.&lt;/p&gt;

&lt;h2&gt;1.  Start with the Big Picture: Your Business and Your Users&lt;/h2&gt;

&lt;p&gt;As the new team onboards to your application, it will be important to highlight the technical aspects of what the application does. However, something people often miss when demonstrating to a new team is explaining the why behind the application. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What business purpose does your app serve?&lt;/li&gt;
&lt;li&gt;Who are your users?&lt;/li&gt;
&lt;li&gt;What problems does it solve for them?&lt;/li&gt;
&lt;li&gt;How do you interact with those users?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Start from the 30,000-foot view:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“Our users are [x] who want a way to [y].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then, take on the personality of a daily user:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“So if I want to get [y] from the app, I would log in and navigate to [critical page #1] or [critical page #2].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally, show how your team engages with those users:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“As a customer service representative, we can pick up a user’s case and [do x] or [do y].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This context helps the engineering team understand &lt;em&gt;why&lt;/em&gt; they’re building and supporting the product, making it easier to navigate the app with purpose instead of aimlessly clicking around.&lt;/p&gt;

&lt;h2&gt;2. What Does the Application Do?&lt;/h2&gt;

&lt;p&gt;After covering what the application looks like for users and administrators, it is time to move over to the more technical functions of its structure. A senior engineer, CTO, or technical project manager would best lead this section of the demonstration. &lt;/p&gt;

&lt;p&gt;Here, we should aim to answer questions like: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where is the application hosted? &lt;/li&gt;
&lt;li&gt;Is there up-to-date documentation on how to set up the application? &lt;/li&gt;
&lt;li&gt;Are there important services that the onboarding team needs to be aware of (like Sidekiq Pro or AppSignal)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are a few key areas to touch on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hosting and setup:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“When we have a new engineer starting, the first thing we ensure they have access to is [x].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application history:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“This started as a basic [code framework] app but has since expanded to include [other frameworks/tools].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important services:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“We use Sidekiq Pro for background jobs and AppSignal for monitoring.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Known quirks or exceptions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“An important thing that may not be super clear in the documentation is [x], which exists for [y purpose].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build process:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“When a change is ready, the testing suite runs and then [x] happens.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These insights give the onboarding team a strong technical foundation to begin working efficiently.&lt;/p&gt;

&lt;h2&gt;3. Where Does the Application Stand Today?&lt;/h2&gt;

&lt;p&gt;After giving the team an idea of what the business does and how the application is set up, it’s time to get into the current state. This section aims to give the team a healthy understanding of what new features have been implemented recently, any ongoing issues, and cover important things to be aware of for future work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s new:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“In the last three months, we added a new way for users to [x].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s wrong:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“We’ve been having issues with [x] and [y], which we [have/haven’t resolved yet].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s bothering you:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“It hasn’t happened in a while, but every few months, I worry about [x].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s coming:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“In the next two months, the Ops team would like to see [x] happen.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This helps the team prioritize their focus areas and understand where they can add the most value.&lt;/p&gt;

&lt;h2&gt;4. Preparing the team for emergencies&lt;/h2&gt;

&lt;p&gt;Emergencies are never fun, but they happen. Use this part of the demo to walk the team through what to do when something goes wrong.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What do you do when things go poorly? &lt;/li&gt;
&lt;li&gt;Where do you look if there is an outage? &lt;/li&gt;
&lt;li&gt;How have outages historically escalated to the engineers? &lt;/li&gt;
&lt;li&gt;Have there been recurring themes in the recent outages?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How escalations happen:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“Historically, [x person/people] are the first to tell us when something is wrong.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to look:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“When we get a report, we start by checking [x]. That usually tells us [y].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recovery process:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“If we need to rollback to a previous version of the app or database, here’s how we typically do that.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sharing your existing process gives your new team a sense of confidence and preparedness for when things break.&lt;/p&gt;

&lt;h2&gt;5. Helping Teams Help You&lt;/h2&gt;

&lt;p&gt;Finally, wrap up your demo by discussing what a successful working relationship looks like. Be clear about how you like to work, how you prefer to get updates, and what you expect from your dev partners.&lt;/p&gt;

&lt;p&gt;For more on how to build collaborative and inclusive developer relationships from day one, check out this episode of &lt;a href="https://maintainable.fm/episodes/april-wensel-navigating-legacy-code-with-compassion?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Maintainable Software Podcast with April Wensel&lt;/a&gt;, where she shares thoughtful insights on navigating legacy code with empathy and intention.&lt;/p&gt;

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

&lt;p&gt;→ &lt;em&gt;“Every Tuesday morning, our operations team meets to review priorities and plan the next few weeks. I need updates on [x] and any [y] incidents before that meeting.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preferred processes:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“It’s easiest for me if updates are made in [x-way].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalation protocols:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“If there’s a new incident or outage, I’m responsible for notifying [x-people]. For that, I need to know [y] and [z].”&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Making it happen 🚀&lt;/h2&gt;

&lt;p&gt;Demos don’t have to be polished or perfect, but they do need to be intentional. A clear, thoughtful walkthrough of your application helps your new engineering team get up to speed faster, make fewer assumptions, and deliver better work sooner.&lt;/p&gt;

&lt;p&gt;The more context you give, the more your development partners can support your business goals effectively.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>development</category>
    </item>
    <item>
      <title>How to Demo Your Application to a New Development Team: A Helpful Guide</title>
      <dc:creator>Autumn</dc:creator>
      <pubDate>Wed, 30 Jul 2025 18:42:36 +0000</pubDate>
      <link>https://forem.com/planetargon/how-to-demo-your-application-to-a-new-development-team-a-helpful-guide-5bnk</link>
      <guid>https://forem.com/planetargon/how-to-demo-your-application-to-a-new-development-team-a-helpful-guide-5bnk</guid>
      <description>&lt;p&gt;When you start &lt;a href="https://blog.planetargon.com/blog/entries/client-onboarding-what-to-expect-in-your-first-month-with-planet-argon" rel="noopener noreferrer"&gt;working with a new development team&lt;/a&gt;, one of the first and most valuable things you can do is walk them through your application. It's more than just clicking around—it's about sharing the story of your app: what it does, who it serves, and how it's built.&lt;/p&gt;

&lt;p&gt;We’ve seen a lot of client-led demos, and we’ve learned what makes them effective—and what leaves teams guessing. This post outlines a simple framework for &lt;strong&gt;walking a development team through your application&lt;/strong&gt;. It includes key talking points to help you deliver a clear and helpful overview that saves time and builds shared understanding from the start.&lt;/p&gt;

&lt;p&gt;We’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to introduce your business and users.&lt;/li&gt;
&lt;li&gt;What technical details are most beneficial to share early on.&lt;/li&gt;
&lt;li&gt;What’s changed in your app recently—and what’s coming up.&lt;/li&gt;
&lt;li&gt;How to prepare the team for emergencies and escalations.&lt;/li&gt;
&lt;li&gt;What kind of support you need from the dev team week-to-week.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll have a helpful checklist for your next application walkthrough.&lt;/p&gt;

&lt;h2&gt;1.  Start with the Big Picture: Your Business and Your Users&lt;/h2&gt;

&lt;p&gt;As the new team onboards to your application, it will be important to highlight the technical aspects of what the application does. However, something people often miss when demonstrating to a new team is explaining the why behind the application. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What business purpose does your app serve?&lt;/li&gt;
&lt;li&gt;Who are your users?&lt;/li&gt;
&lt;li&gt;What problems does it solve for them?&lt;/li&gt;
&lt;li&gt;How do you interact with those users?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Start from the 30,000-foot view:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“Our users are [x] who want a way to [y].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then, take on the personality of a daily user:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“So if I want to get [y] from the app, I would log in and navigate to [critical page #1] or [critical page #2].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally, show how your team engages with those users:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“As a customer service representative, we can pick up a user’s case and [do x] or [do y].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This context helps the engineering team understand &lt;em&gt;why&lt;/em&gt; they’re building and supporting the product, making it easier to navigate the app with purpose instead of aimlessly clicking around.&lt;/p&gt;

&lt;h2&gt;2. What Does the Application Do?&lt;/h2&gt;

&lt;p&gt;After covering what the application looks like for users and administrators, it is time to move over to the more technical functions of its structure. A senior engineer, CTO, or technical project manager would best lead this section of the demonstration. &lt;/p&gt;

&lt;p&gt;Here, we should aim to answer questions like: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where is the application hosted? &lt;/li&gt;
&lt;li&gt;Is there up-to-date documentation on how to set up the application? &lt;/li&gt;
&lt;li&gt;Are there important services that the onboarding team needs to be aware of (like Sidekiq Pro or AppSignal)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are a few key areas to touch on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hosting and setup:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“When we have a new engineer starting, the first thing we ensure they have access to is [x].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application history:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“This started as a basic [code framework] app but has since expanded to include [other frameworks/tools].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important services:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“We use Sidekiq Pro for background jobs and AppSignal for monitoring.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Known quirks or exceptions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“An important thing that may not be super clear in the documentation is [x], which exists for [y purpose].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build process:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“When a change is ready, the testing suite runs and then [x] happens.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These insights give the onboarding team a strong technical foundation to begin working efficiently.&lt;/p&gt;

&lt;h2&gt;3. Where Does the Application Stand Today?&lt;/h2&gt;

&lt;p&gt;After giving the team an idea of what the business does and how the application is set up, it’s time to get into the current state. This section aims to give the team a healthy understanding of what new features have been implemented recently, any ongoing issues, and cover important things to be aware of for future work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s new:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“In the last three months, we added a new way for users to [x].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s wrong:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“We’ve been having issues with [x] and [y], which we [have/haven’t resolved yet].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s bothering you:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“It hasn’t happened in a while, but every few months, I worry about [x].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s coming:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“In the next two months, the Ops team would like to see [x] happen.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This helps the team prioritize their focus areas and understand where they can add the most value.&lt;/p&gt;

&lt;h2&gt;4. Preparing the team for emergencies&lt;/h2&gt;

&lt;p&gt;Emergencies are never fun, but they happen. Use this part of the demo to walk the team through what to do when something goes wrong.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What do you do when things go poorly? &lt;/li&gt;
&lt;li&gt;Where do you look if there is an outage? &lt;/li&gt;
&lt;li&gt;How have outages historically escalated to the engineers? &lt;/li&gt;
&lt;li&gt;Have there been recurring themes in the recent outages?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How escalations happen:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“Historically, [x person/people] are the first to tell us when something is wrong.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to look:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“When we get a report, we start by checking [x]. That usually tells us [y].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recovery process:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“If we need to rollback to a previous version of the app or database, here’s how we typically do that.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sharing your existing process gives your new team a sense of confidence and preparedness for when things break.&lt;/p&gt;

&lt;h2&gt;5. Helping Teams Help You&lt;/h2&gt;

&lt;p&gt;Finally, wrap up your demo by discussing what a successful working relationship looks like. Be clear about how you like to work, how you prefer to get updates, and what you expect from your dev partners.&lt;/p&gt;

&lt;p&gt;For more on how to build collaborative and inclusive developer relationships from day one, check out this episode of &lt;a href="https://maintainable.fm/episodes/april-wensel-navigating-legacy-code-with-compassion?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Maintainable Software Podcast with April Wensel&lt;/a&gt;, where she shares thoughtful insights on navigating legacy code with empathy and intention.&lt;/p&gt;

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

&lt;p&gt;→ &lt;em&gt;“Every Tuesday morning, our operations team meets to review priorities and plan the next few weeks. I need updates on [x] and any [y] incidents before that meeting.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preferred processes:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“It’s easiest for me if updates are made in [x-way].”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalation protocols:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;em&gt;“If there’s a new incident or outage, I’m responsible for notifying [x-people]. For that, I need to know [y] and [z].”&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Making it happen 🚀&lt;/h2&gt;

&lt;p&gt;Demos don’t have to be polished or perfect, but they do need to be intentional. A clear, thoughtful walkthrough of your application helps your new engineering team get up to speed faster, make fewer assumptions, and deliver better work sooner.&lt;/p&gt;

&lt;p&gt;The more context you give, the more your development partners can support your business goals effectively.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>development</category>
      <category>tutorial</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Deploying a Ruby on Rails app to DigitalOcean Using Kamal</title>
      <dc:creator>Autumn</dc:creator>
      <pubDate>Thu, 24 Jul 2025 00:11:37 +0000</pubDate>
      <link>https://forem.com/planetargon/deploying-a-ruby-on-rails-app-to-digitalocean-using-kamal-14ec</link>
      <guid>https://forem.com/planetargon/deploying-a-ruby-on-rails-app-to-digitalocean-using-kamal-14ec</guid>
      <description>&lt;p&gt;If you’re deploying Ruby on Rails applications to the cloud, you may have explored tools to simplify and streamline the process. Recently, we’ve been experimenting with &lt;strong&gt;Kamal&lt;/strong&gt;, a tool for deploying containerized applications, and we’re excited to share our experience with deploying a Rails app to &lt;strong&gt;DigitalOcean&lt;/strong&gt; using their &lt;strong&gt;Managed Database&lt;/strong&gt; service.&lt;/p&gt;

&lt;p&gt;This post introduces Kamal, explains why it’s worth exploring, and walks you through a sample deployment configuration to demystify Kamal and help you decide if it’s the right tool for your next project.&lt;/p&gt;

&lt;h2&gt;What Is Kamal?&lt;/h2&gt;

&lt;p&gt;Here's how the &lt;a href="https://kamal-deploy.org/" rel="noopener noreferrer"&gt;official Kamal documentation&lt;/a&gt; describes it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kamal offers zero-downtime deploys, rolling restarts, asset bridging, remote builds, accessory service management, and everything else you need to deploy and manage your web app in production with Docker. Originally built for Rails apps, Kamal will work with any type of web app that can be containerized.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In simpler terms, Kamal is a deployment tool designed for containerized applications. Whether you’re managing Rails apps or other containerized projects, Kamal handles complex tasks like asset management, remote builds, and service orchestration. It provides powerful features for those looking to avoid the overhead of Kubernetes while still leveraging Docker-based workflows.&lt;/p&gt;

&lt;h2&gt;The Case for Kamal: Why It’s Worth Exploring&lt;/h2&gt;

&lt;p&gt;You may have heard Kamal described as a "Capistrano-like tool for containerized apps." While that description is somewhat accurate, Kamal is much more than that. It stands out for developers who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want a simpler alternative to Capistrano.&lt;/li&gt;
&lt;li&gt;Are focused on lightweight deployment workflows.&lt;/li&gt;
&lt;li&gt;Appreciate a tool that integrates deeply with Rails (but also supports other frameworks).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kamal offers several unique advantages, making it a compelling choice for deploying containerized applications.&lt;/p&gt;

&lt;h3&gt;Optimized for Rails&lt;/h3&gt;

&lt;p&gt;Kamal was initially built with Ruby on Rails in mind, offering built-in support for Rails conventions. But it’s versatile enough to work with any containerized web app, making it a great fit for diverse tech stacks.&lt;/p&gt;

&lt;h3&gt;Rails 8 Integration&lt;/h3&gt;

&lt;p&gt;Kamal is tightly integrated with Rails 8, coming pre-installed and leveraging new features like simplified containerization out of the box. This reduces setup time and ensures compatibility with the latest Rails conventions.&lt;/p&gt;

&lt;h3&gt;Streamlined Asset Management&lt;/h3&gt;

&lt;p&gt;Kamal automates asset bridging between deployment versions, ensuring static files like CSS and JavaScript are handled seamlessly without downtime. This eliminates the manual asset precompilation headaches often encountered in traditional workflows.&lt;/p&gt;

&lt;h3&gt;Easy Environment Management&lt;/h3&gt;

&lt;p&gt;With Kamal, environment variables and secrets are centralized in .kamal/secrets, simplifying managing production settings across servers. This reduces configuration drift and enhances security by keeping sensitive data out of version control.&lt;/p&gt;

&lt;h3&gt;A Modern Alternative to Capistrano&lt;/h3&gt;

&lt;p&gt;Kamal modernizes deployment by replacing Capistrano’s script-based approach with a Docker-centric workflow, offering better scalability and consistency. It’s easier to set up for containerized apps while retaining the simplicity Capistrano users love.&lt;/p&gt;

&lt;h3&gt;Flexible Support for Managed Databases&lt;/h3&gt;

&lt;p&gt;Kamal integrates effortlessly with managed database services like DigitalOcean’s, allowing you to configure database connections via environment variables without managing database containers. This flexibility simplifies infrastructure while leveraging cloud provider reliability.&lt;/p&gt;

&lt;h3&gt;Ideal for Small Teams or Solo Devs&lt;/h3&gt;

&lt;p&gt;Kamal’s lightweight design and minimal setup make it perfect for small teams or solo developers who need efficient deployments without the complexity of Kubernetes. It balances power and simplicity, reducing the learning curve for resource-constrained projects.&lt;/p&gt;

&lt;h3&gt;Developer-Friendly Debugging Tools&lt;/h3&gt;

&lt;p&gt;Kamal provides commands that give developers quick access to runtime diagnostics and interactive troubleshooting. These tools streamline issue resolution without requiring external monitoring setups.&lt;/p&gt;

&lt;h3&gt;Active Community and Documentation&lt;/h3&gt;

&lt;p&gt;Kamal benefits from a growing community on GitHub and comprehensive official documentation, offering quick support and detailed guides for both beginners and advanced users. This ecosystem ensures you’re never stuck when exploring its features.&lt;/p&gt;

&lt;h2&gt;Why We Chose a Managed Database Instead of a Database Container&lt;/h2&gt;

&lt;p&gt;Choosing a managed database service was a deliberate decision that has made our deployment process much simpler and more efficient. With DigitalOcean’s managed database service, many of the operational headaches of managing a database—like backups, scaling, and connection management—are handled automatically. This not only saves time but also ensures that the service provider professionally manages critical tasks like disaster recovery and high availability.&lt;/p&gt;

&lt;p&gt;Managed databases also remove the need to configure and maintain database containers, which can be tricky to set up correctly, especially for production environments. Instead of worrying about things like replication, version upgrades, and performance tuning, you can focus entirely on building and improving your application. This approach is a game-changer for small-to-medium apps, where development resources might be limited. It allows developers to deploy confidently, knowing that the database infrastructure is reliable, scalable, and secure.&lt;/p&gt;

&lt;p&gt;In our case, DigitalOcean’s managed database service was particularly appealing because of its seamless integration with other DigitalOcean products, intuitive user interface, and competitive pricing. Setting up the database was straightforward, and connecting it to the Rails app required only minor adjustments to configuration files. This simplicity made it easy to get the app up and running quickly, without spending hours on infrastructure setup.&lt;/p&gt;

&lt;p&gt;If you're deploying small or medium-sized apps or new to cloud deployments, managed databases are worth considering. They offer a balance of simplicity and robustness that’s hard to achieve with self-managed solutions.&lt;/p&gt;

&lt;h2&gt;Getting Started with Kamal - Tips, Tools, and Insider Know-How&lt;/h2&gt;

&lt;p&gt;Kamal is designed to make deployments simple and efficient, but setting up a new tool can always feel a little daunting. Here’s how to get started with Kamal and some helpful tips to make the process smoother.&lt;/p&gt;

&lt;h3&gt;Prepare Your Environment&lt;/h3&gt;

&lt;p&gt;Before diving in, ensure you have the following tools and concepts ready:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Installed and Configured&lt;/strong&gt;: Kamal relies on Docker to build and run containers, so install Docker and familiarize yourself with basics like creating a &lt;strong&gt;Dockerfile&lt;/strong&gt; and running containers. Test it locally with &lt;strong&gt;docker run hello-world&lt;/strong&gt; to confirm it’s working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH Access to Your Server&lt;/strong&gt;: Kamal uses SSHKit to communicate with your server, so set up SSH keys and verify access with &lt;strong&gt;ssh user@your-server-ip&lt;/strong&gt;. Passwordless login via keys is recommended for automation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Cloud Service Provider&lt;/strong&gt;: Decide where you’ll host your app. Kamal works seamlessly with AWS, Google Cloud Platform, DigitalOcean, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Deployed App or Sample Rails App&lt;/strong&gt;: To experiment with Kamal, it helps to have a simple Rails app ready to deploy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Install Kamal&lt;/h3&gt;

&lt;p&gt;If you’re using Ruby on Rails 8, Kamal comes pre-installed in your app. For older versions or other frameworks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add Kamal to your Gemfile:
&lt;code&gt;gem 'kamal'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;bundle install&lt;/code&gt; to install the gem.
&lt;/li&gt;
&lt;li&gt;Initialize Kamal with:
&lt;code&gt;kamal init&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This generates &lt;strong&gt;config/deploy.yml&lt;/strong&gt; (your deployment blueprint) and &lt;strong&gt;.kamal/secrets&lt;/strong&gt; (for sensitive data). Add &lt;strong&gt;.kamal/&lt;/strong&gt; to &lt;strong&gt;.gitignore&lt;/strong&gt; to keep secrets out of version control.&lt;/p&gt;

&lt;h3&gt;Configure Your &lt;code&gt;deploy.yml&lt;/code&gt; File&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;deploy.yml&lt;/strong&gt; file defines how Kamal deploys your app. Here’s a starter example for a Rails app on DigitalOcean with a managed database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service: my-app
image: username/my-app:1.0.0
servers:
  web:
    - 192.168.1.100  # Replace with your server IP
env:
  secret:
    - RAILS_MASTER_KEY
    - PRODUCTION_DB_HOST
registry:
  username: username
  password:
    - KAMAL_REGISTRY_PASSWORD   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To connect your Rails app to a managed database like DigitalOcean’s, grab the host, username, and password from your provider’s dashboard, store them in &lt;strong&gt;.kamal/secrets&lt;/strong&gt;, and reference them in &lt;strong&gt;deploy.yml&lt;/strong&gt; under &lt;strong&gt;env.secret&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro Tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service Name&lt;/strong&gt;: Match it to your app’s repository name (e.g., &lt;strong&gt;my-app&lt;/strong&gt;) for consistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Tagging&lt;/strong&gt;: Use specific versions (e.g., 1.0.0) instead of the latest for easier rollbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets&lt;/strong&gt;: Store sensitive values like &lt;strong&gt;RAILS_MASTER_KEY&lt;/strong&gt; and &lt;strong&gt;PRODUCTION_DB_HOST&lt;/strong&gt; in &lt;strong&gt;.kamal/secrets&lt;/strong&gt;, not the YAML file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roles&lt;/strong&gt;: Add &lt;strong&gt;workers:&lt;/strong&gt; under &lt;strong&gt;servers&lt;/strong&gt; if using background jobs (e.g., Sidekiq).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Understand the Deployment Workflow&lt;/h3&gt;

&lt;p&gt;Kamal uses a &lt;strong&gt;simple yet powerful workflow&lt;/strong&gt; for deployments:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build the Docker Image&lt;/strong&gt;: Kamal builds your app’s image locally or remotely (configurable in &lt;strong&gt;deploy.yml&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push to a Registry&lt;/strong&gt;: Upload the image to DockerHub or another registry specified in the registry section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy&lt;/strong&gt;: Run: &lt;strong&gt;kamal deploy&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This pulls the image to your server, starts containers, and &lt;strong&gt;performs a rolling restart for zero downtime&lt;/strong&gt;. If using accessories (e.g., Redis), they’re deployed automatically—no separate accessories flag is needed unless isolating specific updates.&lt;/p&gt;

&lt;h3&gt;Master Kamal’s Debugging Tools&lt;/h3&gt;

&lt;p&gt;Kamal includes several built-in commands to simplify debugging:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logs&lt;/strong&gt;: View real-time output with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kamal logs -f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rails Console:&lt;/strong&gt; Debug interactively on the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kamal app exec --interactive "bin/rails console"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Shell Access&lt;/strong&gt;: Inspect the container directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kamal app exec --interactive bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;Work with Accessories&lt;/h3&gt;

&lt;p&gt;For services like Redis or Sidekiq, define them as accessories in &lt;strong&gt;deploy.yml&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;accessories:
  redis:
    image: redis:latest
    host: 192.168.1.100
    port: 6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy with Kamal deploy, and Kamal manages them alongside your app. Add volumes or environment variables as needed for persistence or configuration.&lt;/p&gt;

&lt;h3&gt;Example Configuration for Deploying with Kamal&lt;/h3&gt;

&lt;p&gt;Here’s the deploy.yml for a Rails app on DigitalOcean with their managed database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service: my-rails-app
image: myusername/my-rails-app:1.0.0
servers:
  web:
    - your-droplet-ip  # From DigitalOcean dashboard
env:
  secret:
    - RAILS_MASTER_KEY
    - PRODUCTION_DB_HOST
registry:
  username: myusername
  password:
    - KAMAL_REGISTRY_PASSWORD
accessories:
  redis:
    image: redis:latest
    host: your-droplet-ip
    port: 6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;Kamal's Community and Documentation&lt;/h3&gt;

&lt;p&gt;Using a new tool can be much easier with a strong community and resources at your fingertips. Kamal offers both, making learning, troubleshooting, and exploring advanced features simple. Whether you are looking for quick answers, detailed guidance, or inspiration from other developers, tapping into Kamal’s community and documentation will accelerate your journey to mastering this powerful deployment tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit the &lt;a href="https://github.com/basecamp/kamal" rel="noopener noreferrer"&gt;Kamal GitHub repository&lt;/a&gt; to connect with other users and get quick support.&lt;/li&gt;
&lt;li&gt;Explore the&lt;a href="https://kamal-project-url.com" rel="noopener noreferrer"&gt; official Kamal documentation&lt;/a&gt; for advanced features, like load balancing and remote builds.&lt;/li&gt;
&lt;li&gt;Follow developers sharing tips on GitHub or blogs (like this one!).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Ready to give Kamal a try?&lt;/h2&gt;

&lt;p&gt;Explore Kamal's features, or experiment with a simple app to see how it fits your workflow. Whether managing small apps or planning larger deployments, tools like Kamal and managed databases can save you time and effort. Take the first step by trying it out on your next project—you might just discover your new favorite deployment tool! You might even want to check out the Maintainable Podcast episode &lt;a href="https://maintainable.fm/episodes/martin-emde-ruby-central-and-the-art-of-being-tolerant-to-change" rel="noopener noreferrer"&gt;'Martin Emde – Ruby Central and the Art of Being Tolerant to Change'&lt;/a&gt;, where Martin shares insights on effectively managing changes and complexity in Ruby applications.&lt;/p&gt;

</description>
      <category>kamal</category>
      <category>rails</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Linear and Jira: Making the Right Call for Your Team’s Workflow</title>
      <dc:creator>Autumn</dc:creator>
      <pubDate>Wed, 09 Jul 2025 17:12:56 +0000</pubDate>
      <link>https://forem.com/planetargon/linear-and-jira-making-the-right-call-for-your-teams-workflow-7me</link>
      <guid>https://forem.com/planetargon/linear-and-jira-making-the-right-call-for-your-teams-workflow-7me</guid>
      <description>&lt;p&gt;When it comes to project management tools, the choice between &lt;a href="https://linear.app/" rel="noopener noreferrer"&gt;Linear&lt;/a&gt; and &lt;a href="https://www.atlassian.com/software/jira" rel="noopener noreferrer"&gt;Jira&lt;/a&gt; isn't just about features—it's about how your team works best. Do you need a lightweight, developer-friendly experience or a platform capable of handling complex workflows and extensive reporting? Understanding the nuances of each tool can help ensure your team stays productive and efficient. Let's explore the key differences, real-world applications, and how to determine which one aligns best with your organization's needs.&lt;/p&gt;

&lt;h2&gt;Understanding Your Organization's Needs&lt;/h2&gt;

&lt;h3&gt;Size and Structure Matter&lt;/h3&gt;

&lt;p&gt;Your organization's size and structure are important factors when deciding between Linear and Jira. Are you a lean startup with a flat hierarchy? Or are you a large corporation with layers of middle management and a matrix structure?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linear&lt;/strong&gt; excels in simplicity and minimalism, making it an excellent choice for smaller teams or companies with streamlined decision-making.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jira&lt;/strong&gt;, on the other hand, offers customization and reporting capabilities, ideal for large organizations with complex workflows and multiple stakeholders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Who Needs Access?&lt;/h3&gt;

&lt;p&gt;Another consideration is who will use the tool and how. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linear&lt;/strong&gt; is designed with developers in mind. Its Slack integrations, team-managed projects, and focus on triage make it perfect for teams prioritizing speed and collaboration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jira&lt;/strong&gt; is better suited for organizations where transparency and accountability extend to many layers, from operations to engineering managers and beyond.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Insights from Real-World Use Cases&lt;/h2&gt;

&lt;h3&gt;Linear in Action&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/michael-kurt-a5964520/" rel="noopener noreferrer"&gt;Michael Kurt, our Project Manager,&lt;/a&gt; shared how Linear’s features can simplify workflows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Using Linear's Triage and Slack integrations, teams can easily manage incoming tasks and stay updated. The system encourages thoughtful comments and careful communication by connecting Linear comments to Slack tags, making collaboration seamless."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Linear also allows team-specific setups, where each product team operates independently without overlapping tickets. This compartmentalization can reduce noise and foster focused collaboration.&lt;/p&gt;

&lt;h3&gt;Jira’s Strengths&lt;/h3&gt;

&lt;p&gt;For larger corporations, &lt;a href="https://blog.planetargon.com/blog/entries/the-tools-that-make-our-agency-tick-jira" rel="noopener noreferrer"&gt;Jira's robust capabilities shine&lt;/a&gt;. As Michael observed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For companies with a structure like Operations &amp;gt; Product Manager &amp;gt; Project Manager &amp;gt; Engineering Manager &amp;gt; Pod Lead, Jira's extensive customization options ensure everyone's needs are met. However, it can become overwhelming if too many layers are involved in ticket management."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jira's detailed reporting and dashboard features make it a favorite for organizations that need to &lt;a href="https://blog.planetargon.com/blog/entries/task-based-vs-duration-based-planning-with-parallax-and-jira" rel="noopener noreferrer"&gt;monitor progress across multiple teams and departments&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Key Questions to Ask&lt;/h2&gt;

&lt;h3&gt;What Are Your Growth Goals?&lt;/h3&gt;

&lt;p&gt;If your company is scaling rapidly, consider the future:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will adding more layers to your structure require a tool with broader reporting capabilities?&lt;/li&gt;
&lt;li&gt;Do you prioritize lightweight tools to maintain agility as you grow?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;How Much Transparency Do You Need?&lt;/h3&gt;

&lt;p&gt;Both tools offer transparency, but in different ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linear's Slack integration keeps communication tight within teams.&lt;/li&gt;
&lt;li&gt;Jira's dashboards and reports are ideal for sharing progress with external stakeholders and leadership.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;The Verdict: Linear or Jira?&lt;/h2&gt;

&lt;p&gt;There's no one-size-fits-all answer, but here's a quick summary:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;strong&gt;Factor&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;
&lt;strong&gt;Linear&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;
&lt;strong&gt;Jira&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;strong&gt;Team Size&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Small to mid-sized teams
   &lt;/td&gt;
   &lt;td&gt;Large, complex organizations
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;strong&gt;Hierarchy&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Flat or minimal layers
   &lt;/td&gt;
   &lt;td&gt;Matrix or multi-layered structures
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;strong&gt;Transparency Needs&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Team-level visibility
   &lt;/td&gt;
   &lt;td&gt;Organization-wide reporting
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;strong&gt;Ease of Use&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Simple and intuitive
   &lt;/td&gt;
   &lt;td&gt;Robust but can be overwhelming
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;strong&gt;Integrations&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Excellent Slack integration
   &lt;/td&gt;
   &lt;td&gt;Wide range of integrations
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;Still Undecided? Test Both&lt;/h3&gt;

&lt;p&gt;Both Linear and Jira offer trial periods. Engage your team and run a pilot project with each tool. Pay attention to ease of onboarding, user adoption, and how well each tool supports your workflows.&lt;/p&gt;

&lt;p&gt;Choosing between Linear and Jira requires understanding your organization's size, structure, and goals. Whether you aim for efficiency or comprehensive control, the right tool can help your teams do their best work. Take the time to evaluate your needs—your future self (and your team) will thank you.   &lt;/p&gt;




&lt;h2&gt;Further Reading&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.planetargon.com/blog/entries/jira-roundup-all-of-our-jira-knowledge-in-one-spot?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Jira Roundup: All of Our Jira Knowledge in One Spot:&lt;/a&gt;&lt;/strong&gt; A comprehensive compilation of articles and insights related to Jira, offering a wealth of knowledge on best practices, templates, and practical usage strategies. &lt;/p&gt;

&lt;p&gt;This post originally appeared on &lt;a href="https://blog.planetargon.com/blog" rel="noopener noreferrer"&gt;Planet Argon's blog.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>projectmanagement</category>
      <category>remoteteams</category>
    </item>
    <item>
      <title>Hotwire for Rails Developers: Keeping UI Fast and Maintainable</title>
      <dc:creator>Autumn</dc:creator>
      <pubDate>Thu, 22 May 2025 16:11:15 +0000</pubDate>
      <link>https://forem.com/planetargon/hotwire-for-rails-developers-keeping-ui-fast-and-maintainable-28e4</link>
      <guid>https://forem.com/planetargon/hotwire-for-rails-developers-keeping-ui-fast-and-maintainable-28e4</guid>
      <description>&lt;h2&gt;The Challenge of Modern Frontend in Rails&lt;/h2&gt;

&lt;p&gt;Rails developers often face a dilemma: &lt;em&gt;Should they stick with built-in Rails tools or go all-in on React for interactivity?&lt;/em&gt; The rise of JavaScript-heavy apps has made Rails projects harder to maintain. Many teams feel forced to separate the frontend and backend, leading to extra complexity, API management, and more dependencies to manage. &lt;a href="https://blog.planetargon.com/blog/entries/ruby-on-rails-vs-react-finding-the-perfect-fit-for-your-web-development-project?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;While React is powerful&lt;/a&gt;, it often adds more overhead than necessary for traditional Rails apps.&lt;/p&gt;

&lt;p&gt;But what if you could build a modern, dynamic UI without the extra complexity?&lt;/p&gt;

&lt;h3&gt;Enter Hotwire – A Rails-native alternative&lt;/h3&gt;

&lt;p&gt;Hotwire embraces the power of server-rendered HTML while still delivering a fast, interactive user experience. Instead of shifting everything to the frontend, it keeps Rails at the core and handles interactivity in a way that feels natural to the framework.&lt;/p&gt;

&lt;p&gt;With Hotwire, you don’t need to set up a separate API, manage client-side state, or keep up with endless JavaScript updates. You get the best of both worlds—modern UI interactions without the React overhead.&lt;/p&gt;

&lt;h2&gt;What is Hotwire? A Rails Developer’s Perspective&lt;/h2&gt;

&lt;p&gt;Hotwire is a framework that brings modern UI interactivity to Rails without the complexity of a full JavaScript frontend. It keeps things simple by relying on server-rendered updates instead of pushing everything to the client.&lt;/p&gt;

&lt;p&gt;At its core, Hotwire = Turbo + Stimulus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turbo&lt;/strong&gt; – Handles fast page loads, real-time updates, and partial page changes without writing custom JavaScript. This means forms, lists, and UI interactions feel instant without managing the frontend state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stimulus&lt;/strong&gt; – A small JavaScript framework that adds enhancements where needed. Unlike React, it doesn’t take over the UI—it simply connects behavior to existing HTML elements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Why Hotwire Fits Rails So Well&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blog.planetargon.com/blog/entries/rails-in-2024-still-relevant-or-living-in-the-past?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Rails has always been about "convention over configuration."&lt;/a&gt; Instead of forcing developers to make endless decisions about frontend architecture, Hotwire follows Rails’ principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It works out of the box with Rails' existing tools.&lt;/li&gt;
&lt;li&gt;It keeps backend logic in Rails instead of spreading it across multiple layers.&lt;/li&gt;
&lt;li&gt;It reduces unnecessary complexity by avoiding heavy JavaScript frameworks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Hotwire, you don’t need to rework how your app is built—you just extend Rails' strengths to create a fast, interactive UI with minimal effort.&lt;/p&gt;

&lt;h2&gt;When to Use Hotwire Instead of React&lt;/h2&gt;

&lt;p&gt;There are many cases where React is overkill in a Rails app. If you don’t need a full-blown single-page application (SPA), React might be adding more complexity than value.&lt;/p&gt;

&lt;h3&gt;When React is Overkill&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your app isn’t an SPA, but it still has some interactive elements.&lt;/li&gt;
&lt;li&gt;You’re using React for only a few small features (modals, forms, or UI updates).&lt;/li&gt;
&lt;li&gt;You’re dealing with long build times, slow initial page loads, or performance issues caused by client-side rendering.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;When Hotwire Shines&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want to keep your app fully within Rails without adding a separate frontend framework.&lt;/li&gt;
&lt;li&gt;You need real-time updates but don’t want to set up &lt;a href="https://en.wikipedia.org/wiki/WebSocket" rel="noopener noreferrer"&gt;WebSockets&lt;/a&gt; manually.&lt;/li&gt;
&lt;li&gt;You prefer less JavaScript and more of Rails' simplicity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hotwire is a great choice for those who want modern UI features without the complexity of a JavaScript-heavy setup. It lets you build fast, interactive apps while keeping your Rails app clean and maintainable.&lt;/p&gt;

&lt;h2&gt;Hotwire in Action: How We Use it at Planet Argon&lt;/h2&gt;

&lt;p&gt;In our recent project for &lt;a href="https://www.olssonroofing.com/" rel="noopener noreferrer"&gt;Olsson Roofing&lt;/a&gt;, we built a mobile-first web application for field maintenance workers. Instead of using React as we typically would, we embraced Hotwire—Rails' modern approach to building responsive web applications without writing much JavaScript.&lt;/p&gt;

&lt;h3&gt;Turbo Streams for Form Steps&lt;/h3&gt;

&lt;p&gt;One of our main uses of Hotwire was implementing a multi-step form process for roof inspections. We used Turbo Streams to navigate different form sections without full page reloads. When users submit a form step, the controller responds with a Turbo Stream that updates just the form content:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx25n8ae9acr122ao5xsb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx25n8ae9acr122ao5xsb.png" alt="code snippet showing updates to the form content" width="645" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The form partial is structured to work with these Turbo Stream updates:  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnqgxv3qr6a6y9dl8pb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnqgxv3qr6a6y9dl8pb1.png" alt="code snippet showing Turbo Stream updates" width="748" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach allowed us to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep each form step isolated and maintainable&lt;/li&gt;
&lt;li&gt;Provide instant feedback when moving between steps&lt;/li&gt;
&lt;li&gt;Maintain a smooth user experience on mobile devices with slower connections&lt;/li&gt;
&lt;li&gt;Handle form validation errors without losing context&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Stimulus for Enhanced Interactivity&lt;/h3&gt;

&lt;p&gt;While Turbo handled most of our needs, we used Stimulus for client-side interactions that required JavaScript. Looking at our views, we can see how we connected Stimulus controllers:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffslyefgagfv07rnuo490.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffslyefgagfv07rnuo490.png" alt="code snippet to see how we connected Stimulus controllers" width="745" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This &lt;strong&gt;data-controller="form"&lt;/strong&gt; attribute connects to our form controller that handles image previews:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fit5ggdhketkdpibtpdmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fit5ggdhketkdpibtpdmh.png" alt="code snippet showing data controller form" width="370" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The controller is automatically loaded thanks to our Stimulus configuration in &lt;strong&gt;app/javascript/controllers/index.js&lt;/strong&gt;:  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2a3jfwf3dydzbr4dmve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2a3jfwf3dydzbr4dmve.png" alt="code snippet showing controllers in javascript" width="737" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;What We Learned&lt;/h3&gt;   

&lt;h4&gt;The Good&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Productivity Boost:&lt;/strong&gt; Hotwire allowed us to build interactive features with significantly less code than a React-based approach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; Thanks to Turbo's smart HTML streaming, the app feels snappy even on slower mobile connections.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;The Challenging&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mental Model Shift:&lt;/strong&gt; Coming from React, it took time to shift our thinking from client-side state management to server-side HTML updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging:&lt;/strong&gt; Initially, debugging Turbo Frame and Stream issues was tricky since they operate differently from traditional AJAX requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; While Hotwire's documentation is good, finding solutions for edge cases sometimes required diving into source code or community discussions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;What We'd Do Differently&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frame Organization:&lt;/strong&gt; We would better organize our Turbo Frames hierarchy. For example, we could have nested frames for related form sections to better manage state:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyjdgnffx5x22oiq6yen.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyjdgnffx5x22oiq6yen.png" alt="code snippet to show frame organization" width="346" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stimulus Controllers:&lt;/strong&gt; Instead of the somewhat monolithic form controller we ended up with, we would create more focused, reusable stimulus controllers. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error Handling:&lt;/strong&gt; We'd implement more robust error handling for Turbo requests, possibly with a dedicated error Stimulus controller:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95nb33hzo4z63rn2mps9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95nb33hzo4z63rn2mps9.png" alt="code snippet showing error handling" width="455" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;FAQ’s and Resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"Can Hotwire handle complex UIs?"
→ Yes, but it requires rethinking how you structure frontend logic.
&lt;/li&gt;
&lt;li&gt;"What about existing React components?"
→ Hybrid approach: Keep React where needed and transition the rest.
&lt;/li&gt;
&lt;li&gt;"Is it hard to learn?"
→ If you know Rails, you can pick up Hotwire fast—here are some of our favorite resources.

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hotwired.dev/" rel="noopener noreferrer"&gt;Hotwired.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pragprog.com/titles/jmnative/hotwire-native-for-rails-developers/" rel="noopener noreferrer"&gt;Hotwire Native for Rails Developers &lt;/a&gt;by Joe Masilotti
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arkency.com/webinars/from-react-to-hotwire/" rel="noopener noreferrer"&gt;From React to Hotwire – An Unexpected Journey&lt;/a&gt; webinar from Arkency
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pragmaticstudio.com/courses/hotwire-rails" rel="noopener noreferrer"&gt;Hotwire for Rails Developers&lt;/a&gt; course by Pragmatic Studio
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.37signals.com/announcing-hotwire-spark-live-reloading-for-rails/" rel="noopener noreferrer"&gt;Hotwire Spark: live reloading for Rails applications&lt;/a&gt; by 37 Signals
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;Key Takeaways&lt;/h2&gt;

&lt;p&gt;Our experience with Hotwire has been largely positive. While there was a learning curve, the benefits of simpler code, better performance, and enhanced reliability made it a great choice for this mobile-first application. The framework's approach to progressive enhancement particularly shined in our use case, where network connectivity couldn't be guaranteed.  &lt;/p&gt;

&lt;p&gt;We're excited to continue using Hotwire for future projects, applying the lessons we've learned to build even better applications. The framework's alignment with Rails' "convention over configuration" philosophy means we can focus more on solving business problems and less on technical implementation details.&lt;/p&gt;

&lt;p&gt;Also! Listen to Joel Hawksley discuss how frontend complexity affects maintainability and why simplicity matters on &lt;a href="https://maintainable.fm/episodes/joel-hawksley-the-hidden-costs-of-frontend-complexity" rel="noopener noreferrer"&gt;Maintainable Podcast: The Hidden Costs of Frontend Complexity.&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;We Think You'll Also Enjoy Reading...&lt;/h2&gt;   

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.planetargon.com/blog/entries/ruby-on-rails-vs-react-finding-the-perfect-fit-for-your-web-development-project" rel="noopener noreferrer"&gt;"Ruby on Rails vs. React: Finding the Perfect Fit for Your Web Development Project"&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.planetargon.com/blog/entries/how-to-measure-developer-productivity-in-a-multi-project-environment" rel="noopener noreferrer"&gt;"How to Measure Developer Productivity in a Multi-Project Environment"&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;FAQ's&lt;/h2&gt;   

&lt;h3&gt;Q: "What are the limitations of Hotwire?"&lt;/h3&gt;

&lt;p&gt;A: Hotwire simplifies building interactive Rails applications but may fall short for extremely complex, state-heavy apps typically suited for full JavaScript frameworks like React or Vue. While great for most Rails projects, it may require additional custom JavaScript or third-party integrations to handle sophisticated frontend logic or highly interactive UI components.&lt;/p&gt;

&lt;h3&gt;Q: "Can I use Hotwire with existing Rails applications?"&lt;/h3&gt;

&lt;p&gt;A: Yes! Hotwire is designed to integrate seamlessly into existing Rails apps. You can incrementally adopt it by replacing specific UI components or interactions with Turbo and Stimulus without rewriting your entire frontend.&lt;/p&gt;

&lt;h3&gt;Q: "How does Hotwire handle complex interactions?"&lt;/h3&gt;

&lt;p&gt;A: Hotwire manages complex interactions using Turbo for seamless partial page updates and Stimulus for targeted JavaScript behavior. Together, they allow developers to handle rich, interactive experiences without heavy reliance on complex JavaScript frameworks, keeping your UI maintainable and performant.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This post was originally posted on the &lt;a href="https://blog.planetargon.com/blog" rel="noopener noreferrer"&gt;Planet Argon blog&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Rails Core AMA - Rails World 2023: Hosted by...me!</title>
      <dc:creator>Robby Russell 🐘🚂</dc:creator>
      <pubDate>Wed, 18 Oct 2023 11:43:45 +0000</pubDate>
      <link>https://forem.com/planetargon/rails-core-ama-rails-world-2023-hosted-byme-355b</link>
      <guid>https://forem.com/planetargon/rails-core-ama-rails-world-2023-hosted-byme-355b</guid>
      <description>&lt;p&gt;As a &lt;a href="https://blog.planetargon.com/blog/entries/news-planet-argon-joins-the-rails-foundation"&gt;contributing member&lt;/a&gt; of the &lt;a href="https://rubyonrails.org/foundation"&gt;Ruby on Rails Foundation&lt;/a&gt;, Planet Argon is delighted to collaborate with the Rails Foundation Core members and other contributing members to improve and maintain the future of the Rails community for all of us.&lt;/p&gt;

&lt;p&gt;In a remote work world, getting together in person is challenging, so we can't pass it up when an opportunity arises!&lt;/p&gt;

&lt;p&gt;Recently, I headed out to Amsterdam for &lt;a href="https://rubyonrails.org/world"&gt;Rails World 2023&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Besides listening to insightful keynote talks and connecting with new and seasoned Rails practitioners, I was invited to host the Rails Core AMA Panel. Ten current 12 Rails Core members sat down to answer questions submitted by the Rails World community in the days leading up to the event.&lt;/p&gt;

&lt;p&gt;In case you missed it, here’s a replay of the panel discussion.&lt;/p&gt;

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




&lt;p&gt;&lt;em&gt;originally posted on &lt;a href="https://blog.planetargon.com/blog/entries/rails-core-ama-rails-world-2023-hosted-by-robby-russell"&gt;blog.planetargon.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>How To Find Top Ruby on Rails Engineers In This Market</title>
      <dc:creator>Robby Russell 🐘🚂</dc:creator>
      <pubDate>Thu, 10 Nov 2022 21:15:51 +0000</pubDate>
      <link>https://forem.com/planetargon/how-to-find-top-ruby-on-rails-engineers-in-this-market-121m</link>
      <guid>https://forem.com/planetargon/how-to-find-top-ruby-on-rails-engineers-in-this-market-121m</guid>
      <description>&lt;p&gt;Planet Argon is piloting a new service to help match Ruby on Rails engineers in the community with organizations that are struggling with their recruitment efforts.&lt;/p&gt;

&lt;p&gt;But first, some background. &lt;/p&gt;

&lt;p&gt;In 2005, we became one of the first companies to hire several Ruby on Rails developers. It's true. For a brief period, we were one of the largest employers of Rubyists, and these were some incredibly skilled individuals.&lt;/p&gt;

&lt;p&gt;Several early-on employees went on to start and work at exciting startups. One of our first Office Managers took on the first non-technical role at a startup called GitHub. Other alums went onto places like &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;, &lt;a href="https://engineyard.com/"&gt;EngineYard&lt;/a&gt;, &lt;a href="https://www.kongregate.com/"&gt;Kongregate&lt;/a&gt;, &lt;a href="https://aws.amazon.com/"&gt;Amazon Web Services&lt;/a&gt;, and &lt;a href="https://stripe.com/"&gt;Stripe&lt;/a&gt; to name a few.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lJUdRpRF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3.us-west-2.amazonaws.com/images/why%2Boffer%2Brecruiting%2Bservices%2B%281%29.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lJUdRpRF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3.us-west-2.amazonaws.com/images/why%2Boffer%2Brecruiting%2Bservices%2B%281%29.jpg" alt="why offer recruiting services" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a software consultancy, we've been able to recruit a lot of talented people across various skill levels. We've also inherited and worked on projects previously coded by hundreds of developers.&lt;/p&gt;

&lt;p&gt;I also speak with a large number of organizations who are inquiring about our &lt;a href="https://www.planetargon.com/services/ruby-on-rails-team-augmentation"&gt;Team/Staff Augmentation services&lt;/a&gt;, which is essentially a &lt;em&gt;"can we rent a few Planet Argon engineers for the next 3-6 months"&lt;/em&gt; conversation. Big-picture, these organizations would prefer to hire full-time employees, but for one reason or another, their recruitment efforts have been expensive, slow, and ineffective. &lt;/p&gt;

&lt;p&gt;While our augmentation service is a healthy alternative, it feels more like a backup plan than a long-term solution. &lt;/p&gt;

&lt;p&gt;When we partner up with them, we know, deep down, those organizations will replace us with their own hire… should they ever find the right person. Oftentimes, those organizations press ahead with their under-resourced team and cross their fingers that the right candidate will stumble across their job opening. 🤞&lt;/p&gt;

&lt;p&gt;We send an email a month or three later asking, &lt;em&gt;"Heya! Did you ever end up filling that role?"&lt;/em&gt; It's not uncommon to hear that they haven't filled it.&lt;/p&gt;

&lt;p&gt;If that role was still available, periodically, I've shared those job ads with someone I know in the Ruby on Rails community who might be a good match. As a result, several developers have landed jobs and been happy and successful in their new roles. This made me curious to discover if there was an opportunity to do more with recruiting services. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gEsuzhfQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3.us-west-2.amazonaws.com/images/successful%2Bmatch.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gEsuzhfQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3.us-west-2.amazonaws.com/images/successful%2Bmatch.jpg" alt="happy successful match" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before RailsConf 2022, the idea of recruiting services came up again while our leadership team brainstormed new services Planet Argon could offer.&lt;/p&gt;

&lt;p&gt;The previous year, we replaced several staff members who moved on to incredible opportunities that presented themselves during one of the busiest hiring sprees in the tech industry.&lt;/p&gt;

&lt;p&gt;Jokingly, we said, "We've spent so much time recruiting Rails devs; maybe someone would pay us to do this for them, too?!" That’s when the lightbulb flipped on.&lt;/p&gt;

&lt;p&gt;We know a lot of Ruby on Rails engineers. A lot of Ruby on Rails engineers know us. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We've been active contributors to the community since 2005. &lt;/li&gt;
&lt;li&gt;We produce one of the &lt;a href="https://maintainable.fm/"&gt;top 10 podcasts in the community&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Every few years, we conduct the &lt;a href="https://rails-hosting.com/"&gt;Rails community survey&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;We created one of the most popular open-source projects (&lt;a href="https://github.com/ohmyzsh/ohmyzsh"&gt;ohmyzsh&lt;/a&gt;) in the software industry. &lt;/li&gt;
&lt;li&gt;We've hosted meetups, taken &lt;a href="https://www.flickr.com/photos/planetargon/sets/72157633376622178/"&gt;60 Rubyists on hikes&lt;/a&gt;, &lt;a href="https://www.flickr.com/photos/planetargon/170934210/in/pool-argonexpress/"&gt;even train trips&lt;/a&gt; across the United States. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Through all of these projects and experiences, we've established many relationships with people across the community. &lt;br&gt;
During &lt;a href="https://railsconf.org/"&gt;RailsConf 2022&lt;/a&gt;, I found myself reconnecting with people for the first time in a few years. Global pandemics can really shake things. Some engineers said they had found themselves in tricky situations.&lt;/p&gt;

&lt;p&gt;For example, I spoke with a few people who had moved into management a few years ago, and it turns out they didn't love it. I asked if they considered stepping out of management and returning to an individual contributor role. Some of them said it was possibly an option, but most said they couldn't step down from their current team without feeling weird about it.&lt;/p&gt;

&lt;p&gt;They'd need to find a new job elsewhere. But they weren't ready to cruise the job board sites, blast their resume everywhere, and wait for a callback.&lt;/p&gt;

&lt;p&gt;Other engineers shared that they had been working at companies that broke their technology platform down into several different stacks, and they found themselves saying, "I honestly miss spending more of my day working in Ruby."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dDdBgoq6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3.us-west-2.amazonaws.com/images/successful%2Bmatch%2B%281%29.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dDdBgoq6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3.us-west-2.amazonaws.com/images/successful%2Bmatch%2B%281%29.jpg" alt="wishing for Ruby" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the conference, I shared these stories with our leadership team. It really felt like we could help some of our Rubyist colleagues navigate these challenges.&lt;/p&gt;

&lt;p&gt;We decided to take what we've learned from hiring Ruby on Rails engineers over the years and play matchmaker. We began vetting dozens of Rubyists who are (mostly) employed but curious should the right opportunity pop up.&lt;/p&gt;

&lt;p&gt;As of this last month, we can now offer another option rather than saying "best of luck" to organizations contacting us for Team/Staff Augmentation who want to hire someone.&lt;/p&gt;

&lt;p&gt;Our goal is twofold: to match skilled Ruby on Rails engineers with organizations where they can make an impact, stay engaged, and grow in their role; and to help organizations that are struggling to vet, hire, and retain experienced Ruby on Rails engineers. &lt;/p&gt;

&lt;p&gt;Looking to Hire Ruby on Rails Developers? &lt;a href="https://www.planetargon.com/services/ruby-on-rails-recruitment?utm_referrer=dev.to/planetargon"&gt;Learn more&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you a Rails Developer seeking a new role? &lt;a href="https://hi.planetargon.com/ror-recruits?utm_referrer=dev.to/planetargon"&gt;Learn more&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>rails</category>
    </item>
    <item>
      <title>Rails 6.1 is Coming Soon! How to Prepare Your App Now</title>
      <dc:creator>Robby Russell 🐘🚂</dc:creator>
      <pubDate>Mon, 07 Dec 2020 20:47:29 +0000</pubDate>
      <link>https://forem.com/planetargon/rails-6-1-is-coming-soon-how-to-prepare-your-app-now-44f4</link>
      <guid>https://forem.com/planetargon/rails-6-1-is-coming-soon-how-to-prepare-your-app-now-44f4</guid>
      <description>&lt;p&gt;&lt;del&gt;The next version of Ruby on Rails is currently being tested by the community and we anticipate a stable release in the next week.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://weblog.rubyonrails.org/2020/12/9/Rails-6-1-0-release/"&gt;Rails 6.1 is here!&lt;/a&gt; There are a number of memory optimizations, which should improve performance (aka &lt;em&gt;speed&lt;/em&gt;!) of your Rails apps.&lt;/p&gt;

&lt;p&gt;There are a number of new features, too. While there have been third-party libraries available for managing multiple databases, horizontal sharing, and switching connections on a per-database basis, it will be nice to now have this available for all applications.&lt;/p&gt;

&lt;p&gt;Another nice feature coming to Rails will allow developers to enable a feature that will disable all eager loading of database associations. This will help us shut down those pesky N+1 queries. &lt;/p&gt;

&lt;p&gt;I know that our team is thrilled to see that we'll be able to put an associated destroy call into background jobs. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://weblog.rubyonrails.org/2020/11/2/Rails-6-1-rc1-release/"&gt;Read more about other upcoming Ruby on Rails 6.1 features&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is your Rails app ready to update to 6.1?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Are you running on Rails 6.0.x? Yes, your application is ready for an upgrade.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If not, what version are you running?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rails Version&lt;/th&gt;
&lt;th&gt;Your Status&lt;/th&gt;
&lt;th&gt;Latest Release&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6.1.x-rc&lt;/td&gt;
&lt;td&gt;🎉 You're on top of things!&lt;/td&gt;
&lt;td&gt;Nov 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.0.x&lt;/td&gt;
&lt;td&gt;✅ Ready to upgrade&lt;/td&gt;
&lt;td&gt;Oct 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.2.x&lt;/td&gt;
&lt;td&gt;⚠️ Almost Ready&lt;/td&gt;
&lt;td&gt;Sept 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1.x&lt;/td&gt;
&lt;td&gt;⚠️ Upgrade to 5.2.x ASAP!&lt;/td&gt;
&lt;td&gt;March 2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0.x&lt;/td&gt;
&lt;td&gt;🚨🙀 OVERDUE for upgrade&lt;/td&gt;
&lt;td&gt;March 2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.2.x&lt;/td&gt;
&lt;td&gt;🚨😱💀 Bad situation&lt;/td&gt;
&lt;td&gt;May 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.1.x&lt;/td&gt;
&lt;td&gt;🚨😱💀 Bad situation&lt;/td&gt;
&lt;td&gt;July 2016&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.0.x&lt;/td&gt;
&lt;td&gt;🚨😱💀 Bad situation&lt;/td&gt;
&lt;td&gt;Jan 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.2.x&lt;/td&gt;
&lt;td&gt;🚨😱💀 Bad situation&lt;/td&gt;
&lt;td&gt;Sept 2016&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Why is everything prior to 5.1.x looking bad for you? Your application is no longer receiving security patches nor bug fixes from the Rails Core Team. (&lt;a href="https://rubyonrails.org/security/"&gt;See the official Rails Security Policy&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;We recommend that Ruby on Rails be upgraded one major/minor version at a time. For example, if you are running on 5.1 now, you need to upgrade to 5.2 next. &lt;/p&gt;

&lt;p&gt;In an ideal world, your goal should be to get your application running on 6.0 by the end of 2021. &lt;/p&gt;

&lt;p&gt;🤓 Read &lt;a href="https://blog.planetargon.com/entries/when-should-you-upgrade-your-rails-application"&gt;When Should You Upgrade Your Rails Application?&lt;/a&gt; to learn more about our rationale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, our developers think we should rewrite our application – do we still need to upgrade?
&lt;/h2&gt;

&lt;p&gt;To be honest, we are not fans of big rewrites. &lt;/p&gt;

&lt;p&gt;Our purpose at Planet Argon is to FIGHT THE BIG REWRITE. We even produce a podcast called &lt;a href="https://www.maintainable.fm/"&gt;Maintainable&lt;/a&gt; where we speak with experts in the industry on how to overcome the problems associated with technical debt and legacy code. We live and breathe this.&lt;/p&gt;

&lt;p&gt;We understand the temptation to exclaim, "TIME FOR A REDO!" But we know, all-to-well, that rewrites are notoriously unsuccessful. If you need to maintain your existing app while building a new app, in parallel, you have a big task ahead of you. Furthermore, if you haven't established a cohesive process to keep that technology up-to-date, what makes you think you'll have better success with a different technology stack? &lt;/p&gt;

&lt;p&gt;🤓 Read &lt;a href="https://blog.planetargon.com/entries/3-reasons-why-you-shouldnt-outsource-your-rails-upgrades"&gt;3 Reasons Why You Shouldn’t Outsource Your Rails Upgrades&lt;/a&gt; to learn more. &lt;/p&gt;

&lt;h2&gt;
  
  
  Will our Rails upgrade hurt us?
&lt;/h2&gt;

&lt;p&gt;Large companies like Shopify, Basecamp, and Github have been investing a lot of their Engineering time to contribute back to the core Rails framework. As a community, we are aiming to make sure that major/minor upgrades have limited breaking changes. &lt;/p&gt;

&lt;p&gt;We're hoping that upgrades will continue to get easier than they were several years ago. Might that be one of the reasons why you're stuck where you're at? Did you navigate an expensive upgrade before? &lt;/p&gt;

&lt;p&gt;Interested in a fresh set of eyes and a free action plan? &lt;/p&gt;

&lt;p&gt;Get in touch so that we can help you explore a &lt;a href="https://www.planetargon.com/services/rails-6-upgrade"&gt;Rails 6 Upgrade&lt;/a&gt;. &lt;/p&gt;




&lt;p&gt;&lt;em&gt;This was originally posted on &lt;a href="https://blog.planetargon.com/entries/rails-61-is-coming-soon-how-to-prepare-your-app-now"&gt;blog.planetargon.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>When Should You Upgrade Your Rails Application?</title>
      <dc:creator>Robby Russell 🐘🚂</dc:creator>
      <pubDate>Wed, 25 Nov 2020 00:43:12 +0000</pubDate>
      <link>https://forem.com/planetargon/when-should-you-upgrade-your-rails-application-39af</link>
      <guid>https://forem.com/planetargon/when-should-you-upgrade-your-rails-application-39af</guid>
      <description>&lt;p&gt;&lt;strong&gt;A. Upgrade to the latest major/minor version each year, if you can.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a general rule of thumb, Ruby on Rails has released a new version on nearly an annual basis. The core team has typically aligned these with the annual &lt;a href="https://www.railsconf.com/"&gt;RailsConf&lt;/a&gt; so that there are new features and updates to demo in keynote talks. &lt;/p&gt;

&lt;p&gt;This has consistently been the case for nearly each of the last 15 years...give or take a few.&lt;/p&gt;

&lt;p&gt;I also understand that it can be a challenge for teams to plan and prioritize upgrades. I'll touch on that more later.&lt;/p&gt;

&lt;p&gt;First, let's get down to brass tacks. We need to assess your situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the newest version of Rails?
&lt;/h2&gt;

&lt;p&gt;The community is currently kicking the tires on Rails 6.1 release candidates. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Due to COVID-19, the release cycle appears to have slowed down a touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What version is your app currently running on?
&lt;/h2&gt;

&lt;p&gt;If your Rails application is not running on either 5.2.x or 6.0.x (or newer)...&lt;strong&gt;your application is at risk&lt;/strong&gt;. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rails Version&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Latest Patch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6.1.x&lt;/td&gt;
&lt;td&gt;💚 Supported&lt;/td&gt;
&lt;td&gt;Nov 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.0.x&lt;/td&gt;
&lt;td&gt;💚 Supported&lt;/td&gt;
&lt;td&gt;Oct 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.2.x&lt;/td&gt;
&lt;td&gt;💚 Supported&lt;/td&gt;
&lt;td&gt;Sept 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1.x&lt;/td&gt;
&lt;td&gt;🚨 At Risk&lt;/td&gt;
&lt;td&gt;March 2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0.x&lt;/td&gt;
&lt;td&gt;🚨 At Risk&lt;/td&gt;
&lt;td&gt;March 2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.2.x&lt;/td&gt;
&lt;td&gt;🚨 At Risk&lt;/td&gt;
&lt;td&gt;May 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.1.x&lt;/td&gt;
&lt;td&gt;🚨 At Risk&lt;/td&gt;
&lt;td&gt;July 2016&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.0.x&lt;/td&gt;
&lt;td&gt;🚨 At Risk&lt;/td&gt;
&lt;td&gt;Jan 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.2.x&lt;/td&gt;
&lt;td&gt;🚨 At Risk&lt;/td&gt;
&lt;td&gt;Sept 2016&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;...you get the idea.&lt;/p&gt;

&lt;p&gt;The older the version, the more at risk your application is.&lt;/p&gt;

&lt;p&gt;Do you have multiple Ruby on Rails applications and want to have someone gather this information? We have a free google sheet template for you to document these details. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--06tqjBuA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3-us-west-2.amazonaws.com/images/2020/1120/ror-version-tracker.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--06tqjBuA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3-us-west-2.amazonaws.com/images/2020/1120/ror-version-tracker.png" alt="Ruby on Rails version tracker spreadsheet" width="880" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I encourage you to &lt;a href="https://docs.google.com/spreadsheets/d/1VDHSo8CWMKg7Byc_kOTSNpuHX7CK1p6tsqr05iljlFU/edit#gid=0"&gt;steal this template&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;At risk of what, exactly?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Great question! &lt;/p&gt;

&lt;p&gt;Like any software running on your laptop, smartphones... the software that we write to power our web application also has security vulnerabilities that are found. When these issues are found (usually by the good/friendly hackers who are kind enough to share what they discover), the Ruby on Rails Core Team will apply security patches and release a small update. &lt;/p&gt;

&lt;p&gt;For example, if you are running on 5.2.9, they might release 5.2.10 to patch the security hole.&lt;br&gt;
In theory, a developer on your team should be able to quickly bump up to the new version in the &lt;code&gt;Gemfile&lt;/code&gt; with one line of code change, a run through your automated tests, and a deploy. ..and that known security hole is no longer a possible backdoor for the unfriendly hackers out there.&lt;/p&gt;

&lt;p&gt;Note: &lt;a href="https://blog.planetargon.com/entries/upgrading-rails-an-interview-with-eileen-uchitelle"&gt;this can be automated&lt;/a&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  What about bug fixes?
&lt;/h3&gt;

&lt;p&gt;The other benefit to staying up-to-date is that there are 🐛 bugs found within the underlying Ruby on Rails framework from time-to-time.&lt;/p&gt;

&lt;p&gt;If they are critical enough bugs, the Rails team release will release a small patch for those. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://guides.rubyonrails.org/maintenance_policy.html"&gt;Learn more about the official Ruby on Rails Maintenance Policy&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What version are most Rails applications running on?
&lt;/h2&gt;

&lt;p&gt;Every two years, Planet Argon surveys the Ruby on Rails developer community and shares our findings. This year, we have 2,049 members of the community share a number of details about their applications.&lt;/p&gt;

&lt;p&gt;Based on the survey, ~62% of respondents said they were running on either 5.2.x or 6.x. (&lt;a href="https://rails-hosting.com/2020/#ruby-rails-version-updates"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SE3tMCgG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3-us-west-2.amazonaws.com/images/2020/1120/version%2Bof%2BRails%2Bare%2Byou%2Busing.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SE3tMCgG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://planetargon-blog.s3-us-west-2.amazonaws.com/images/2020/1120/version%2Bof%2BRails%2Bare%2Byou%2Busing.png" alt="Rails versions from 2020 Rails Community survey" width="880" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you part of the other 38% that are running on an unsupported version?&lt;/p&gt;

&lt;h2&gt;
  
  
  How often should you update your version of Rails?
&lt;/h2&gt;

&lt;p&gt;In an ideal world, your team would be aiming to stay up-to-date with Rails as new versions are released. But, we live in a world where each team has a wide range of priorities to juggle. Without a cohesive process to follow, teams will put upgrades into a someday/maybe list.&lt;/p&gt;

&lt;p&gt;We understand why this happens. &lt;/p&gt;

&lt;p&gt;Upgrades feel like a lot of work for little immediate payoff. However, this has a compound effect in that it results in making the upgrade path far more time consuming and risky to explore. As developers, we are risk-averse and product owners are worried about upgrades being drastically underestimated.&lt;/p&gt;

&lt;p&gt;The reality is that some of the major version upgrades are far from trivial. Third-party dependencies tend to be a lot of the challenges that those upgrades need to navigate.&lt;/p&gt;

&lt;p&gt;When everyone is afraid of breaking things in a  working application – the decision gets delayed for another time, place, or even worse...left for future people added to your team to have to deal with.&lt;/p&gt;

&lt;p&gt;As new engineers join your team and learn that keeping the applications up-to-date isn't part of your team's workflow, they will start to assume that it is not considered important within your company culture.&lt;/p&gt;

&lt;p&gt;Note: Delayed upgrades can definitely impact your employee retention, too. When they aren't able to leverage newer features, libraries, and/or tools in Ruby on Rails, they may start to daydream about finding a new team where the grass may (or may not) be greener.&lt;/p&gt;

&lt;p&gt;Regardless of how you spin it...this is problem. A problem that your team can (and needs to) solve!&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't you just hire a professional to upgrade for you?
&lt;/h3&gt;

&lt;p&gt;Yes! (...but I have written &lt;a href="https://blog.planetargon.com/entries/3-reasons-why-you-shouldnt-outsource-your-rails-upgrades"&gt;3 Reasons Why You Shouldn't Outsource Your Rails Upgrades&lt;/a&gt; to explain my concerns about that as a long-term "solution").&lt;/p&gt;

&lt;p&gt;Several companies have hired our team over the years to handle the underlying upgrade. We enjoy rolling up our sleeves and getting our hands dirty.&lt;/p&gt;

&lt;p&gt;However, we believe that a better approach is to provide guidance to teams on handling their own upgrade. &lt;/p&gt;

&lt;p&gt;Interested in helping get your team started? Take a look over our &lt;a href="https://www.planetargon.com/services/rails-upgrade-kickoff"&gt;Rails Upgrade Kickoff service&lt;/a&gt; and fill out the form if you'd like to talk shop about how we can help your team manage their Rails upgrade process.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This was originally posted on &lt;a href="https://blog.planetargon.com/entries/when-should-you-upgrade-your-rails-application"&gt;blog.planetargon.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>maintenance</category>
    </item>
    <item>
      <title>How To Be A Good Guest (in another team's codebase)</title>
      <dc:creator>Robby Russell 🐘🚂</dc:creator>
      <pubDate>Tue, 24 Nov 2020 22:30:35 +0000</pubDate>
      <link>https://forem.com/planetargon/how-to-be-a-good-guest-in-another-team-s-codebase-42ac</link>
      <guid>https://forem.com/planetargon/how-to-be-a-good-guest-in-another-team-s-codebase-42ac</guid>
      <description>&lt;p&gt;For nearly twenty years, I have regularly found myself (temporarily) in another team's software codebase. From being hired as a contractor, to providing emergency technical support, to helping companies understand the health of their application via a code audit...I have learned a few things (via trial-and-error) about what to--and more importantly--what not to do while being a guest.&lt;/p&gt;

&lt;p&gt;This topic is near-and-dear to me. Recently, I was a guest on the &lt;a href="https://twitter.com/DeveloperTea"&gt;Developer Tea podcast&lt;/a&gt; and we got deep into this topic. We got deep into it needed to split it up into two episodes! &lt;/p&gt;

&lt;p&gt;🎙 Listen to &lt;a href="https://spec.fm/podcasts/developer-tea/3zJ_LD_Z"&gt;part 1&lt;/a&gt; and &lt;a href="https://spec.fm/podcasts/developer-tea/bdT4iwwW"&gt;part 2&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Are you a freelancer or contractor about to temporarily participate in another Engineering team's project? Here are a few considerations for those first hours/days of being a guest. &lt;/p&gt;

&lt;p&gt;(FWIW -- you can apply this to being a new full-time team member, too!)&lt;/p&gt;

&lt;h2&gt;
  
  
  Document Your Goals 📝
&lt;/h2&gt;

&lt;p&gt;As a contractor, the company has likely brought you in to assist with something specific. What was the problem that they were encountering and/or feared they would encounter in the future? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you there because you have specific expertise that they have limited knowledge of, in-house? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do they need help upgrading their Ruby on Rails application and you've helped dozens of teams do that? Has their application become unstable? Is their test suite taking far too long to run and they need you to help them speed that up?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you there to temporarily offset needing to hire a full-time engineer? (Aka &lt;a href="https://www.planetargon.com/services/ruby-on-rails-team-augmentation"&gt;staff augmentation&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's dig deeper into this one. Why do they need to bring in additional help right now? Did they recently lose someone? Has their team's Sprint velocity drastically slowed down? Are they needing to scale up for the next few months? &lt;/p&gt;

&lt;p&gt;Whatever the case...you should understand what their underlying rationale is. You need to capture their WHY behind the decision.&lt;/p&gt;

&lt;p&gt;If there is one thing that I've learned over the years...it is that when there are a lot of moving parts, we sometimes need to remind our clients of their own decisions. &lt;/p&gt;

&lt;p&gt;As much as you would like to believe that everyone on the team you're temporarily joining is on the same page (and/or even support the idea)...it is wiser to assume they are not. &lt;/p&gt;

&lt;p&gt;That's okay, though. &lt;/p&gt;

&lt;p&gt;(Let's find comfort knowing that humans have this funny way of moving forward, together, despite an unpredictable level of chaos.)&lt;/p&gt;

&lt;p&gt;This is why it is important for you to clarify what your goal is here. You will need to own the success of it. This is what they are paying you to do.&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Anti-pattern:&lt;/strong&gt; Being passive. Showing up on Day 1 and asking, &lt;em&gt;"what do you want me to focus on? When will someone assign me tickets to work on?"&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;When you show up on Day 1, you'll want to reiterate why they hired you. Frame your questions around that. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"My goal is to help your team address X &amp;amp; Y over the next few weeks. Who would be the best person(s) to help me get up-to-speed on the current situation?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once you identify who your internal domain expert is, you'll want to reach out to them to schedule manageable blocks of time to a) reiterate your goals b) listen to them share their perspectives/concerns (capture these, too!) c) learn more about their capacity constraints, and d) ask them if there are other people on the current team who might also be helpful to help you reach your goal(s).&lt;/p&gt;

&lt;h3&gt;
  
  
  Make it a SMART Goal ⚽️
&lt;/h3&gt;

&lt;p&gt;Take a moment to think 3-4 weeks into the engagement. You're having a one-on-one chat a team lead and they ask, "&lt;em&gt;how is that project of yours coming along?"&lt;/em&gt; ...how will you respond?&lt;/p&gt;

&lt;p&gt;Ideally, you should be able to respond with, "ON TRACK" or "OFF TRACK."&lt;/p&gt;

&lt;p&gt;Software Engineers have been known to be risk-averse (for good reason!) but when we're hired guests, we should aim for removing ambiguity and/or diving too deep, too early, in a discussion. While we have to balance a lot of nuance in our jobs, let's keep be mindful to not overwhelm the person we're speaking to unless they are truly curious to get into the weeds with you.&lt;/p&gt;

&lt;p&gt;We can do this by trying to clarify them via SMART goals.&lt;/p&gt;

&lt;p&gt;💃🏻 ProTip: &lt;strong&gt;"We're on track!"&lt;/strong&gt; &lt;strong&gt;&amp;gt;&lt;/strong&gt; &lt;em&gt;"I'm on track!"&lt;/em&gt;&lt;br&gt;
(...remember, you are part of a team)&lt;/p&gt;

&lt;h4&gt;
  
  
  ...wait, WTF are SMART goals? 🤔
&lt;/h4&gt;

&lt;p&gt;Great question!&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;S.M.A.R.T.&lt;/strong&gt; is a mnemonic acronym to capture our objectives by answering whether they are Specific, Measurable, Achievable, Relevant, and Time-bound.&lt;/p&gt;

&lt;p&gt;Here is a &lt;a href="https://www.atlassian.com/blog/productivity/how-to-write-smart-goals"&gt;helpful guide on writing achievable SMART goals&lt;/a&gt; by the fine folks at Atlassian.&lt;/p&gt;

&lt;h4&gt;
  
  
  Share your SMART goal 🥅
&lt;/h4&gt;

&lt;p&gt;Rather than assume everyone shares the same understanding of the goal, it is important to share what you've captured with your new team members. &lt;/p&gt;

&lt;p&gt;There are times when your new teammates might not believe a goal is achievable...especially if they've tried (and failed) to get there in the past. This is your chance to solicit input. &lt;/p&gt;

&lt;p&gt;If it later comes up that they didn't share something useful when given a chance, then it'll be something you can recalibrate with them. &lt;/p&gt;

&lt;p&gt;Avoid assuming that this is malicious. It's plausible that it wasn't on their mind at the time and they remembered it later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Into Their Code 👩🏼‍💻👨🏻‍💻
&lt;/h2&gt;

&lt;p&gt;Let's assume that they are going to invite you to their code repository(s) and you'll be aiming to get their code up-and-running in a local development environment. &lt;/p&gt;

&lt;h3&gt;
  
  
  What kinds of changes are happening in their code?
&lt;/h3&gt;

&lt;p&gt;One of the first things that I do after cloning a repository is to start browsing the output from &lt;code&gt;git log&lt;/code&gt;. I'm looking to learn more about their team.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📝 &lt;em&gt;Do they follow commit message conventions?&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;📖 &lt;em&gt;Do the commit messages help tell a story?&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;🚢 &lt;em&gt;Are they shipping new features?&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;🐛 &lt;em&gt;Are they trying to squash a lot of bugs?&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;🎳 &lt;em&gt;Who has been actively pushing code changes into the main branch(es)?&lt;/em&gt; (The bowling ball felt fun)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using other fancy git commands, you can find files/areas of high churn, explore the maintenance (or lack thereof) of the test suite, how often documentation is updated, etc.&lt;/p&gt;

&lt;p&gt;Will you be interacting with these people on the team in the coming days? Take note of a few observations.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Wow, it seems like you've worked on a big feature recently. What was involved with that?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"It looks like you've been helpful in squashing a lot of bugs recently. Is that a big part of your role here and/or do you rotate that responsibility across the team?"&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you get their application running (locally)?
&lt;/h3&gt;

&lt;p&gt;If you're lucky, the team will have up-to-date docs that'll help you quickly get their application running in your local dev environment. You might consider timing how long this process takes.&lt;/p&gt;

&lt;p&gt;It can be helpful to report this back to a team lead to see if they are surprised by the information. If the team is encountering scaling problems, this can be one of those bottlenecks that slow down other new hires/contractors, too. &lt;/p&gt;

&lt;p&gt;If anything, they can use this data point to properly map out a realistic onboarding timeline. Similar to capturing how long it takes for your test suite to run, how long deployments take, uptime... this is another useful metric to measure. &lt;/p&gt;

&lt;h4&gt;
  
  
  Recruit a spin-up buddy, if possible
&lt;/h4&gt;

&lt;p&gt;When my team at &lt;a href="https://www.planetargon.com/"&gt;Planet Argon&lt;/a&gt; are hired by a client, we try to have two of our engineers pair up on the process of getting the application running, in parallel. This way we can try to spot gaps in the documentation, debug issues quicker, and avoid having a scenario where one person who gets out ahead of the other. &lt;/p&gt;

&lt;p&gt;If you are a solo guest working within a new-to-you team -- it might be a good idea to see if you can grab someone on the team to pair with you on setting up their application. &lt;/p&gt;

&lt;p&gt;🤹🏻‍♀️ ProTip: If you want to get a feel for how complicated this process might be...ask one of their team members how anxious they would feel if their laptop died right now. 🙀 If they had a brand new laptop with a fresh operating system installed...how disruptive would that be for them? This is someone who has experience with their application and the underlying dependencies. If it is that scary to them...think about all the unknowns to someone brand new? &lt;/p&gt;

&lt;h4&gt;
  
  
  If you need to go rogue...
&lt;/h4&gt;

&lt;p&gt;Should you not need to recruit someone to help you get up-and-running, then by all means, go on this solo mission but I encourage you to be extremely careful about this.&lt;/p&gt;

&lt;p&gt;I've witnessed this a number of times over the years (by myself and members of my team). We'll begin to dig into our client's Ruby on Rails application, getting things up and running, and we forget to do the following.&lt;/p&gt;

&lt;h5&gt;
  
  
  Share our progress!
&lt;/h5&gt;

&lt;p&gt;If the spin-up time takes a while, we would benefit ourselves (and our new teammates) by reporting on our smaller milestones.&lt;/p&gt;

&lt;p&gt;A quick list of what's been accomplished and what remains should be simple enough to share. It'll give the team a chance to highlight if anything is missing from your list.&lt;/p&gt;

&lt;h5&gt;
  
  
  Update the documentation when we find any gaps and/or inconsistencies.
&lt;/h5&gt;

&lt;p&gt;Our fresh perspective of reading and using the existing docs is a perfect time for us to create a new branch and commit updates so that we have a fresh pull-request to send when we're wrapped up.&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Anti-pattern:&lt;/strong&gt; Using language like &lt;em&gt;"fixed"&lt;/em&gt; in documentation updates. Language like "updated" should suffice. Fixed has a different connotation. Assume it used to work fine at one point. &lt;/p&gt;

&lt;h5&gt;
  
  
  Acknowledge the great docs that exist!
&lt;/h5&gt;

&lt;p&gt;While you are working your way through the documentation, if you are finding it to be well-organized and helpful, consider taking a moment to see who on the team was responsible for those updates. Look at the revision history. Reach out to the people who helped make your life easier today. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Hi Kathryn! As I'm a frequent guest in other team's codebases...I see a wide spectrum of documentation in terms of organization and usefulness. I wanted to let you know that these are some of the best setup docs that I've seen. Thanks!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Oscar - I hit a problem while trying to install all the RubyGems because nokogiri was failing to build. I was about to start debugging it but noticed you had a helpful note in the docs about how to fix the dependency problem in Mac OS Catalina. You saved my afternoon!"&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;(Obviously, only do this if you found the documentation helpful; we don't want to placate anyone! 🙃)&lt;/p&gt;

&lt;p&gt;The effort that we put into maintaining documentation tends to feel under-appreciated. Let's do our part to highlight when docs make our life easier!&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Anti-pattern:&lt;/strong&gt; Spending a ton of time trying to figure out how to fix a problem during the up-and-running phase without reaching out to other team members to ask if anyone had encountered it before. &lt;/p&gt;

&lt;p&gt;If you spend several hours trying to Google for an answer on StackOverflow -- it is possible that someone on the team has but hadn't captured that in the docs before. This will help convey that you're humble enough to ask for assistance, which the team you're temporarily joining finds value in. We hope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be Vocal As You Dig into Your Project Work
&lt;/h2&gt;

&lt;p&gt;Now that we're in a position to get crackin' on our work, it is tempting to put our headphones on and allow ourselves to get lost in the task-at-hand. While getting to a state of FLOW is important for productivity...we run the risk of being far too quiet for too long.&lt;/p&gt;

&lt;p&gt;If the team has a good cadence on regular check-ins (do they have stand-ups? Slack channel updates?) then this might not be too much of a concern. Should they have a loose communication culture then we should be proactive over-communicators...especially in those first days as a guest.&lt;/p&gt;

&lt;p&gt;What did you accomplish yesterday? What are you aiming to accomplish today? Do you have have any blockers? &lt;/p&gt;

&lt;p&gt;Find out who might be able to help you remove a blocker. Do that earlier in the day so that you have a better chance of getting time scheduled with someone who can help.&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Anti-pattern:&lt;/strong&gt;  Struggling to make meaningful progress in the first few days. We don't want our new team members to wonder what you've been up to. (While we can talk about how important it is for them to trust you...we need to earn some of that, too). Silence invites people to make assumptions. Influence the narrative!&lt;/p&gt;

&lt;p&gt;As consultants, we are often hired for our expertise. We should avoid interpreting that as them expecting us to have all the answers. Let's just strive for having good questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask for Context Not Rationale
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Heya, quick question about this feature I'm starting to work on. Why did y'all design/build this it like this?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🤦🏻‍♂️  Don't be that person. &lt;/p&gt;

&lt;p&gt;Trust me, I've learned the hard way. &lt;/p&gt;

&lt;p&gt;This is an ineffective way to win over your temporary teammates. Firstly, we shouldn't assume that the person(s) we're talking with had a hand in the design/building of something. They might have inherited it. They might agree with you if something was poorly designed... but I encourage you to be open, empathetic, and curious.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Heya, I have a quick-wish question about this feature I'm starting to work on. Would you be a good person to help me get the scoop and/or backstory?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Invite them to fill-in history. Listen. Assume that those who previously worked on it did the best that they could given the time/budget/resources available. Start from an assumption that they might agree with you.&lt;/p&gt;

&lt;p&gt;You're there to help improve it &lt;em&gt;not&lt;/em&gt; to be the person who can only point a flashlight 🔦 at it. &lt;/p&gt;

&lt;p&gt;Note: if you find that they don't see a problem with it... you should find a way to have that collaborative conversation to explore that together. YMMV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leave the Team Better Than When You Found It
&lt;/h2&gt;

&lt;p&gt;The long-term success of the team you're temporarily joining is not your primary responsibility. That isn't to say that you will not have an impact on it. With any team, it will change to a varying degree as people interact with it. &lt;/p&gt;

&lt;p&gt;As consultants/contractors/freelancers...we have a unique and value perspective when we interact with different teams. If we're curious enough, we can spot patterns in the teams we participate in and share our observations. &lt;/p&gt;

&lt;p&gt;If we care enough, we can highlight the things that you see are great about this team. The members of the team might be have been insulated by their team's bubble for a while. They may forget what it was like before. &lt;/p&gt;

&lt;p&gt;On the flip side, if things seem toxic, let's find a meaningful way to convey that to the relevant people. We might not think it is our responsibility...oftentimes, it is not...but, again, the bubble might need to be stirred up. (I'm not advocating that you try to burn it all down...but you can share what you see &lt;em&gt;is&lt;/em&gt; working or not compared to other teams you've been part of). Be mindful to not pre-diagnose the situation. &lt;/p&gt;

&lt;p&gt;Raise underlying issues (versus pointing out the culprit). &lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Anti-pattern:&lt;/strong&gt; Offering solutions versus experiments. &lt;br&gt;
Compare &lt;em&gt;"At another client, they used ABC. You should use ABC here..."&lt;/em&gt; versus &lt;em&gt;"they experimented with ABC and had good success. Have you considered experimenting with ABC here before?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Again, we're here to ask good questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;I know that I am scratching the surface at this topic. If you found yourself skimming this, let me summarize this into a few closing thoughts.&lt;/p&gt;

&lt;p&gt;As a guest (in another team's codebase), please remember that you are a temporary member of that team now. Despite your technical skills, your goal is to be a productive and helpful contributor. &lt;/p&gt;

&lt;p&gt;Be goal-oriented.&lt;/p&gt;

&lt;p&gt;Avoid playing the hero. &lt;/p&gt;

&lt;p&gt;Give credit. &lt;/p&gt;

&lt;p&gt;Confirm assumptions. &lt;/p&gt;

&lt;p&gt;Share kudos. &lt;/p&gt;

&lt;p&gt;Stay organized. &lt;/p&gt;

&lt;p&gt;Be thoughtful. &lt;/p&gt;

&lt;p&gt;Propose experiments. &lt;/p&gt;

&lt;p&gt;Be curious. &lt;/p&gt;

&lt;p&gt;Be a good guest.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>teams</category>
      <category>agile</category>
      <category>freelancing</category>
    </item>
  </channel>
</rss>
