<?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: Ender Ahmet Yurt</title>
    <description>The latest articles on DEV Community by Ender Ahmet Yurt (@eayurt).</description>
    <link>https://dev.to/eayurt</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%2F10715%2F9c5697f6-de57-470f-8667-d6fcf4a08889.JPG</url>
      <title>DEV Community: Ender Ahmet Yurt</title>
      <link>https://dev.to/eayurt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eayurt"/>
    <language>en</language>
    <item>
      <title>Why Do I Keep Killing My Side Projects?</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Mon, 20 Apr 2026 05:20:35 +0000</pubDate>
      <link>https://dev.to/eayurt/why-do-i-keep-killing-my-side-projects-31eh</link>
      <guid>https://dev.to/eayurt/why-do-i-keep-killing-my-side-projects-31eh</guid>
      <description>&lt;p&gt;I recently shut down Bloudme. It was my second personal project, which started as an RSS reader and quietly died. Before that, there was Podiscover — a social media platform for podcasts. Two projects, two deaths. At some point, you need to stop blaming circumstances and start asking harder questions.&lt;/p&gt;

&lt;p&gt;This isn't a piece that starts with "what I learned from failure" and ends optimistically. This is an attempt to understand a pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Podiscover&lt;/strong&gt; was born out of a real void. At the time, there wasn't a dedicated social platform for podcast discovery. The timing was technically perfect too. Rails and Hotwire were new, and I wanted to both learn and create something. It started well but building a social platform alone is a brutal undertaking. I couldn't find anyone to help me with the UI side. I didn't fully understand the market I was trying to target. I was alone and eventually got bored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bloudme&lt;/strong&gt; was different in scope but similar in spirit. A deliberately old-school RSS reader: share RSS links, the system pulls them every three hours, and you read them whenever you want. Simple. But simplicity wasn't enough for me. I constantly wanted to add more. Meanwhile, nobody was using it. It was burning through the money. My motivation evaporated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pattern
&lt;/h2&gt;

&lt;p&gt;When I put the two side-by-side, the same sequence emerges:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Genuine need → Technical excitement → Solitude → Doubt → Death.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both projects started with something I genuinely wanted to see exist in the world. Both offered an excuse to explore new technical fields. And both died not because the idea was bad, but because the distance between "I did it" and "someone cared" was too wide and too quiet.&lt;/p&gt;

&lt;p&gt;There are a few specific modes of failure worth naming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I confuse technical curiosity with product belief.&lt;/strong&gt; Learning Hotwire was a legitimate reason to start Podiscover. But learning a framework isn't the same as being tied to a market. Once the novelty of the technology wore off, I didn't have a deeper reason to continue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I do it alone, and solitude kills motivation faster than any technical problem.&lt;/strong&gt; I'm an introvert. Solo development comes naturally to me. But there's a difference between working alone by choice and having no one to share your progress with. No co-founder, no early user giving feedback, no one saying "it's great, keep going." Silence becomes a decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I skip the validation and go straight to building.&lt;/strong&gt; In both cases, I started coding without a single person promising to use what I was making. The market signal was zero, but the terminal was open, so I wrote. This is the classic developer trap: coding is comfortable, talking to people isn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I let even small costs fuel suspicion.&lt;/strong&gt; Running Bloudme wasn't expensive. But when you combine "nobody's using it" with "and it's costing me money," the rational conclusion writes itself. Cost isn't really the issue. It's a symbol.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I'm Not Sure About
&lt;/h2&gt;

&lt;p&gt;I don't know if this pattern is a lack of perseverance or an ability to spot dead ends early. Maybe killing Podiscover and Bloudme was the right decision both times. Maybe the real mistake wasn't abandoning them — it was starting without the conditions for success.&lt;/p&gt;

&lt;p&gt;I also don't know if I really want to build a product or if I want the identity of someone who builds products. Those are two very different things.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The first requires talking to users, iterating over tedious things, and tolerating long plateaus. The second only requires a GitHub repository and a launch tweet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Would I Do Differently?
&lt;/h2&gt;

&lt;p&gt;I'm not swearing off side projects. But next time, I want to change the inputs, not just expect different outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with a person, not a repository.&lt;/strong&gt; Before writing a single line of code, find someone who will actually use that thing and give honest feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate learning from building.&lt;/strong&gt; If the goal is to learn Hotwire or try a new Rails feature, do an experimental project. If the goal is to make something people use, choose the boring technology you already know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set a cancellation criterion beforehand.&lt;/strong&gt; Instead of slowly losing motivation over months, decide from the start: "If I don't have 10 active users by week 8, I'm stopping." Make quitting a decision, not drifting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find someone.&lt;/strong&gt; It doesn't have to be a co-founder. Just someone who cares enough to check in. A weekly "how's it going?" from someone who understands what you're doing changes everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sad but True
&lt;/h2&gt;

&lt;p&gt;Two consecutive dead projects is a data point. If it happens a third time with the same pattern — solo development, no users, death of motivation — it's not bad luck. It's a system that produces a predictable outcome.&lt;/p&gt;

&lt;p&gt;The projects didn't fail because I wasn't technically proficient. They failed because I optimized the part I enjoyed (building) and skipped the important part (connecting with users). It's not a project problem. It's a me problem.&lt;/p&gt;

&lt;p&gt;And knowing this is either the first step toward fixing it, or another form of complacent self-awareness that changes nothing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write about Ruby, Rails, and software development every Thursday. You can follow me at &lt;a href="https://enderahmetyurt.com" rel="noopener noreferrer"&gt;enderahmetyurt.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sideprojects</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why I Stopped Using STI and Started Using Delegated Types</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Thu, 16 Apr 2026 05:33:26 +0000</pubDate>
      <link>https://dev.to/eayurt/why-i-stopped-using-sti-and-started-using-delegated-types-24pp</link>
      <guid>https://dev.to/eayurt/why-i-stopped-using-sti-and-started-using-delegated-types-24pp</guid>
      <description>&lt;p&gt;We hold a Ruby Campfire at the company I work for, bi-weekly. It's not a real campfire of course — we work remotely! Recently, we talked about Ruby delegated types in one of those meetings. It was really interesting. I used to use STI (Single Table Inheritance) to connect multiple tables, but it turns out there is a different and more effective solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;Single-table inheritance looks simple at first. One table, one &lt;code&gt;type&lt;/code&gt; column, done. Rails makes it easy to set up.&lt;/p&gt;

&lt;p&gt;But then the problems start.&lt;/p&gt;

&lt;p&gt;I've been writing Rails apps for over 14 years. I've seen the STI trap many times in my own code too. You start with two or three similar models, put them in one table, and move on. Six months later, the table has thirty columns. Most of them are &lt;code&gt;NULL&lt;/code&gt; for any given row. The &lt;code&gt;type&lt;/code&gt; column is the only thing keeping it together.&lt;/p&gt;

&lt;p&gt;There's a better option. Rails has had it since 6.1. It's called delegated types.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Wrong With STI
&lt;/h2&gt;

&lt;p&gt;STI works fine when your models are very similar. When they share most columns and only differ a little in behavior. The Rails docs say it clearly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"STI works best when there's little divergence between the subclasses and their attributes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A simple example: you have &lt;code&gt;Message&lt;/code&gt; and &lt;code&gt;Comment&lt;/code&gt;. You want to show both in a feed and paginate them together. STI lets you do that. But a &lt;code&gt;Message&lt;/code&gt; has a &lt;code&gt;subject&lt;/code&gt; column. A &lt;code&gt;Comment&lt;/code&gt; doesn't. With STI, the comment row gets a &lt;code&gt;subject&lt;/code&gt; column anyway. It's just always &lt;code&gt;NULL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Do this with enough models and enough columns, and your table becomes a mess. It's hard to query, hard to index, and hard to understand.&lt;/p&gt;

&lt;p&gt;Polymorphic associations fix the sparse table problem, but they bring other issues: no foreign key constraints, more complex queries, and it gets confusing fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Third Option
&lt;/h2&gt;

&lt;p&gt;DHH added delegated types to Rails 6.1. The idea is simple: keep the shared columns in one &lt;strong&gt;"superclass"&lt;/strong&gt; table. Give each subclass its own table for the columns that are specific to it.&lt;/p&gt;

&lt;p&gt;DHH said this pattern had &lt;em&gt;"the most profound impact on how we do domain modeling at Basecamp"&lt;/em&gt;. They used it in Basecamp 3 and then in HEY.&lt;/p&gt;

&lt;p&gt;Here's how it looks. You have an &lt;code&gt;Entry&lt;/code&gt; model. It holds the shared stuff: &lt;code&gt;creator_id&lt;/code&gt;, &lt;code&gt;account_id&lt;/code&gt;, timestamps. Then &lt;code&gt;Message&lt;/code&gt; and &lt;code&gt;Comment&lt;/code&gt; each have their own tables with their own specific columns.&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;Entry&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="n"&gt;delegated_type&lt;/span&gt; &lt;span class="ss"&gt;:entryable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;types: &lt;/span&gt;&lt;span class="sx"&gt;%w[ Message Comment ]&lt;/span&gt;
  &lt;span class="n"&gt;delegate&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;to: :entryable&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Message&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;title&lt;/span&gt;
    &lt;span class="n"&gt;subject&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Comment&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;title&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;truncate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&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;Now you can call &lt;code&gt;entry.title&lt;/code&gt; on anything in the feed. &lt;code&gt;Message&lt;/code&gt; returns its subject. &lt;code&gt;Comment&lt;/code&gt; returns a short preview. The caller doesn't need to care which one it is.&lt;/p&gt;

&lt;p&gt;The schema stays clean. The &lt;code&gt;entries&lt;/code&gt; table has only shared columns. The &lt;code&gt;messages&lt;/code&gt; and &lt;code&gt;comments&lt;/code&gt; tables have only their own columns. No &lt;code&gt;NULL&lt;/code&gt; columns, no &lt;code&gt;if record.type == "Message"&lt;/code&gt; checks in your views.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Is This Different From Polymorphic Associations?
&lt;/h2&gt;

&lt;p&gt;Delegated types are built on top of polymorphic associations. DHH called it &lt;strong&gt;"syntactic sugar"&lt;/strong&gt; in some early discussions. But the intent is different.&lt;/p&gt;

&lt;p&gt;With normal polymorphic associations, you go from parent to child: fetch a &lt;code&gt;Post&lt;/code&gt;, then get its &lt;code&gt;images&lt;/code&gt;. With delegated types, you go the other way. You query from &lt;code&gt;Entry&lt;/code&gt; and let it delegate to the specific type. &lt;code&gt;Entry&lt;/code&gt; is the main entry point. &lt;code&gt;Message&lt;/code&gt; and &lt;code&gt;Comment&lt;/code&gt; are details.&lt;/p&gt;

&lt;p&gt;This means you can write &lt;code&gt;Entry.all&lt;/code&gt; and paginate across all types with no &lt;code&gt;UNION&lt;/code&gt; queries. You can eager-load associations on &lt;code&gt;Entry&lt;/code&gt;. You can build controllers around &lt;code&gt;Entry&lt;/code&gt; that work for both messages and comments.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use It
&lt;/h2&gt;

&lt;p&gt;Delegated types aren't always the right choice. If your models are very similar and you don't need pagination across types, STI is fine.&lt;/p&gt;

&lt;p&gt;But if you see yourself doing any of these things, delegated types are worth trying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding columns to an STI table that only one model uses&lt;/li&gt;
&lt;li&gt;Writing &lt;code&gt;if record.type == "Message"&lt;/code&gt; in views or controllers&lt;/li&gt;
&lt;li&gt;Having trouble paginating across different model types&lt;/li&gt;
&lt;li&gt;Building a feed, timeline, or activity log with different kinds of content&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One Thing to Know
&lt;/h2&gt;

&lt;p&gt;When you need to filter by a subtype-specific column, you need a join. If you want to filter by &lt;code&gt;messages.subject&lt;/code&gt;, you join &lt;code&gt;entries&lt;/code&gt; to &lt;code&gt;messages&lt;/code&gt;. This is usually fine, but it's good to know before you start.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Set It Up
&lt;/h2&gt;

&lt;p&gt;Creating a record is simple:&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="no"&gt;Entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;entryable: &lt;/span&gt;&lt;span class="no"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;content: &lt;/span&gt;&lt;span class="s2"&gt;"Hello!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="ss"&gt;creator: &lt;/span&gt;&lt;span class="no"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;account: &lt;/span&gt;&lt;span class="no"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;account&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rails gives you scopes and helpers automatically: &lt;code&gt;Entry.messages&lt;/code&gt;, &lt;code&gt;Entry.comments&lt;/code&gt;, &lt;code&gt;entry.message?&lt;/code&gt;, &lt;code&gt;entry.comment?&lt;/code&gt;. Rendering is clean too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight erb"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;%# entries/_entry.html.erb %&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="s2"&gt;"entries/entryables/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entryable_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;entry: &lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each type gets its own partial. &lt;code&gt;Entry&lt;/code&gt; doesn't need to know which one to pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;Rails is opinionated. It bets that good conventions make code easier to work with over time. Delegated types feel like one of those conventions — not a new abstraction for its own sake, but a name and a structure for something developers were already doing by hand, usually in a messier way.&lt;/p&gt;

&lt;p&gt;If you've been using STI out of habit, it's worth reconsidering. Not every model hierarchy needs delegated types. But the ones that do will be much cleaner for it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write about Ruby, Rails, and software development every Thursday. You can follow me at &lt;a href="https://enderahmetyurt.com" rel="noopener noreferrer"&gt;enderahmetyurt.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>design</category>
      <category>database</category>
    </item>
    <item>
      <title>The Hidden Cost: AI's Time Complexity Trap</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Mon, 13 Apr 2026 06:07:09 +0000</pubDate>
      <link>https://dev.to/eayurt/the-hidden-cost-ais-time-complexity-trap-57h2</link>
      <guid>https://dev.to/eayurt/the-hidden-cost-ais-time-complexity-trap-57h2</guid>
      <description>&lt;p&gt;These days, the moment a problem gets stuck in our heads, we turn to AI for help. We explain our problem, it gives us some answers. How accurate or high-quality those answers are is always up for debate. If we know the subject well or have some background, it's easy to interpret AI's responses but what do we do when we don't?&lt;/p&gt;

&lt;p&gt;As developers, AI is now a tool for us. I think there's no one left among us who doesn't use it. From writing code from scratch to updating existing code, AI is now our teammate in many tasks. But how consciously does this new teammate suggest code? How much of the code it suggests actually works properly? Can we be sure that code won't cause us problems down the road?&lt;/p&gt;

&lt;p&gt;I wanted to start this post with some questions to stir things up a bit. The answers are all hidden within us. Today I want to talk a little about my own experiences, about the consequences of accepting AI-written code without thinking, and about how we can catch those problems early if we just stop and think.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Silent Trap
&lt;/h2&gt;

&lt;p&gt;You ask AI: &lt;em&gt;"How can I find duplicates in this array of 100,000 user records?"&lt;/em&gt; It gives you 20 lines of clean, working code. You copy it. It works. You deploy it. Three months later, your data import job takes 45 minutes instead of 5. That's the hidden cost of not reading the code AI wrote for you.&lt;/p&gt;

&lt;p&gt;Here's the thing about AI-generated code: &lt;strong&gt;it works, but it usually doesn't work efficiently&lt;/strong&gt;. AI models are trained on a massive corpus of code collected from the internet. That code reflects the average, not best practices. When you ask an AI to solve a problem, it statistically generates the most common solution, not the most optimal one.&lt;/p&gt;

&lt;p&gt;And here's the key point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you don't understand what the code does, you can't see the inefficiency&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn't about AI being "bad" or developers being "lazy." It's about a fundamental shift in how we consume code. Back in 2015 when you copy-pasted from Stack Overflow, you'd usually skim through the answers and pick the one that made sense. You &lt;em&gt;understood&lt;/em&gt; what you were copying. With AI, code looks so fluent, so professional, that understanding it feels optional. But it's not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example 1
&lt;/h2&gt;

&lt;p&gt;Let me give a concrete example from my data migration work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Let's say I have a CSV file with 50,000 user records. Each record needs to be deduplicated by email address before importing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A typical AI solution:&lt;/strong&gt;&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;UserImporter&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deduplicate_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;deduplicated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;deduplicated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;next&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="n"&gt;deduplicated&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;deduplicated&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;Looks reasonable, right? It works. With 100 records you won't notice anything. But what about 50,000 records?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time complexity:&lt;/strong&gt; O(N²)&lt;/p&gt;

&lt;p&gt;Why? For each record (N iterations), you're checking whether it exists in the deduplicated array using &lt;code&gt;.any?&lt;/code&gt; (which is another N iterations in the worst case). That's nested loops. That's exponential pain. To visualize it quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1st record: 1 check&lt;/li&gt;
&lt;li&gt;2nd record: 2 checks&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;50,000th record: 50,000 checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total: &lt;strong&gt;~1.25 billion&lt;/strong&gt; comparisons.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;On a modest server that handles ~1 million comparisons per second, you're spending more than 20 minutes just to remove duplicate records.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;A Better Solution:&lt;/strong&gt;&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;UserImporter&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deduplicate_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;seen_emails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;

    &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;seen_emails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="kp"&gt;false&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;seen_emails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="kp"&gt;true&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&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;&lt;strong&gt;Time complexity:&lt;/strong&gt; O(N)&lt;/p&gt;

&lt;p&gt;Same 50,000 records. Same logic. The difference? Instead of taking more than 20 minutes, it finishes in seconds.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Understanding the tradeoff between array lookup (O(N)) and hash/set lookup (O(1))&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Example 2
&lt;/h2&gt;

&lt;p&gt;The first example was about processing large files, and maybe not everyone deals with that day-to-day. But the example I'm about to give is something we all run into very often — &lt;strong&gt;N+1&lt;/strong&gt;.&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="c1"&gt;# What AI suggests&lt;/span&gt;
&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;  &lt;span class="c1"&gt;# A SQL query runs for each user&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# The code after paying attention and fixing it&lt;/span&gt;
&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:posts&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;  &lt;span class="c1"&gt;# All data loaded, single query runs&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example 3
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# O(N²) nested loop:&lt;/span&gt;
&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="n"&gt;array1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;array2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Better:&lt;/span&gt;
&lt;span class="n"&gt;common&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;array2&lt;/span&gt;
&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Does This Matter?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Data Grows Faster Than Hardware&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your test data has 100 records. Production has 100,000. An O(N²) algorithm that's invisible in tests becomes a bottleneck in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AI Doesn't Know Your Context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI generally answers your question. It can't know &lt;em&gt;why&lt;/em&gt; you're asking or what you're going to do with the answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Performance Debt Accumulates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bad algorithm + bad algorithm + bad algorithm = system failure. You won't notice individual O(N²) operations. But when you have 10 of them on your critical path, a feature that "should take 2 seconds" takes 20.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Should We Do?
&lt;/h2&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read the code.&lt;/strong&gt; Don't skim it. Read it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask about scale.&lt;/strong&gt; "This works for 100 records. What about 100,000?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for common traps&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Unjustified nested loops&lt;/li&gt;
&lt;li&gt;Array operations inside loops (&lt;code&gt;.include?&lt;/code&gt;, &lt;code&gt;.any?&lt;/code&gt;, &lt;code&gt;.select&lt;/code&gt; in an O(N) context)&lt;/li&gt;
&lt;li&gt;N+1 queries in databases&lt;/li&gt;
&lt;li&gt;Unnecessary sorting&lt;/li&gt;
&lt;li&gt;String concatenation in loops&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understand the why.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Benchmark early.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We're getting used to not understanding the code we write&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI promised to make us more productive. And it does. But productivity without understanding is technical debt with a smile.&lt;/p&gt;

&lt;p&gt;AI is a powerful tool. But tools don't eliminate the need for craftsmanship. They amplify it.&lt;/p&gt;

&lt;p&gt;So next time AI gives you 20 lines of working code — don't just run it. &lt;strong&gt;Read it. Understand it. Question it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because in the age of AI, code literacy is not optional — it's part of surviving in our industry.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write about Ruby, Rails, and software development every Thursday. You can follow me at &lt;a href="https://enderahmetyurt.com" rel="noopener noreferrer"&gt;enderahmetyurt.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ruby</category>
      <category>programming</category>
      <category>performance</category>
    </item>
    <item>
      <title>Accessing Values in a Hash with dig in Ruby: Differences and Alternatives</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Mon, 02 Dec 2024 13:34:05 +0000</pubDate>
      <link>https://dev.to/eayurt/accessing-values-in-a-hash-with-dig-in-ruby-differences-and-alternatives-294</link>
      <guid>https://dev.to/eayurt/accessing-values-in-a-hash-with-dig-in-ruby-differences-and-alternatives-294</guid>
      <description>&lt;p&gt;Hello 👋&lt;/p&gt;

&lt;p&gt;Ruby provides multiple ways to access Hash values. The dig method offers a safe approach for retrieving values from nested Hash or Array structures. Let's explore how dig works, along with its alternatives and key differences:&lt;/p&gt;

&lt;h2&gt;
  
  
  Using dig
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;dig&lt;/code&gt; method lets you traverse nested structures by specifying a path of keys. Rather than raising an error when a key doesn't exist, it simply returns &lt;code&gt;nil&lt;/code&gt;.&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="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;profile: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Ender"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;age: &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Accessing the 'name' value&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Ender"&lt;/span&gt;

&lt;span class="c1"&gt;# Invalid path&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:city&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safe:&lt;/strong&gt; Avoids errors by returning nil if any key is missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readable:&lt;/strong&gt; Makes code cleaner when working with complex structures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Alternatives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Chaining Keys
&lt;/h3&gt;

&lt;p&gt;While you can chain keys directly to access a value, this approach is risky—it will raise a &lt;code&gt;NoMethodError&lt;/code&gt; if any intermediate key is &lt;code&gt;nil&lt;/code&gt;.&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="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;profile: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Ender"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;age: &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Accessing the 'name' value&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:profile&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Ender"&lt;/span&gt;

&lt;span class="c1"&gt;# Invalid path&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:address&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:city&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Error: undefined method `[]' for nil:NilClass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Unlike &lt;code&gt;dig&lt;/code&gt;, chaining keys can result in errors if the path is invalid.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Using Safe Navigation Operator (&amp;amp;.)
&lt;/h3&gt;

&lt;p&gt;The safe navigation operator (&lt;code&gt;&amp;amp;.&lt;/code&gt;), introduced in Ruby 2.3, lets you chain method calls safely by returning &lt;code&gt;nil&lt;/code&gt; when encountering a &lt;code&gt;nil&lt;/code&gt; value instead of raising an error.&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="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;profile: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Ender"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;age: &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Accessing the 'name' value&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Ender"&lt;/span&gt;

&lt;span class="c1"&gt;# Invalid path&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:city&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;A more modern approach that can be combined with dig for added flexibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Using fetch
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;fetch&lt;/code&gt; method retrieves a value for a given key and raises an error if the key doesn't exist. You can handle missing keys by providing either a default value or a block.&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="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;profile: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Ender"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;age: &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Accessing the 'name' value&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:profile&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Default Name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Ender"&lt;/span&gt;

&lt;span class="c1"&gt;# Missing key with default value&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:profile&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Unknown"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Unknown"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;fetch can provide a default value for missing keys, but it must be called at each level of a nested structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deep Search with each_with_object
&lt;/h3&gt;

&lt;p&gt;To search for a key nested deep within a structure, you can use specialized methods like &lt;code&gt;each_with_object&lt;/code&gt;.&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="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;profile: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Ender"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;age: &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deep_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each_with_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
    &lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deep_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;deep_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Ender"&lt;/span&gt;
&lt;span class="n"&gt;deep_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 38&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Useful for deep searches but more complex and computationally expensive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion: Which Method to Use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If &lt;strong&gt;safety and readability&lt;/strong&gt; are your primary concerns when working with nested data structures, consider using the built-in &lt;strong&gt;&lt;code&gt;dig&lt;/code&gt;&lt;/strong&gt; method, which gracefully handles nil values and provides a clear, chainable syntax.&lt;/li&gt;
&lt;li&gt;When dealing with &lt;strong&gt;flat Hash structures&lt;/strong&gt; that have a simple, single-level organization, direct key chaining using square bracket notation or dot syntax proves to be the most straightforward and effective approach for accessing values.&lt;/li&gt;
&lt;li&gt;In scenarios where you need to handle &lt;strong&gt;default values&lt;/strong&gt; or implement robust error handling mechanisms, the &lt;strong&gt;&lt;code&gt;fetch&lt;/code&gt;&lt;/strong&gt; method offers comprehensive options for specifying fallback values and custom error messages when keys are not found.&lt;/li&gt;
&lt;li&gt;For situations involving &lt;strong&gt;complex searches&lt;/strong&gt; through deeply nested data structures with multiple levels, leverage powerful enumerable methods like &lt;strong&gt;&lt;code&gt;each_with_object&lt;/code&gt;&lt;/strong&gt; to efficiently traverse and transform the data while maintaining clean, maintainable code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❤️&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;&lt;strong&gt;Note:&lt;/strong&gt; I got help by AI for improving English of that post and examples.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>programming</category>
    </item>
    <item>
      <title>Intern Programs in 2024</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Thu, 04 Apr 2024 11:09:00 +0000</pubDate>
      <link>https://dev.to/eayurt/intern-programs-in-2024-1fdf</link>
      <guid>https://dev.to/eayurt/intern-programs-in-2024-1fdf</guid>
      <description>&lt;p&gt;With summer coming, many new developers are looking for internships to start their tech career. We can create a detailed list of top internship programs to help them. These programs are great for beginners, providing tools and experiences to start their careers. The list will be available here for anyone interested. Let's support the new generation of developers! 🚀&lt;/p&gt;

&lt;p&gt;You can add any intern programs you know of in the comments. 🥰&lt;/p&gt;

&lt;p&gt;&lt;em&gt;cover image: Photo by &lt;a href="https://unsplash.com/@paramir?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash"&gt;Ehud Neuhaus&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/green-grass-field-near-gray-concrete-road-TmJl4_5cSGs?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>internship</category>
      <category>career</category>
    </item>
    <item>
      <title>Exploring the Latest Ruby News: March 2024 Roundup</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Fri, 29 Mar 2024 11:51:48 +0000</pubDate>
      <link>https://dev.to/eayurt/exploring-the-latest-ruby-news-march-2024-roundup-1lf5</link>
      <guid>https://dev.to/eayurt/exploring-the-latest-ruby-news-march-2024-roundup-1lf5</guid>
      <description>&lt;p&gt;Hey Ruby enthusiasts! It's that time again where we dive into the latest happenings in Ruby community. From exciting new releases to insightful articles and events, there's plenty to catch up on. So, grab your favorite beverage and let's explore what's been going on in March 2024.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conference Updates
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://2024.euruko.org/"&gt;EuroKo 2024&lt;/a&gt;&lt;/strong&gt;: EuroKo is back with its 2024 edition! Dive into the world of Ruby with this year's conference featuring talks, workshops, and networking opportunities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RailsConf 2024: If you missed RailsConf, fret not! Follow the highlights and updates on &lt;strong&gt;&lt;a href="https://twitter.com/rails/status/1763270733789028453"&gt;Twitter&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frameworks and Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://hanamirb.org/blog/2024/02/27/hanami-210/"&gt;Hanami 2.1.0 Release&lt;/a&gt;&lt;/strong&gt;: Hanami, the alternative web framework, unveils its new version packed with enhancements and improvements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.bigbinary.com/blog/migrating-to-solid-queue-from-sidekiq"&gt;Solid Queue&lt;/a&gt;&lt;/strong&gt;: Explore how to migrate to Solid Queue from Sidekiq with this insightful blog post.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/makandra/active_type"&gt;ActiveType&lt;/a&gt;&lt;/strong&gt;: Discover ActiveType, a library for creating form and view models in Rails applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/rubycdp/ferrum"&gt;Ferrum&lt;/a&gt;&lt;/strong&gt;: Check out Ferrum, a high-level browser automation library for Ruby.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Articles and Tutorials
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/kopylov_vlad/why-i-love-ruby-44g9"&gt;Why I Love Ruby&lt;/a&gt;&lt;/strong&gt;: Vlad shares his love for Ruby and what makes it a favorite among developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.writesoftwarewell.com/what-does-frozen-string-literal-do-in-ruby/"&gt;Frozen String Literal&lt;/a&gt;&lt;/strong&gt;: Understand the significance of frozen string literals in Ruby and how they impact performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://world.hey.com/dhh/vscode-wsl-makes-windows-awesome-for-web-development-9bc4d528"&gt;VSCode + WSL&lt;/a&gt;&lt;/strong&gt;: Learn how VSCode with WSL is transforming Windows into a powerful platform for web development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://allaboutcoding.ghinda.com/micro-benchmarking-value-objects-in-ruby-datadefine-vs-struct-vs-openstruct"&gt;Micro-benchmarking Value Objects in Ruby&lt;/a&gt;&lt;/strong&gt;: Dive into the world of micro-benchmarking and explore the performance of value objects in Ruby.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.37signals.com/thruster-released/"&gt;Thruster Released&lt;/a&gt;&lt;/strong&gt;: Get insights into Thruster, a new tool released by 37Signals for enhancing web performance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Events and Community
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://kommunity.com/ruby-turkiye/events/aksam-oturmasi-202403-04624a0d"&gt;Ruby Türkiye Meetup 2024#03&lt;/a&gt;&lt;/strong&gt;: Join Ruby meetups and connect with fellow enthusiasts to discuss all things Ruby. It's in Turkish.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://evilmartians.com/chronicles/why-should-developers-write-3-reasons-and-3-common-blocks"&gt;Why Should Developers Write?&lt;/a&gt;&lt;/strong&gt;: Explore the importance of writing for developers and how it can benefit your career.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.friendly.show/2278525/14689994-why-detroit-meet-ufuk-the-secret-organizer-behind-rails-conf-2024"&gt;RailsConf Behind the Scenes&lt;/a&gt;&lt;/strong&gt;: Meet Ufuk, the secret organizer behind RailsConf 2024, and get a glimpse behind the scenes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Miscellaneous
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/rails/rails-new"&gt;New Rails Template&lt;/a&gt;&lt;/strong&gt;: Check out the latest Rails new template for starting new projects with ease.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.saeloun.com/2024/03/18/rails-8-adds-allow-browser-to-set-minimum-versions/"&gt;Allow Browser to Set Minimum Versions&lt;/a&gt;&lt;/strong&gt;: Learn about the new feature in Rails 8 that allows browsers to set minimum versions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://allaboutcoding.ghinda.com/history-of-the-endless-method-syntax"&gt;History of the Endless Method Syntax&lt;/a&gt;&lt;/strong&gt;: Delve into the history behind Ruby's endless method syntax and its evolution over time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://dd2f5325a2e4437c8198e5431d1df965.sessionize.com/schedule?ref=rubycentral.org"&gt;Schedule for RailsConf 2024&lt;/a&gt;&lt;/strong&gt;: Check out the schedule for RubyCentral events and plan your participation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a wrap for March 2024 in the Ruby and Rails world. Stay tuned for more exciting updates, releases, and events in the coming months. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>news</category>
      <category>march</category>
    </item>
    <item>
      <title>What's your the weirdest Ruby Gem you have worked with?</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Wed, 24 Mar 2021 09:42:10 +0000</pubDate>
      <link>https://dev.to/eayurt/what-s-your-the-weirdest-ruby-gem-you-have-worked-with-nhi</link>
      <guid>https://dev.to/eayurt/what-s-your-the-weirdest-ruby-gem-you-have-worked-with-nhi</guid>
      <description>&lt;p&gt;Hello,&lt;/p&gt;

&lt;p&gt;Ruby gems are cool and powerful but some of them could be weird. What's yours?&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rubygems</category>
      <category>question</category>
      <category>fun</category>
    </item>
    <item>
      <title>Why do you follow a person on Github?</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Fri, 02 Nov 2018 08:32:05 +0000</pubDate>
      <link>https://dev.to/eayurt/why-do-you-follow-a-person-on-github-205j</link>
      <guid>https://dev.to/eayurt/why-do-you-follow-a-person-on-github-205j</guid>
      <description>&lt;p&gt;I follow 137 people on Github. I follow some of them because of just my friend. They can be a really good developer but some followings don't push any code to Github for a while. I just worry why we follow a person on Github? What are your reasons? Why should we follow a person who hasn't any activities on Github?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;being your friend&lt;/li&gt;
&lt;li&gt;being your colleague&lt;/li&gt;
&lt;li&gt;being a really good developer&lt;/li&gt;
&lt;li&gt;being a good open source develop&lt;/li&gt;
&lt;li&gt;being a famous guy like a big tech company CTO or etc&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The other point, I can ask, why do you push the unfollow button? That can be the second question. Actually, two questions are related to each other.&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;

</description>
      <category>github</category>
      <category>question</category>
    </item>
    <item>
      <title>What are your criteria for staring a Github repo?</title>
      <dc:creator>Ender Ahmet Yurt</dc:creator>
      <pubDate>Thu, 18 Oct 2018 09:21:29 +0000</pubDate>
      <link>https://dev.to/eayurt/what-are-your-criteria-for-staring-a-github-repo-3549</link>
      <guid>https://dev.to/eayurt/what-are-your-criteria-for-staring-a-github-repo-3549</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I just wonder how you can you decide to star a Github repo. Nowadays, we star the repos that show up on our Github dashboard.&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;

</description>
      <category>github</category>
      <category>question</category>
    </item>
  </channel>
</rss>
