<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ben</title>
    <description>The latest articles on DEV Community by ben (@seawolf).</description>
    <link>https://dev.to/seawolf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F744%2F193455.png</url>
      <title>DEV Community: ben</title>
      <link>https://dev.to/seawolf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seawolf"/>
    <language>en</language>
    <item>
      <title>CharacterDex (DEV Education Track: Build Apps with Google AI Studio)</title>
      <dc:creator>ben</dc:creator>
      <pubDate>Fri, 04 Jul 2025 13:33:37 +0000</pubDate>
      <link>https://dev.to/seawolf/dev-education-track-build-apps-with-google-ai-studio-submission-468d</link>
      <guid>https://dev.to/seawolf/dev-education-track-build-apps-with-google-ai-studio-submission-468d</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is my submission for &lt;a href="https://dev.to/deved/build-apps-with-google-ai-studio"&gt;DEV Education Track: Build Apps with Google AI Studio&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Let's build an app like a Pokédex, but for fictional book or film characters!

Use Imagen for their photo and Gemini for their name, profile, short backstory, etc.

Wrap it in an app that lists human / animal / object / etc. categories or filters.

Let's pre-populate a dozen characters, if possible.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fb0jpe9pesscox9rqxugf.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%2Fb0jpe9pesscox9rqxugf.png" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://character-dex-369102945670.us-west1.run.app/" rel="noopener noreferrer"&gt;https://character-dex-369102945670.us-west1.run.app/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience
&lt;/h2&gt;

&lt;p&gt;I'm completely blown away! What would normally be a week's work, Google AI completed in a matter of seconds. I needed one tweak to make sure the images were stored and working correctly, but otherwise it was out-of-the-box.&lt;/p&gt;

</description>
      <category>deved</category>
      <category>learngoogleaistudio</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>What's the difference between a Rails application and a Rails API ?</title>
      <dc:creator>ben</dc:creator>
      <pubDate>Tue, 25 Feb 2020 12:23:58 +0000</pubDate>
      <link>https://dev.to/seawolf/what-s-the-difference-between-a-rails-application-and-a-rails-api-10lo</link>
      <guid>https://dev.to/seawolf/what-s-the-difference-between-a-rails-application-and-a-rails-api-10lo</guid>
      <description>&lt;p&gt;Ruby on Rails provides the &lt;code&gt;new&lt;/code&gt; command to create a web application; there's also the &lt;code&gt;--api&lt;/code&gt; option available for creating &lt;a href="https://guides.rubyonrails.org/api_app.html"&gt;an API application&lt;/a&gt;, which won't need much of the frontend capabilities that a full-stack application would.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WPqrOoZm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://guides.rubyonrails.org/images/getting_started/rails_welcome.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WPqrOoZm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://guides.rubyonrails.org/images/getting_started/rails_welcome.png" alt="Welcome screen of new Ruby on Rails applications" width="880" height="846"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may wonder why Rails is still a good choice for an API, which are supposed to be lightweight and machine-orientated rather than comfortable and human-orientated. The answer given by &lt;em&gt;Rails Guides&lt;/em&gt; may resonate with anyone that has developed a Ruby application of a decent size without using Rails or other frameworks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You may not have thought about which parts of Rails are still applicable even if you remove the view layer, but the answer turns out to be most of it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The features highlighted include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tools like Rack and the Rails Router to handle the HTTP layer smoothly&lt;/li&gt;
&lt;li&gt;configuration and integration of database connections&lt;/li&gt;
&lt;li&gt;dynamically generating URLs for resources&lt;/li&gt;
&lt;li&gt;caching, at various levels&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;instrumentation, both within Rails and from integrated, third-party tools&lt;/li&gt;
&lt;li&gt;auto re-loading&lt;/li&gt;
&lt;li&gt;multi-environment configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's a lot that a Rails API can offer over a plain Ruby alternative! Some frameworks are built for lighter web and/or API applications, but here we're going to concentrate on the two Rails offerings.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the differences? 🔍
&lt;/h2&gt;

&lt;p&gt;Rails Guides describes the API application as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[a] Rails application that serves JSON resources to an API client, including client-side frameworks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've put together a Git repository to demonstrate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;commit &lt;a href="https://github.com/seawolf/rails-api-comparison/commit/6ced3f8152f11d976a129aac756740d4ff72a97e"&gt;6ced3f81&lt;/a&gt; shows what a new API application looks like&lt;/li&gt;
&lt;li&gt;commit &lt;a href="https://github.com/seawolf/rails-api-comparison/commit/4d52ac3277f7e2e226bf98a46ff4293ce565b1cf"&gt;4d52ac32&lt;/a&gt; shows what a new web application looks like&lt;/li&gt;
&lt;li&gt;commit &lt;a href="https://github.com/seawolf/rails-api-comparison/commit/04db2c291993273ef84e41bb7e6984e094078d66"&gt;04db2c29&lt;/a&gt; shows the difference between a web and an API application&lt;/li&gt;
&lt;li&gt;commit &lt;a href="https://github.com/seawolf/rails-api-comparison/commit/2665ded050253b4c72d2cf07a1337751ed5a4acd"&gt;2665ded0&lt;/a&gt; shows the difference between an API and a web application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last two are of course simply opposites, but this provides a useful guide for converting one into the other.&lt;/p&gt;

&lt;p&gt;Let's take a look inside the commits to see what differences there are between the web and API applications!&lt;/p&gt;

&lt;h3&gt;
  
  
  Gems 💎
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nxDwFNSe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3g5wjob7wwpi8d5qb5wy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nxDwFNSe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3g5wjob7wwpi8d5qb5wy.png" alt="Configuration diff from Git" width="880" height="1086"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This may not be surprising, but there were the assets-related gems removed, and a hint for some CORS support added. Without the frontend driven by a browser, there's no use for the &lt;a href="https://rubygems.org/gems/web-console"&gt;&lt;code&gt;web-console&lt;/code&gt;&lt;/a&gt;, nor testing with &lt;a href="https://rubygems.org/gems/capybara"&gt;&lt;code&gt;capybara&lt;/code&gt;&lt;/a&gt; and friends.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration ⚙️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KvLCZ9z3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/65v8xs2fjpwe9g8jinme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KvLCZ9z3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/65v8xs2fjpwe9g8jinme.png" alt="Gemfile diff from Git" width="880" height="791"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rails API applications are very similar to the full web counterpart. A noticeable difference is how individual components are specified in the application's boot sequence.&lt;/p&gt;

&lt;p&gt;the main change is, of course, enabling &lt;code&gt;Rails::Application#api_only&lt;/code&gt; to trigger some changes to the internals, like skipping sessions and cookies support unless otherwise required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Application Layers 🔗
&lt;/h3&gt;

&lt;p&gt;Following the removal from the Gemfile, the &lt;code&gt;app/assets&lt;/code&gt; directory is removed. There is no need for a layout nor the &lt;code&gt;public&lt;/code&gt; pages, as the controllers given an unfulfillable request will serve the 404/422/500 HTTP status, perhaps with the error in a plain-text body content or none at all.&lt;/p&gt;

&lt;p&gt;The documentation shows how the main controller differs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;inside app/controllers/application_controller.rb, instead of:&lt;/p&gt;


&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ApplicationController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActionController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;do:&lt;/p&gt;


&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ApplicationController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActionController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;API&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;I'm not sure what impact this has, as we haven't built anything on top of the application scaffold. Maybe this can be an exploration to take in another post!&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing ✅
&lt;/h3&gt;

&lt;p&gt;It interested me that the &lt;a href="https://rubygems.org/gems/minitest"&gt;MiniTest&lt;/a&gt; scaffolding was not present in a Rails API application. I presume this is to allow complete freedom for the developers, or the Rails team didn't agree on a default!&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks For Reading! ❤️
&lt;/h2&gt;

&lt;p&gt;I hope you've enjoyed exploring what impact the innocuous &lt;code&gt;--api&lt;/code&gt; flag can have on a new Rails application!&lt;/p&gt;

&lt;p&gt;Have you started with a Rails-based API and moved it to a full web application, or vice-versa? Do you consider Rails for API applications, or prefer other approaches? Let me know in the comments below!&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>This Week In Work #4</title>
      <dc:creator>ben</dc:creator>
      <pubDate>Fri, 05 Jul 2019 18:16:26 +0000</pubDate>
      <link>https://dev.to/seawolf/this-week-in-work-4-3jcc</link>
      <guid>https://dev.to/seawolf/this-week-in-work-4-3jcc</guid>
      <description>&lt;p&gt;It's seemed easier to write these weekly reviews when there have been fewer happenings; the last few weeks have been more fast-paced. It's an interesting thought that having more things to write makes it more difficult.&lt;/p&gt;

&lt;p&gt;To break the paralysis, I hope to pick out a few events.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conferring
&lt;/h3&gt;

&lt;p&gt;I'll write up something separately, but today was the annual &lt;a href="https://brightonruby.com/2019/"&gt;Brighton Ruby conference&lt;/a&gt;. My company only had myself attend this year but we have had up to a dozen make the journey along the south coast.&lt;/p&gt;

&lt;p&gt;While I caught up with a few ex-colleagues the vast majority of my time was spent on my own, so I think for future events my attendance will depend on being in a group.&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;I enjoy the talks at these events but I'm not a networker. There's something about being there, though. We encourage anyone in the company to go to events -- I'll shout about it more next time!&lt;/p&gt;

&lt;h3&gt;
  
  
  Diving into the Unknown
&lt;/h3&gt;

&lt;p&gt;Back-story: someone wrote some code. In fact, they wrote lots of important code, and it was good. In the interest of knowledge sharing, an improvement was given to the team to pick up rather than the original implementer.&lt;/p&gt;

&lt;p&gt;The change wasn't complex: ingest some data and update our copy, shuffling the format a little on the way.&lt;/p&gt;

&lt;p&gt;Wonderfully, &lt;em&gt;I didn't need to talk with them to change their code&lt;/em&gt;: I could rely on their tests to prove my "happy path" would work. Moreover, the code was layered in such a way that meant it was easy to change. This wasn't by accident. We knew that further ingestion of other parts of the available data was inevitable, so they kept that area simple and segmented.&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;Change is not easy, but we can make it easier. Of course, write useful tests; that helps everyone that sees your code. You can help further by restraining yourself from adding &lt;em&gt;just in case&lt;/em&gt; features: instead &lt;strong&gt;leave it right before you add anything that's not necessary&lt;/strong&gt;. You'll leave a clear place to start work next time, whether that's by you or your colleagues.&lt;/p&gt;

</description>
      <category>review</category>
      <category>weeklyreview</category>
      <category>weeklyretro</category>
    </item>
    <item>
      <title>This Week In Work #3</title>
      <dc:creator>ben</dc:creator>
      <pubDate>Fri, 14 Jun 2019 14:15:24 +0000</pubDate>
      <link>https://dev.to/seawolf/this-week-in-work-3-3d47</link>
      <guid>https://dev.to/seawolf/this-week-in-work-3-3d47</guid>
      <description>&lt;p&gt;It seems a tradition to say that this was last time:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/seawolf" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kyZHRJKM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--Wwo2_SYv--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/744/193455.png" alt="seawolf"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/seawolf/this-week-in-work-2-j7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;This Week In Work #2&lt;/h2&gt;
      &lt;h3&gt;ben ・ May 2 '19 ・ 2 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#review&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#weeklyreview&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#weeklyretro&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I've recently been on holiday with my family and had a week-long trip visiting our biggest client, so you had to wait to hear what I've been paid to do this week.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready to Launch!
&lt;/h3&gt;

&lt;p&gt;We've been working towards the launch of the project that I'm leading! I've made sure to keep up the documentation and meeting minutes so everyone listening can shout out as early as possible.&lt;/p&gt;

&lt;p&gt;Both parties have accepted some shortcomings, and - importantly - backed-up by numbers, so we can launch our MVP quicker. It's great to have a cross-company team that wants to learn and iterate!&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;It's just as important to keep focussed on the &lt;em&gt;why&lt;/em&gt; at the start of a project as it is through to the end. Don't be afraid to let something change before launch, if it is important enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breathing Space
&lt;/h3&gt;

&lt;p&gt;It's been refreshing to wind-down for a few hours by working on a side-project. I'm deliberately using different designs and software patterns to what I'd normally do, in a more hands-on approach to reading books. I tend to appreciate the differences and side-effects more, this way. I hope to share more as the product takes shape, though to some it might be interesting already!&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;Professional development doesn't have to be academic, like reading thick books or writing proposals or reports. A company that trusts their colleagues won't complain if they are spending a small amount of time building things for themselves - competition clauses apply, of course! It's important to use that time to stretch yourself, as you've got the safety of being able to throw it away without costing your employer too much money.&lt;/p&gt;

</description>
      <category>review</category>
      <category>weeklyreview</category>
      <category>weeklyretro</category>
    </item>
    <item>
      <title>This Week In Work #2</title>
      <dc:creator>ben</dc:creator>
      <pubDate>Thu, 02 May 2019 16:48:52 +0000</pubDate>
      <link>https://dev.to/seawolf/this-week-in-work-2-j7</link>
      <guid>https://dev.to/seawolf/this-week-in-work-2-j7</guid>
      <description>&lt;p&gt;Publishing my first weekly review gave me such a great feeling that I'm doing it again!&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/seawolf" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kyZHRJKM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--Wwo2_SYv--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/744/193455.png" alt="seawolf"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/seawolf/this-week-in-work-1-1po" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;This Week In Work #1&lt;/h2&gt;
      &lt;h3&gt;ben ・ Apr 26 '19 ・ 4 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#review&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#weeklyreview&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#weeklyretro&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Although it's been short, it's been good; here's what I've been paid to do this week.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leading Projects!
&lt;/h3&gt;

&lt;p&gt;We're starting a project with our biggest client, and for the first time since becoming a senior developer, I've been the opportunity to lead our part! It's been great so far!&lt;/p&gt;

&lt;p&gt;I've made sure that we have made as much documentation as possible, and that it is as useful as possible. This means clearly explaining the &lt;em&gt;why&lt;/em&gt; as well as the &lt;em&gt;what&lt;/em&gt;, starting high-level before exploring the details, and making sure to identify the relationships between things as we build up the picture.&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;Start as we mean to go on, and keep going! You're not really doing the design and documentation for you, it's for your team, present, and future.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exploring Dark Corners
&lt;/h3&gt;

&lt;p&gt;... of our technology stack!&lt;/p&gt;

&lt;p&gt;I think this can be summarised with one fact:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The documentation doesn't go as far back as the (pre-1.0) version we're using.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've needed to add a few things to an existing application, but also implement a whole new process. This means understanding where and what the moving parts are, so I can find out how to create my stuff correctly. There's probably one person I can ask for help, but it is, unsurprisingly, years since they been have actively involved with the code that they would also have to search for documentation and examples.&lt;/p&gt;

&lt;p&gt;It's been fun to dive into a framework, not so fun having to guess what is the correct way to do it!&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;Maintainability is a key part of software development, and tackling technical debt always pays off. Sometimes it's tough to take the big hits, like major version upgrades, re-writes or even re-builds, but there will come a time to do it. Make it easier by doing it often.&lt;/p&gt;

&lt;p&gt;When working with older software, make sure others know about how painful it is, how much longer it's taking, and how it's not just a great thing we &lt;em&gt;should&lt;/em&gt; do. Make sure to either incorporate technical debt into the regular work cycle, or dedicate a block of time to tackle it. I'd rather tasks be easier, more fun, and take less time.&lt;/p&gt;

</description>
      <category>review</category>
      <category>weeklyreview</category>
      <category>weeklyretro</category>
    </item>
    <item>
      <title>This Week In Work #1</title>
      <dc:creator>ben</dc:creator>
      <pubDate>Fri, 26 Apr 2019 15:22:52 +0000</pubDate>
      <link>https://dev.to/seawolf/this-week-in-work-1-1po</link>
      <guid>https://dev.to/seawolf/this-week-in-work-1-1po</guid>
      <description>&lt;p&gt;A week of &lt;del&gt;frustrations&lt;/del&gt; challenges in my day job have lead me to keep a journal of them, to give me time to reflect on what's going on. This is the first of (m)any entries.&lt;/p&gt;

&lt;p&gt;Some context to my current professional role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Our teams revolve around a web application and some supporting services, such as product creation and the storage of customers' assets. The service, which I refer to as a whole, started life over ten years ago and still does essentially the same thing today. The "complications" have come about from providing various flexibilities through abstraction layers, as clients have come and gone, and the business has "grown up" quickly over the latter half of that decade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I've been involved for the latest three, an in this year I've moved from mid-level to senior developer within the team. While most of our work is web-orientated, we don't like to think of ourselves as "web development" strictly, rather "product development/engineering" more generally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We created an operations support team last year, essentially to act as 2nd line to the 1st line customer support. The ops team is made up of developers, infrastructure engineers, support staff and their team managers, on a weekly rotation. We are much more aware of and investing much more time in addressing production issues. It also aims to improve our tooling, but we've been too busy fixing broken things in the meantime.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's what I've been paid to do this week.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Migration
&lt;/h3&gt;

&lt;p&gt;My first task this week was to finish moving our application to a new version of an API. This has lasted for literally months -- the service does one thing and does it well, so few people have worked on it -- as the API provider required much more than initially documented, to the point that development, testing, and deployment was 100% successful, and that lasted a week before it 100% broke without warning. The months were spent catching up.&lt;/p&gt;

&lt;p&gt;We didn't notice the problem directly points to a lack of monitoring/reporting; we have since expanded our monitoring, which thankfully reports no other issues.&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;For our API issues, you can't manage what you don't measure. Problems will surface that no-one has seen or predicted before. This feels difficult when working with an existing system, but the reality is that it's just &lt;em&gt;progressive&lt;/em&gt;. Regular reviews will show the improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leading A Team Takes Time
&lt;/h3&gt;

&lt;p&gt;Today, I've not progressed the "active" issues I am working on. Instead, I've been helping my colleagues with their tasks and other issues, writing very reflective things like this very thing, and various project discussions.&lt;/p&gt;

&lt;p&gt;Both this team's leaders take a set time in the day for code review, stand-up, and everything else that is supposed to happen alongside everything else. It might sound obvious, but it is a deliberate act. Context switching is a productivity killer, so don't do it; it only happens as a last resort.&lt;/p&gt;

&lt;p&gt;Half an hour until a conference call, then home-time to my family.&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;The two words, "job role," mean to me the &lt;em&gt;what you do, and how you do it&lt;/em&gt;. Today, my job has been to be the "senior" instead of a "developer" and help my team get better together. It's still been a good day. (Sorry if you were waiting on that issue.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Ingesting Trusted Data
&lt;/h3&gt;

&lt;p&gt;... some of which turn out to be wrong. We trust our commercial partner to tell us the product range, and all the messy details we don't want to know. The ingestion of that data is independent of the usage, and that's great for reliability but not so great for being able to directly tell what's caused a problem in another part of the system. You need to know what you're looking at &lt;em&gt;and&lt;/em&gt; what you're looking &lt;em&gt;for&lt;/em&gt;; the two are likely to be different.&lt;/p&gt;

&lt;p&gt;I don't think the problems we have on a day-to-day basis have been getting worse. I think it's just time has just exposed it to more people, by a never-changing stream of instances. They take everyone a long time to debug, mainly due (in my opinion) to everyone having to go through the same learning to understand what's happening. Improving our tooling, for our own use, and for more people to dig into how the process is designed, would help us better understand what's going on when issues arise. As I said earlier, we've been too busy fixing the fallouts to fix the problem.&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusion
&lt;/h5&gt;

&lt;p&gt;We considered the process as "working" by it being in production with stable influences (i.e. good data coming in, giving good outputs) and having some people (now one person) knowing the full, end-to-end process. This is, of course, not sustainable long-term; people come and go, both inside and outside the domain, so new people must be able to quickly understand what's going on.&lt;/p&gt;

&lt;p&gt;Improving the tools we use is an on-going effort. The company is maintained by hiring when colleagues move on, so you must maintain the tools we all use. This does seem to take away from the capacity to deliver on clients' wishes, but open communication with the clients that we are hampered by a complicated, or at least a non-intuitive, system and want to improve it, will benefit us, them and &lt;em&gt;our&lt;/em&gt; customers.&lt;/p&gt;

</description>
      <category>review</category>
      <category>weeklyreview</category>
      <category>weeklyretro</category>
    </item>
  </channel>
</rss>
