<?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: Lucian Ghinda</title>
    <description>The latest articles on Forem by Lucian Ghinda (@lucianghinda).</description>
    <link>https://forem.com/lucianghinda</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%2F907797%2Fcd901ef3-ad6b-4b2b-b33a-d533880aa3ef.jpg</url>
      <title>Forem: Lucian Ghinda</title>
      <link>https://forem.com/lucianghinda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lucianghinda"/>
    <language>en</language>
    <item>
      <title>Good Enough Testing Workshop</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Wed, 08 Oct 2025 19:21:37 +0000</pubDate>
      <link>https://forem.com/lucianghinda/good-enough-testing-workshop-3le1</link>
      <guid>https://forem.com/lucianghinda/good-enough-testing-workshop-3le1</guid>
      <description>&lt;p&gt;There are still some spot available for &lt;a href="https://goodenoughtesting.com/learn/good-enough-testing-workshop" rel="noopener noreferrer"&gt;Good Enough Testing Workshop&lt;/a&gt; this Friday at 15:00 UTC. &lt;/p&gt;

&lt;p&gt;Here are all the details about the workshop. In case you have questions reply here or via email -&amp;gt; &lt;a href="mailto:hello@goodenoughtesting.com"&gt;hello@goodenoughtesting.com&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%2F8wm912t17qdpzn88dh43.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%2F8wm912t17qdpzn88dh43.png" alt="Good Enough Testing Workshop - details" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the workshop, I use Ruby code to demonstrate logic that facilitates discussion of various testing techniques. However, knowing Ruby is not a strict requirement.&lt;/p&gt;

&lt;p&gt;The code samples resemble pseudocode, thanks to Ruby's remarkable similarity to English. &lt;/p&gt;

&lt;p&gt;Example:&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%2Fitsvwiceg9hoaz1igqqq.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%2Fitsvwiceg9hoaz1igqqq.png" alt="Answer to the question if participants should know Ruby: no" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the workshop, we will not write any test code in RSpec or Minitest; instead, we will focus more on test design.&lt;/p&gt;

&lt;p&gt;Here is an example of a slide from the workshop where we discuss test design for low risk and low effort. We also cover high risk and high effort scenarios.&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%2Fyd6o5rd8dks7wf1mcj1l.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%2Fyd6o5rd8dks7wf1mcj1l.png" alt="Example of Test Design" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to participate register here: &lt;a href="https://goodenoughtesting.com/learn/good-enough-testing-workshop" rel="noopener noreferrer"&gt;https://goodenoughtesting.com/learn/good-enough-testing-workshop&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>testing</category>
    </item>
    <item>
      <title>LLM: removing a test because it cannot make it pass</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Wed, 08 Oct 2025 12:56:32 +0000</pubDate>
      <link>https://forem.com/lucianghinda/llm-removing-a-test-because-it-cannot-make-it-pass-42dj</link>
      <guid>https://forem.com/lucianghinda/llm-removing-a-test-because-it-cannot-make-it-pass-42dj</guid>
      <description>&lt;p&gt;During the workshop &lt;a href="https://goodenoughtesting.com/learn/reliable-test-case-generation-with-ai" rel="noopener noreferrer"&gt;on reliable test case generation using LLMs&lt;/a&gt; that I delivered at EuRuKo, I talked about the importance of staying in control for effective testing. &lt;/p&gt;

&lt;p&gt;Without it, LLMs might do things like this: After several attempts to pass a test, the option becomes simply to remove it. 🤔&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%2F4tvnedx12wgd81d8uhru.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%2F4tvnedx12wgd81d8uhru.jpeg" alt="LLM removing a test because it does not pass" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>llm</category>
      <category>ai</category>
    </item>
    <item>
      <title>A personal newsletter</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Fri, 03 Oct 2025 11:37:53 +0000</pubDate>
      <link>https://forem.com/lucianghinda/a-personal-newsletter-3mgj</link>
      <guid>https://forem.com/lucianghinda/a-personal-newsletter-3mgj</guid>
      <description>&lt;p&gt;﻿I launched a personal newsletter at &lt;a href="https://newsletter.lucianghinda.com" rel="noopener noreferrer"&gt;newsletter.lucianghinda.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This morning, I sent my first email. &lt;/p&gt;

&lt;p&gt;Why start this newsletter? I had newsletters set up in multiple places, and managing them became challenging. I want to focus on writing.&lt;/p&gt;

&lt;p&gt;What will you find inside? &lt;br&gt;
Mostly the same content I share on social media: Ruby, Rails, Testing, Creativity, and tech-related topics that I find interesting and worth sharing.&lt;br&gt;
If you enjoy my content here, you'll appreciate what you find there.&lt;/p&gt;

&lt;p&gt;This isn't a replacement for the Short Ruby Newsletter, which will continue as usual. My personal newsletter is about my interests, passions, and writings, all related to Ruby, Rails, and tech.&lt;/p&gt;

&lt;p&gt;In the Short Ruby Newsletter, my role is as a curator, ensuring we include what's essential for the Ruby community. In my personal newsletter, I can focus on what I personally enjoy and find intriguing, while also compiling my writings from various sources.&lt;/p&gt;

&lt;p&gt;Here is an example of the first edition: &lt;a href="https://newsletter.lucianghinda.com/p/welcome-to-my-personal-newsletter-a144" rel="noopener noreferrer"&gt;https://newsletter.lucianghinda.com/p/welcome-to-my-personal-newsletter-a144&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>news</category>
      <category>newsletter</category>
    </item>
    <item>
      <title>Everyone Tests Now But Are We Testing the Right Things?</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Thu, 02 Oct 2025 16:18:15 +0000</pubDate>
      <link>https://forem.com/lucianghinda/everyone-tests-now-but-are-we-testing-the-right-things-10op</link>
      <guid>https://forem.com/lucianghinda/everyone-tests-now-but-are-we-testing-the-right-things-10op</guid>
      <description>&lt;p&gt;Over the last 15 years, many companies phased out QA teams.&lt;br&gt;&lt;br&gt;
The idea: &lt;em&gt;everyone is responsible for quality.&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;That pushed developers to write more tests, and tooling improved a lot.&lt;br&gt;&lt;br&gt;
But here’s the catch: &lt;strong&gt;high coverage doesn’t always mean high quality.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Coverage Isn’t Enough
&lt;/h2&gt;

&lt;p&gt;Let’s take a simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initials&lt;/span&gt;
    &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\b\w/&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With one test you can hit 100% coverage. Add a second for a negative case, and you’re done… right?&lt;/p&gt;

&lt;p&gt;Not really.&lt;br&gt;
If the name is José Ángel, this method only returns J.&lt;br&gt;
If it’s 佐藤 陽翔, it returns nothing.&lt;/p&gt;

&lt;p&gt;Coverage reports look perfect. The user experience does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Missing: Test Design
&lt;/h2&gt;

&lt;p&gt;When QA teams disappeared, we lost something important: structured test design.&lt;/p&gt;

&lt;p&gt;Most of us never formally learned it—we picked up “write some unit tests” or “learn a framework.”&lt;/p&gt;

&lt;p&gt;But test design is about asking bigger questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What really matters for the user?&lt;/li&gt;
&lt;li&gt;Which risks are worth testing for?&lt;/li&gt;
&lt;li&gt;Which cases are most important to cover systematically?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that, testing becomes a numbers game: just write more tests.&lt;/p&gt;

&lt;p&gt;Good testing isn’t about more tests. It’s about the right tests.&lt;br&gt;
And that’s a skill every developer can (and should) learn.&lt;/p&gt;

&lt;p&gt;👉 This is a shortened version of a longer article where I go deeper into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How QA teams vanished&lt;/li&gt;
&lt;li&gt;Why developers need testing skills&lt;/li&gt;
&lt;li&gt;Practical starting points for learning test design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read the full article here at &lt;a href="https://goodenoughtesting.com/articles/what-we-lost-when-qa-teams-dissapeared" rel="noopener noreferrer"&gt;https://goodenoughtesting.com/articles/what-we-lost-when-qa-teams-dissapeared&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>testing</category>
    </item>
    <item>
      <title>Ruby San Francisco Scene is heating up</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Thu, 02 Oct 2025 10:50:35 +0000</pubDate>
      <link>https://forem.com/lucianghinda/ruby-san-francisco-scene-is-heating-up-21mk</link>
      <guid>https://forem.com/lucianghinda/ruby-san-francisco-scene-is-heating-up-21mk</guid>
      <description>&lt;p&gt;San Francisco Ruby scene is heating up&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%2Fb3u75wvn05cgq7n2c7en.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%2Fb3u75wvn05cgq7n2c7en.png" alt="Image of SF Ruby Conference" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source: &lt;a href="https://sfruby.com" rel="noopener noreferrer"&gt;https://sfruby.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Already two events planned for this year:   &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SF Ruby AI Hackathon happened in 19 July - &lt;a href="https://lu.ma/znhcct7v?tk=17VJ2z" rel="noopener noreferrer"&gt;https://lu.ma/znhcct7v?tk=17VJ2z&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;San Francisco Ruby Conference - 19-20 November - &lt;a href="https://sfruby.com" rel="noopener noreferrer"&gt;https://sfruby.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And of course let's not forget about Monthly Ruby Meetups -&amp;gt; &lt;a href="https://lu.ma/sfruby" rel="noopener noreferrer"&gt;https://lu.ma/sfruby&lt;/a&gt;, next one being on 30th June.&lt;/p&gt;

&lt;p&gt;Huge props to Irina Nazarova and the team there.  &lt;/p&gt;

&lt;p&gt;They are doing fantastic work to build up the Ruby scene in San Francisco!&lt;/p&gt;

</description>
      <category>news</category>
      <category>networking</category>
      <category>ruby</category>
      <category>ai</category>
    </item>
    <item>
      <title>Ruby Triathlon starts this week</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Tue, 02 Sep 2025 10:01:30 +0000</pubDate>
      <link>https://forem.com/lucianghinda/ruby-triathlon-starts-this-week-4131</link>
      <guid>https://forem.com/lucianghinda/ruby-triathlon-starts-this-week-4131</guid>
      <description>&lt;p&gt;The &lt;a href="https://www.rubytriathlon.com" rel="noopener noreferrer"&gt;#Ruby Triathlon&lt;/a&gt; starts this week!&lt;/p&gt;

&lt;p&gt;1️⃣ The first conference is &lt;a href="https://rubyonrails.org/world/2025" rel="noopener noreferrer"&gt;Rails World&lt;/a&gt;, taking place in Amsterdam, Netherlands, on September 4–5. This event typically features many announcements about the future of #Rails. &lt;/p&gt;

&lt;p&gt;I'm particularly curious about the Rails at Scale day and the open discussions. I hope many attendees will share ideas from those sessions.&lt;/p&gt;

&lt;p&gt;The tickets are sold out! For those attending, enjoy the conference.&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%2Fi8dglhppyvwv6ayff3xp.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%2Fi8dglhppyvwv6ayff3xp.png" alt="Rails World Hero Image" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ Next up is &lt;a href="https://friendlyrb.com" rel="noopener noreferrer"&gt;Friendly.rb&lt;/a&gt;, happening in Bucharest, Romania, on September 10-11, which is next week.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://friendlyrb.com" rel="noopener noreferrer"&gt;Friendly.rb&lt;/a&gt; is a small, friendly, and inspiring conference. We (yes, I'm one of the co-organizers) have lined up great speakers and a range of special events around the conference. Enjoy a brew-your-own-coffee corner to taste locally roasted beans, an outdoor trip to the Carpathian Mountains, a walkable city center tour, the Friendly Gameshow, and much more.&lt;/p&gt;

&lt;p&gt;I'm looking forward to the mix of deep technical presentations about Ruby and Ruby on Rails, combined with talks on AI, SaaS, marketing, and freelancing.&lt;/p&gt;

&lt;p&gt;Tickets are still available at &lt;a href="https://friendlyrb.com" rel="noopener noreferrer"&gt;friendlyrb.com&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%2F90y0une7seue9h76lmu7.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%2F90y0une7seue9h76lmu7.png" alt="Friendlyrb Hero Image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3️⃣ The third event is &lt;a href="https://2025.euruko.org" rel="noopener noreferrer"&gt;EuRuKo&lt;/a&gt;, taking place in Viana do Castelo, Portugal, on September 18-19. &lt;/p&gt;

&lt;p&gt;This conference has been running since 2003, making it 22 years old, and it is arguably the biggest #Ruby conference in Europe. This year features a mix of AI, Ruby talks, Rails talks, and workshops. I will be delivering a workshop on using AI to generate tests.&lt;/p&gt;

&lt;p&gt;Tickets are still available &lt;a href="https://2025.euruko.org" rel="noopener noreferrer"&gt;2025.euruko.org&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%2Fe836e45ufh8611nrpif4.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%2Fe836e45ufh8611nrpif4.png" alt="EuRuKo 2025 Hero Image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ruby</category>
      <category>rails</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>Flaky Tests, Courtesy of AI</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Sat, 23 Aug 2025 09:08:05 +0000</pubDate>
      <link>https://forem.com/lucianghinda/flaky-tests-courtesy-of-ai-191c</link>
      <guid>https://forem.com/lucianghinda/flaky-tests-courtesy-of-ai-191c</guid>
      <description>&lt;p&gt;When AI is writing tests in agentic mode, it's crucial to monitor its output. &lt;br&gt;
Sometimes, it uses tricks to pass the tests or creates unnecessary tests.﻿&lt;/p&gt;

&lt;p&gt;Diff from a change made by an agentic LLM: &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%2F6rgnqodoa03za0jhboll.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%2F6rgnqodoa03za0jhboll.png" alt="Diff from a change made by LLMs" width="800" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;﻿&lt;br&gt;
For example, consider this diff that has at least two issues: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The test is unnecessary for a medium-risk, medium-impact feature. It merely checks that the counter cache in Rails functions correctly. This test was written in an earlier iteration that I haven't reviewed yet. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Category model has the following constraint:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;index_categories_on_position_and_parent_id&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Notice how it added a &lt;code&gt;position: rand(1..1000)&lt;/code&gt; to make some tests to pass because they lacked the position?&lt;/p&gt;

&lt;p&gt;This approach is just inviting flaky tests!&lt;/p&gt;

&lt;p&gt;I added this to my Flakiness section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; Use consistent data across tests to avoid flakiness. Prefer existing fixtures instead of generating data randomly.
&lt;span class="p"&gt;-&lt;/span&gt; Do not use &lt;span class="sb"&gt;`rand`&lt;/span&gt; or anything similar when generating data for tests.
&lt;span class="p"&gt;-&lt;/span&gt; Use &lt;span class="sb"&gt;`travel_to`&lt;/span&gt; for all time-sensitive tests (assert time or need time to make the test work)
&lt;span class="p"&gt;-&lt;/span&gt; Use &lt;span class="sb"&gt;`.sort`&lt;/span&gt; when the results are not guaranteed to be in a specific order.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ruby</category>
      <category>rails</category>
      <category>llm</category>
      <category>ai</category>
    </item>
    <item>
      <title>New AI Testing Workshop at EuRuKo 2025</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Fri, 22 Aug 2025 15:42:21 +0000</pubDate>
      <link>https://forem.com/lucianghinda/new-ai-testing-workshop-at-euruko-2025-2kif</link>
      <guid>https://forem.com/lucianghinda/new-ai-testing-workshop-at-euruko-2025-2kif</guid>
      <description>&lt;p&gt;I started working on the workshop for &lt;a href="https://2025.euruko.org" rel="noopener noreferrer"&gt;EuRuKo 2025&lt;/a&gt;, "Don't Let Your AI Guess: Teach It to Test."&lt;/p&gt;

&lt;p&gt;The goal of this workshop is to introduce techniques for prompting that reduce the hallucinations AI may experience when asked to write tests.&lt;/p&gt;

&lt;p&gt;This is intended for individuals using AI to enhance their coding, allowing them to remain in control of which changes are applied. It's likely unsuitable for fully agentic coding (unsupervised) unless you plan to use these prompts as system instructions for your agent.&lt;/p&gt;

&lt;p&gt;Let me start with my core belief: current LLMs are NOT ready to independently write tests that achieve the following goals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify requirements&lt;/li&gt;
&lt;li&gt;Ensure the software behaves predictably and consistently over time&lt;/li&gt;
&lt;li&gt;Specify current behavior&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;They can generate unit tests that pass by examining the code, whether you or they wrote it. While this is useful, it seems like merely documenting the current code behavior. Without supervision, it's just creating more tests to confirm the code works as it is written.&lt;br&gt;
This resembles verifying requirements, but it is NOT! Verifying requirements involves writing tests based on expected behavior, not on the current business logic in the code. The surse of truth (called test oracle) for a test should be the product requirements, the users needs and the customer expectations and not the code.&lt;/p&gt;

&lt;p&gt;If you care about correctness, consider using AI to generate tests, but maintain control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select which tests the AI will write&lt;/li&gt;
&lt;li&gt;Review the test data&lt;/li&gt;
&lt;li&gt;Review the assertions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise, you might end up with tests that pass but don't effectively test what's important, leaving your users unprotected from potential bugs.&lt;/p&gt;

&lt;p&gt;I plan to do a dry-run of this workshop before the conference and if you want to get invited at a discounted price join &lt;a href="https://goodenoughtesting.com/subscribers/new" rel="noopener noreferrer"&gt;the GoodEnoughTesting newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>techtalks</category>
      <category>workshop</category>
    </item>
    <item>
      <title>Invisible work separates friction from flow.</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Thu, 21 Aug 2025 10:18:39 +0000</pubDate>
      <link>https://forem.com/lucianghinda/invisible-work-separates-friction-from-flow-1g9g</link>
      <guid>https://forem.com/lucianghinda/invisible-work-separates-friction-from-flow-1g9g</guid>
      <description>&lt;p&gt;Quote from Jony Ive about quality&lt;br&gt;
﻿No one will thank you for good error messages or default states, but they will feel it!&lt;br&gt;
The difference between friction and flow is invisible work.&lt;/p&gt;

&lt;p&gt;This is also true for the development process:&lt;br&gt;
Sloppy names turn into messy objects and interfaces. Messy objects lead to slower teams.&lt;/p&gt;

&lt;p&gt;The same goes for testing: Be careful about how you organise the code inside the test files because if it gets messy, it will slow down the development and debugging in the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It all compounds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Details are never just details! If you are using AI to generate code, make sure it generates good names in your domain.&lt;/p&gt;

</description>
      <category>product</category>
      <category>programming</category>
    </item>
    <item>
      <title>Two new Ruby podcasts from Rails Foundation and Ruby Central</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Wed, 20 Aug 2025 13:12:46 +0000</pubDate>
      <link>https://forem.com/lucianghinda/two-new-ruby-podcasts-from-rails-foundation-and-ruby-central-207m</link>
      <guid>https://forem.com/lucianghinda/two-new-ruby-podcasts-from-rails-foundation-and-ruby-central-207m</guid>
      <description>&lt;p&gt;In case you missed this in the last period, there are two new podcasts in #Ruby world: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Rails&lt;/strong&gt; - a podcast produced by the Rails Foundation and hosted by Robby Russell&lt;/p&gt;

&lt;p&gt;👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://onrails.buzzsprout.com" rel="noopener noreferrer"&gt;https://onrails.buzzsprout.com&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%2F32wux0333sj3ixekra5g.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%2F32wux0333sj3ixekra5g.png" alt="A short description of the On Rails podcast" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ruby Gems Podcast produced by Ruby Central and hosted by David Hill and Marty Haught &lt;br&gt;
👇&lt;br&gt;
&lt;a href="https://www.buzzsprout.com/2509083%EF%BB%BF" rel="noopener noreferrer"&gt;https://www.buzzsprout.com/2509083﻿&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%2F1eqde9nkdpw7ucwrlqzy.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%2F1eqde9nkdpw7ucwrlqzy.png" alt="A short description about the Ruby Gems podcast" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PS: Both of them are hosted &lt;a href="https://www.buzzsprout.com/" rel="noopener noreferrer"&gt;https://www.buzzsprout.com/&lt;/a&gt; - built also with Ruby on Rails&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>podcast</category>
    </item>
    <item>
      <title>Remember to set the frequency for replication to Litestream!</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Tue, 19 Aug 2025 08:07:52 +0000</pubDate>
      <link>https://forem.com/lucianghinda/remember-to-set-the-frequency-for-replication-to-litestream-3foj</link>
      <guid>https://forem.com/lucianghinda/remember-to-set-the-frequency-for-replication-to-litestream-3foj</guid>
      <description>&lt;p&gt;Curious about how I ended up with an invoice nearing $100 for conducting over 20 million Class A operations on Cloudflare R2?&lt;/p&gt;

&lt;p&gt;I initiated several Litestream processes across a variety of side projects and forgot to set the sync interval! :) It defaults to 1s&lt;/p&gt;

&lt;p&gt;The backup I was handling was more complex than the main production database. It included slight variations in the SQLite file because it automatically queried various external services to check the status of different entities.&lt;/p&gt;

&lt;p&gt;Just add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;sync-interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to the replica section.&lt;/p&gt;

&lt;p&gt;Here is a full example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dbs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/mnt/goodenoughtesting/current/storage/production.sqlite3&lt;/span&gt;
    &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;s3&lt;/span&gt;
        &lt;span class="na"&gt;bucket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$GOOD_ENOUGH_TESTING_BACKUP&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
        &lt;span class="na"&gt;access-key-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$LITESTREAM_ACCESS_KEY_ID&lt;/span&gt;
        &lt;span class="na"&gt;secret-access-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$LITESTREAM_SECRET_ACCESS_KEY&lt;/span&gt;
        &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$LITESTREAM_REPLICA_ENDPOINT&lt;/span&gt;
        &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auto&lt;/span&gt;
        &lt;span class="na"&gt;sync-interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ruby</category>
      <category>sqlite</category>
      <category>sql</category>
      <category>backup</category>
    </item>
    <item>
      <title>Day 3 of why to join Friendly.rb Conference</title>
      <dc:creator>Lucian Ghinda</dc:creator>
      <pubDate>Thu, 14 Aug 2025 13:33:38 +0000</pubDate>
      <link>https://forem.com/lucianghinda/day-3-of-why-to-join-friendlyrb-conference-431n</link>
      <guid>https://forem.com/lucianghinda/day-3-of-why-to-join-friendlyrb-conference-431n</guid>
      <description>&lt;p&gt;I posted already about: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/lucianghinda/day-1-of-why-you-should-join-friendlyrb-this-year-39ek"&gt;The Lineup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/lucianghinda/more-than-code-the-friendships-youll-build-at-friendlyrb-589k"&gt;The Participants&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now let's discuss the venue and why you should join &lt;a href="https://friendlyrb.com" rel="noopener noreferrer"&gt;Friendly.rb Ruby Conference 2025&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The event is happening in Romania at the Apollo111 Theatre, right in the city center. This location offers a genuine theater experience. Each year I've attended, the artistic atmosphere and history of creative expression in that room have left me feeling both relaxed and incredibly inspired to contribute more to my projects and the community.&lt;/p&gt;

&lt;p&gt;I believe #Ruby stands out as a programming language that brings artistry to coding. We often talk about beautiful code and taste, making this venue a perfect fit for our conference.&lt;/p&gt;

&lt;p&gt;Here are some pictures from the venue from last year: &lt;/p&gt;

&lt;p&gt;The coffee area:&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%2Fhivbi3zaky4w2i8fghso.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%2Fhivbi3zaky4w2i8fghso.png" alt="The coffee area"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The conference room, looking at the stage: &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%2Frg3xh4dvo3ky7k8ad5n4.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%2Frg3xh4dvo3ky7k8ad5n4.png" alt="The conference room, looking at the stage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More about coffee:
&lt;/h2&gt;

&lt;p&gt;Bucharest boasts a vibrant coffee scene with numerous roasteries and excellent cafés. Check out my list of top coffee spots here: &lt;a href="https://maps.app.goo.gl/jeMmvTNg6sqoeB7e7" rel="noopener noreferrer"&gt;https://maps.app.goo.gl/jeMmvTNg6sqoeB7e7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've also created a smaller list of great coffee shops near the FriendlyRB venue for your morning coffee run: &lt;a href="https://maps.app.goo.gl/SJ8J1T9oZosQFuVq8" rel="noopener noreferrer"&gt;https://maps.app.goo.gl/SJ8J1T9oZosQFuVq8&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Brew you own coffee corner
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/9G2CFww_pVk"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Buy your ticket at &lt;a href="https://friendlyrb.com" rel="noopener noreferrer"&gt;https://friendlyrb.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>techtalks</category>
    </item>
  </channel>
</rss>
