<?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: Mustafa ERBAY</title>
    <description>The latest articles on DEV Community by Mustafa ERBAY (@merbayerp).</description>
    <link>https://dev.to/merbayerp</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3921203%2Fe3a198a1-49a0-466f-99e6-74bdf202a867.png</url>
      <title>DEV Community: Mustafa ERBAY</title>
      <link>https://dev.to/merbayerp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/merbayerp"/>
    <language>en</language>
    <item>
      <title>What Does It Mean To Be 'Senior' In The Age of AI?</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Thu, 18 Jun 2026 16:30:43 +0000</pubDate>
      <link>https://dev.to/merbayerp/what-does-it-mean-to-be-senior-in-the-age-of-ai-4117</link>
      <guid>https://dev.to/merbayerp/what-does-it-mean-to-be-senior-in-the-age-of-ai-4117</guid>
      <description>&lt;p&gt;I've been in this industry for twenty years, and often questioned what the "senior" title truly meant. But with AI entering our lives so rapidly, I see this definition becoming more fragile, even misunderstood, than ever before. This role, once defined by deep technical knowledge, the ability to solve complex problems, and end-to-end system mastery, has now, for some, transformed into merely being able to write the right &lt;code&gt;prompt&lt;/code&gt;s?&lt;/p&gt;

&lt;p&gt;In my opinion, the automation and speed brought by AI further clarify the essence of the 'senior' role: experience, workflow knowledge, and the ability to manage trade-offs. Pure technical knowledge is still important, but it's no longer sufficient on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Did 'Senior' Mean Before AI?
&lt;/h2&gt;

&lt;p&gt;Years ago, even before AI became so widespread, being 'senior' for me meant being able to find the deepest bug in a system, to catch correlations no one else saw. I remember spending hours debugging a &lt;code&gt;network loop&lt;/code&gt; that crashed the entire company network, or finding the correct &lt;code&gt;vacuum&lt;/code&gt; settings when performance plummeted due to a &lt;code&gt;PostgreSQL WAL bloat&lt;/code&gt; issue.&lt;/p&gt;

&lt;p&gt;This wasn't just about knowing commands or using a library; it was about understanding all layers of the system, knowing how every piece interacted, from hardware to software, network to database. Being able to read &lt;code&gt;journald&lt;/code&gt; logs to figure out why a &lt;code&gt;systemd unit&lt;/code&gt; was &lt;code&gt;OOM-killed&lt;/code&gt; and correctly setting &lt;code&gt;cgroup memory.high&lt;/code&gt; limits was a true expertise.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Arrived, So What Changed?
&lt;/h2&gt;

&lt;p&gt;With the advent of AI, many routine and repetitive tasks have been automated. Now, instead of writing a complex &lt;code&gt;regex&lt;/code&gt; pattern, I can describe the log pattern I want to AI and get the output in seconds. In one of my side projects, log analysis and debugging processes that used to take me hours are now summarized in minutes with a single prompt.&lt;/p&gt;

&lt;p&gt;This situation expects us to focus more on the "why" and "what" questions, rather than just answering "how." Critically evaluating the solution offered by AI, providing the correct context, and comparing the results with business realities has become the cornerstone of the new senior role. In software development, writing &lt;code&gt;boilerplate&lt;/code&gt; code or creating simple test scenarios are now tasks taken over by AI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ The Changing Role&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI takes on many repetitive and rule-based technical tasks, offering us the opportunity to think more strategically, define problems, and understand complex inter-system relationships.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Is True Seniority Just 'Prompt Engineering'?
&lt;/h2&gt;

&lt;p&gt;With the recent rise of &lt;code&gt;prompt engineering&lt;/code&gt;, some have started to see this skill as the new "seniority" criterion. Yes, writing the right &lt;code&gt;prompt&lt;/code&gt; is critical for getting efficient results from AI. But this is just the tip of the iceberg.&lt;/p&gt;

&lt;p&gt;When using AI for production planning in a manufacturing ERP, understanding the factory's real constraints, instant fluctuations in the supply chain, and operator feedback was much more critical than simply designing the &lt;code&gt;prompt&lt;/code&gt; correctly, rather than blindly applying the model's output. AI can offer you the most optimized route suggestions; however, it cannot know if that route is truly feasible, if a machine on the production floor is currently broken, or if an operator is on leave during that shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data, Workflow, and People: Where Does a Senior's Real Power Lie in the Age of AI?
&lt;/h2&gt;

&lt;p&gt;In my opinion, true seniority in the age of AI still lies in knowing the cost of saying "yes" or "no," in contextualizing the solution produced by AI within the business, and in foreseeing potential side effects. Knowing why we implement a &lt;code&gt;transaction outbox&lt;/code&gt; pattern, what kind of risks &lt;code&gt;eventual consistency&lt;/code&gt; poses in a workflow, or in which scenarios &lt;code&gt;optimistic lock&lt;/code&gt; works better than &lt;code&gt;pessimistic lock&lt;/code&gt; is not information AI will automatically give you.&lt;/p&gt;

&lt;p&gt;One of the most important things I've learned in my 20 years of experience is that software architecture is often not just about code; the real architecture lies in organizational workflows. AI can speed up these workflows, even optimize them, but the correct design of these workflows, meeting the real needs of the business, and being adoptable by people, is still the responsibility of experienced professionals.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Not Just Technology&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;True seniority is not just knowing how to use the latest AI model, but also being able to foresee &lt;code&gt;idempotency&lt;/code&gt; issues, &lt;code&gt;data integrity&lt;/code&gt; risks, and &lt;code&gt;observability&lt;/code&gt; needs that may arise when integrating that model's output into an enterprise ERP system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Could Be a Senior's Most Expensive Mistake?
&lt;/h2&gt;

&lt;p&gt;My most expensive mistake in my career was never a &lt;code&gt;segmentation fault&lt;/code&gt; or an &lt;code&gt;SQL injection&lt;/code&gt;. It was usually a "yes" or "no" given without proper &lt;code&gt;trade-off&lt;/code&gt; analysis or without listening to all stakeholders. When I inadequately calculated the number of VLANs in a &lt;code&gt;network segmentation&lt;/code&gt; project, the subsequent management complexity and security risks were the result of a simple "yes, this will be enough" answer I gave initially.&lt;/p&gt;

&lt;p&gt;In the age of AI, this situation becomes even more critical. Blindly trusting the "perfect" solution suggestions offered by AI, ignoring real-world constraints, can be one of the biggest mistakes a senior can make. When setting up &lt;code&gt;predictive monitoring&lt;/code&gt; systems, interpreting the anomalies offered by AI, it is essential to consider the human factor, field experience, and business dynamics.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 The Value of Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI can analyze data and extract patterns, but interpreting the human behaviors, corporate policies, and historical "whys" behind these patterns is still the job of an experienced senior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In conclusion, being 'senior' in the age of AI means not only mastering technology but also being able to correctly blend that technology with business realities, the human factor, and corporate workflows. In my opinion, the true 'senior' title will belong to those who can intelligently use the opportunities offered by AI to produce context-driven, flexible, and sustainable solutions even for problems we haven't encountered before.&lt;/p&gt;

&lt;p&gt;So, in your opinion, what competencies have become indispensable to deserve the 'senior' title in the age of AI?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>indiehacker</category>
    </item>
    <item>
      <title>The Maintenance Burden of Homelab Expansion</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Thu, 18 Jun 2026 12:51:46 +0000</pubDate>
      <link>https://dev.to/merbayerp/the-maintenance-burden-of-homelab-expansion-440h</link>
      <guid>https://dev.to/merbayerp/the-maintenance-burden-of-homelab-expansion-440h</guid>
      <description>&lt;p&gt;Homelab expansion, like for most tech enthusiasts, was initially an exciting adventure for me. Experimenting with new technologies, tinkering with different system architectures, and implementing things at home that I couldn't "touch" in production environments provided an invaluable learning space. However, over time, this growing lab brought a much larger maintenance burden and personal time cost than I expected; this situation repeatedly reminded me of that fine line where a hobby turns into work.&lt;/p&gt;

&lt;p&gt;What started with just a few Raspberry Pis gradually evolved into racks full of servers, gigabit switches, and complex network topologies. Every new device or service added brought with it a new responsibility and a potential source of problems. In this post, I'll talk about the allure of the homelab, how it transformed into a maintenance burden over time, and the lessons I learned along the way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 A Tip from My Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before adding any new hardware or software, it's crucial to think twice about the &lt;em&gt;long-term&lt;/em&gt; maintenance burden and time cost it will bring. Short-term excitement can turn into long-term fatigue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Beginning of Homelab Growth: Why We Started and How We Got Carried Away
&lt;/h2&gt;

&lt;p&gt;My homelab journey began with a modest Linux server experiment in the early 2000s, but it gained real momentum in the last 10 years. I found the opportunity to try out many concepts here that I applied or wanted to apply in production environments but couldn't find the time for. My motivations included trying a new database, setting up a different container orchestration tool, or simply pushing a system's performance to its limits. For me, it was both a learning tool and a way to relieve stress.&lt;/p&gt;

&lt;p&gt;Initially, everything seemed simple and low-cost. I started with projects like running a few services with Docker Compose on a single mini PC or setting up a monitoring system with a Raspberry Pi. While saying "a bit more RAM," "a faster SSD," or "if only I had a 10Gbit switch," the hardware list grew, and the electricity bill slowly started to climb. During this process, I also moved the test environment of one of my side products (a financial calculator backend) to my homelab. While this initially provided a cost advantage, it increased the maintenance burden over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unexpected Costs: How the Money and Time Balance Changes
&lt;/h2&gt;

&lt;p&gt;The most insidious cost of homelab expansion wasn't just the money we spent on hardware, but also the time and electricity bill. What initially seemed like "a whim" can gradually become a significant budget item. I can say that the money I spent on servers, switches, and disks I accumulated over a few years approached the price of a good used car. But that wasn't the real problem.&lt;/p&gt;

&lt;p&gt;For example, the electricity consumption of a 24/7 server cluster makes a noticeable difference in the monthly bill. I went from a system that initially drew 50W to one that now draws 300-400W. This manifests not only in the electricity bill but also in the need for cooling and the room's temperature. However, beyond the money, the biggest price was time. I remember spending 4 hours on a Sunday morning fixing a critical service's downtime instead of having breakfast. This was just one of those moments when a hobby turned into work and personal life was neglected.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Hidden Cost: The Electricity Bill&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every new device in your homelab, especially if it runs 24/7, adds an extra burden to the electricity bill. While it may seem insignificant at first, these costs accumulate in the long run. The 3 servers and network devices I use consume an average of 350 kWh per month, which is a significant cost in Turkey.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Software and Configuration Chaos: Is Tech Debt at Home Too?
&lt;/h2&gt;

&lt;p&gt;The "tech debt" we complain about in corporate environments doesn't leave us alone in the homelab either. Different distributions (Ubuntu, Debian, Fedora), various services (PostgreSQL, Redis, Nginx), and dozens of containers talking to each other... Each has its own configuration files, update cycles, and dependencies. Initially, I set everything up manually, thinking "it's just a small lab." However, this approach turned into a nightmare as the system grew.&lt;/p&gt;

&lt;p&gt;At one point, when I performed a major PostgreSQL version upgrade, I encountered incompatibility with an old application's database schema. Some query planning behaviors of the new version had changed, and the application's ORM couldn't adapt to this situation. Debugging took me 8 hours, and during this process, I risked permanent data loss while dealing with the &lt;code&gt;pg_upgrade&lt;/code&gt; command. Situations like these showed how fragile manual configuration management can be. Now, I try to use simple Ansible playbooks for at least some critical services, but even this isn't a fully automated solution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- EXPLAIN ANALYZE output to understand why an old query plan slowed down in PostgreSQL&lt;/span&gt;
&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;ANALYZE&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;order_date&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'2026-01-01'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Network and Security Challenges: The "Mini-Corporate" Environment at Home
&lt;/h2&gt;

&lt;p&gt;As the homelab expands, the network structure inevitably becomes more complex. While initially managing with Wi-Fi from a single modem, I now use different VLANs, firewall rules, VPN tunnels, and multiple gigabit switches. This structure provides both a more secure and higher-performing environment, but it brings a significant management burden. IP conflicts, DNS resolution issues, and incorrect firewall rules are common problems I encounter.&lt;/p&gt;

&lt;p&gt;Once, to add a new IP camera system, I connected a PoE switch to the network. However, when I connected this switch to the wrong port, a loop occurred in the network, and the entire home network crashed. Since my DHCP server was also affected, no device could be assigned an IP. I had to check physical connections one by one to find and resolve the issue. These types of situations caused me to experience "switch loop" or "broadcast storm" scenarios at home that we encounter in corporate networks. While network segmentation (via VLANs) is a good security practice, assigning each new device to the correct VLAN and ensuring communication between them with proper firewall rules requires constant attention.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ Network Security and Segmentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your homelab has devices with different security levels (IoT devices, servers, personal computers), using VLAN segmentation is a good approach. However, this also requires enabling switch hardening features like DHCP snooping and DAI (Dynamic ARP Inspection), otherwise security vulnerabilities can arise.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Monitoring and Alerts: How Much Production Environment Discipline is Needed at Home?
&lt;/h2&gt;

&lt;p&gt;In my professional life, I always emphasize the importance of observability (metrics, logs, traces). However, bringing this discipline to the homelab can sometimes spoil the fun of the hobby. While initially just checking CPU usage with &lt;code&gt;htop&lt;/code&gt;, over time I installed tools like Prometheus, Grafana, and Alertmanager. These systems allow me to monitor server resource usage, service status, and network traffic in detail.&lt;/p&gt;

&lt;p&gt;But this situation also brought the problem of "alert noise." An alarm at 3 AM indicating a container exceeded its &lt;code&gt;memory.high&lt;/code&gt; limit and was &lt;code&gt;OOM-killed&lt;/code&gt; showed that I was no longer just dealing with a hobby project. While dealing with complex solutions like sending Journald logs to Elasticsearch and analyzing them in Kibana, I remembered that all I really wanted was for my home Plex server not to stutter. This is a burden brought by bringing "production environment discipline" home. Fine-tuning each alert rule, eliminating false positives, and distinguishing truly important ones takes a significant amount of my time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example systemd log output showing a container exceeding its memory limit&lt;/span&gt;
&lt;span class="c"&gt;# journalctl -u docker.service -f&lt;/span&gt;
...
Jun 18 03:14:22 homelab-server kernel: cgroup: &lt;span class="s2"&gt;"memory"&lt;/span&gt; controller: memory.high limit of 500M reached &lt;span class="k"&gt;for &lt;/span&gt;container_name.service, currently 512M
Jun 18 03:14:22 homelab-server kernel: Memory cgroup out of memory: Killed process 1234 &lt;span class="o"&gt;(&lt;/span&gt;container_name.service&lt;span class="o"&gt;)&lt;/span&gt; total-vm:1024MB, anon-rss:512MB, file-rss:0MB, shmem-rss:0MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I see an output like this, I immediately need to review my &lt;code&gt;cgroup memory.high&lt;/code&gt; settings and analyze whether the application truly needs that much memory. Sometimes even a simple Redis OOM eviction policy setting can trigger a debug process that takes hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Personal Life and Homelab Balance: Where to Draw the Line?
&lt;/h2&gt;

&lt;p&gt;I think the biggest lesson learned from homelab expansion was recognizing when a hobby turns into work and being able to strike a balance. The initial motivation for learning and exploration gradually turned into a "to-do" list. Thoughts like "I need to do that update," "I need to optimize that service," "I need to set up a new storage solution before disk space runs out" constantly occupied my mind. This started to steal time I should have spent with my wife and family.&lt;/p&gt;

&lt;p&gt;One Saturday afternoon, I found myself debugging a performance regression in the backend of one of my side products instead of being at the park with my children. A wrong choice in Postgres's index strategies (a table where B-tree was more suitable than BRIN) had caused queries to suddenly slow down. This showed that hours spent in front of the screen, saying "just one more minute," were actually taking away things much more valuable from me. Setting conscious boundaries and being able to say "no, I'm just going to rest this weekend" has been the hardest but most important part of this process. My experience has shown that such decisions directly affect my overall quality of life.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Homelab is a Journey, Not a Race
&lt;/h2&gt;

&lt;p&gt;Homelab expansion is a wonderful journey that fuels my passion for technology and constantly pushes me to learn new things. However, on this journey, "more" doesn't always mean "better." The performance and features I try to achieve often don't justify the maintenance burden and personal time cost they bring. Finding this balance requires continuous effort and awareness.&lt;/p&gt;

&lt;p&gt;My current clear position is to severely limit new hardware purchases and new service installations. I'm trying to consolidate existing systems, increase the level of automation (more Ansible!), and most importantly, prevent the homelab from becoming a "job" instead of a "hobby" again. Because sometimes the best optimization is not to set up the system at all. In the next post, I will discuss some strategies and tools I used during this consolidation process.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>uretkenlik</category>
    </item>
    <item>
      <title>Things I Wish Someone Had Told Me When I Was a Junior</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Thu, 18 Jun 2026 09:47:23 +0000</pubDate>
      <link>https://dev.to/merbayerp/things-i-wish-someone-had-told-me-when-i-was-a-junior-col</link>
      <guid>https://dev.to/merbayerp/things-i-wish-someone-had-told-me-when-i-was-a-junior-col</guid>
      <description>&lt;p&gt;The most expensive mistakes of my career weren't a line of code or a system architecture choice. Often, I paid the biggest prices in moments when I said "yes" while my gut was screaming "no." This situation had serious impacts not only on my workload but also on my learning curve, personal development, and even mental health.&lt;/p&gt;

&lt;p&gt;Looking back today, there's a lot I'd like to tell young Mustafa. These aren't the details of a programming language or the intricacies of a network protocol; rather, they are lessons shaped by field experience, reflecting on "how to work" and "how to be an engineer."&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Power and Cost of Saying "No"?
&lt;/h2&gt;

&lt;p&gt;As a junior, I was prone to accepting every task, every project, every request that came my way. This stemmed both from a "I can do it" motivation and a desire to prove myself. However, over time I realized that saying "yes" is easy; the real challenge, and what truly propels you forward, is learning to say "no."&lt;/p&gt;

&lt;p&gt;Once, at the beginning of an ERP project that was already 5 years old, I was asked to simultaneously develop a new module and solve a performance issue with an existing integration. They said both were urgent. I said, "I'll do it." The result was both tasks being left unfinished, and both I and the team experiencing significant stress. At that moment, I clearly understood that my resources were limited and I needed to prioritize.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ The Illusion of Unlimited Resources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Especially at the beginning of our careers, we tend to think our time and energy are limitless. However, every "yes" we say means saying "no" to something else. Acting with this awareness not only improves work quality but also prevents burnout.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Is Technical Debt Not Just About Code, But Also My Career?
&lt;/h2&gt;

&lt;p&gt;We always hear the concept of technical debt in the context of codebases and architecture. It's defined as the future costs incurred by producing quick solutions. But in my experience, this concept also has an equivalent in our careers. Topics we postpone learning, deficiencies we don't address, moments we don't step out of our comfort zone – all accumulate as "career debt."&lt;/p&gt;

&lt;p&gt;While working on a production ERP, designing an AI-powered production planning module, I found myself deep in PostgreSQL. GIN indexes, WAL segments, Vacuum parameters... these were topics I had previously thought "the DBA will handle it anyway." Yet, as the architect of the application, I couldn't make correct decisions without knowing these details. To pay off this debt, I spent weeks reading documentation and running tests. If I had done this earlier, the project would have progressed faster, and I wouldn't have experienced that stress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Are Human Relations and Organizational Flow So Important?
&lt;/h2&gt;

&lt;p&gt;I spent years pondering software architecture. Monolith or Microservice? Event-Sourcing or CQRS? However, over time I realized that the success of a software project often depends more on organizational flow and human relations than on technical architecture. The code we write reflects how people work and how they communicate with each other.&lt;/p&gt;

&lt;p&gt;While developing an internal platform for a bank, the biggest challenge wasn't technical, but the silo structure between different departments. Each team defended its own truth, and we struggled to establish a common language. Even the best-designed system remains on paper if there isn't proper communication flow between users and teams. That's why engineering isn't just about writing code, but also about understanding people and uniting them around a common vision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Continuous Learning, What Does It Mean to Learn to Unlearn?
&lt;/h2&gt;

&lt;p&gt;In the tech world, "continuous learning" is already a cliché. However, I believe that "learning to unlearn" is at least as valuable, if not more so. What we know can sometimes prevent us from seeing new solutions. Old habits can hinder us from perceiving new paradigms.&lt;/p&gt;

&lt;p&gt;Last month, I was trying to solve a performance issue in the backend of the financial calculators, which are part of my side product. With years of habit, I immediately dove into PostgreSQL queries and indexes. Hours later, I realized the problem was caused by a simple Redis OOM eviction policy setting. My old knowledge had led me down circuitous paths instead of directly to the problem. Sometimes, you need to set aside old "truths" and look at the problem with a completely fresh perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Is Investing in Yourself Not Just About Getting Certificates?
&lt;/h2&gt;

&lt;p&gt;As a junior, I mostly saw investing in myself as learning a new language, getting a certificate, or mastering a popular framework. These are important, yes. But the real investment is in problem-solving ability, critical thinking, and adaptability. And of course, the investment I made in financial literacy and time management to better manage both my career and personal finances.&lt;/p&gt;

&lt;p&gt;While working on projects like the anonymous Turkey data platform I added to my own site, I saw not only the technical challenges but also my shortcomings in data analysis and presentation. This pushed me not only technically but also to gain knowledge in a new field. Investing in yourself means not just "writing better code," but "being a better problem solver."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ Engineering Is Multidimensional&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Being a good engineer isn't just about writing code or building systems. It's also about understanding business processes, communicating effectively with people, managing your time and resources, and continuously updating yourself while being able to break old patterns.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, if you were at the beginning of your career, what advice would you give yourself? What was your most expensive "yes" or your most valuable "no"? I'd love to hear it in the comments.&lt;/p&gt;

</description>
      <category>software</category>
      <category>career</category>
      <category>indiehacker</category>
    </item>
    <item>
      <title>My Account Was Hacked! 5 Things to Do in the Right Order in the First</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Thu, 18 Jun 2026 07:41:12 +0000</pubDate>
      <link>https://dev.to/merbayerp/my-account-was-hacked-5-things-to-do-in-the-right-order-in-the-first-42ab</link>
      <guid>https://dev.to/merbayerp/my-account-was-hacked-5-things-to-do-in-the-right-order-in-the-first-42ab</guid>
      <description>&lt;p&gt;This post is designed to help you manage the panic and confusion you might experience the moment you realize one of your accounts has been compromised, and to minimize damage by taking the right steps. It focuses on the critical first 60 minutes, emphasizing rapid action rather than technical details.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Immediate Password Change and Checking Linked Applications
&lt;/h2&gt;

&lt;p&gt;The moment you realize one of your accounts has been hacked, the first and most critical step is to change your password. This is the fastest way to block the attacker's access to the account. However, there are some nuances to consider during this process. Just changing the main password might not be enough; it's important to review other applications and services linked to your account. Especially checking those with access to sensitive data, such as financial apps, email accounts, or cloud storage services, is vital.&lt;/p&gt;

&lt;p&gt;This initial intervention is a kind of "first aid" to get the situation under control. A few months ago, a friend's email account was hacked. The first thing they did was change their password. However, they didn't notice a subscription service linked to the account that had automatic payments. The attacker used this service to make various payments from my friend's account for several weeks. To prevent such situations, immediately after changing your password, you should go into your account's security settings and check sections like "connected apps" or "authorized devices." Typically, these sections may list devices added without your approval or devices you don't recognize. Removing them immediately will prevent potential additional damage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ Security Tips&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use strong and unique passwords to increase your account's security. Password managers can help you with this. Be sure to activate two-factor authentication (2FA). This prevents your stolen password from being sufficient on its own.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Collecting Logs to Prove Account Compromise
&lt;/h2&gt;

&lt;p&gt;The moment you realize your account is not secure, collecting evidence before the attacker deletes their traces will greatly benefit you in future grievances or recovery processes. This evidence can be used to prove that the account was indeed compromised and, if necessary, to apply to legal authorities. This can be thought of as a "digital forensics" process. Information such as activity logs, login history, and transactions provided by the system or platform fall into this category.&lt;/p&gt;

&lt;p&gt;For example, when you realize your social media account has been hacked, you can look at the account's login history to see login attempts or successful logins that you didn't make. These records can provide important clues about when the attack started. A few weeks ago, I realized my account on a Turkish e-commerce site had been hacked. In a panic, I first changed the password. But then I looked at the "order history" section of the account and saw that products I hadn't ordered had been placed and sent to a different address. I saved this information and the system's "transaction logs" (if available) by taking screenshots. These records later served as evidence when I contacted my bank and filed a complaint with the platform.&lt;/p&gt;

&lt;p&gt;The most important point to note in this process is to protect the "integrity of the evidence" you collect. That is, you must preserve these records as they are, without tampering with them. Taking screenshots and saving logs as a text file helps ensure this integrity. If possible, use the official reporting tools provided by the platform. Such logs are usually found under headings like account activity history, session information, or security alerts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example of reviewing logs on a Linux server&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"failed password"&lt;/span&gt; /var/log/auth.log
&lt;span class="c"&gt;# or&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; sshd | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"session opened for user"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands can help detect unauthorized login attempts or successful logins to the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Setting Up Two-Factor Authentication (2FA) and Security Questions
&lt;/h2&gt;

&lt;p&gt;After an account is hacked, one of the most effective measures is to activate two-factor authentication (2FA). This means that the attacker cannot access the account by merely knowing your password. The second factor is usually an SMS code sent to your phone, a temporary code generated by an authentication app (Google Authenticator, Authy, etc.), or a physical security key. This layered security makes your accounts much safer.&lt;/p&gt;

&lt;p&gt;Some time ago, I realized the password for an account I used on a forum site had been compromised. I immediately changed my password, but then I activated the 2FA feature offered by the platform. A few days later, I saw another login attempt with the same password. However, because 2FA was active, this login attempt failed, and I received a notification. This example clearly shows how deterrent and protective 2FA is. If your account has a 2FA option, you should activate it at the first opportunity.&lt;/p&gt;

&lt;p&gt;Similarly, you should review your account recovery options. Most platforms ask security questions to verify your identity when you forget your password or your account is locked. The answers to these questions should be difficult to guess and meaningful to you. However, these answers can also be compromised by an attacker. Therefore, when answering security questions, it might be smart to choose answers that are different from your real answers but that you can remember. For example, instead of giving your real pet's name for the question "What was the name of your first pet?", you could combine it with a passphrase you can remember, like "My_first_dog_Max".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Things to Consider for Security Questions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do not choose answers for security questions that can be easily found on social media. For example, your child's date of birth or your pet's name, if shared on social media, can be easily guessed by attackers. Instead of such information, use random words or phrases that you determine and can remember.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Notifying Relevant Platforms and Institutions
&lt;/h2&gt;

&lt;p&gt;In the first hour after your account is hacked, you should not only defend yourself but also notify the relevant platforms and other institutions that might be potentially affected. These notifications can both speed up the account recovery process and prevent others from experiencing similar victimizations. Especially if you think your financial information has been stolen, contacting your bank or credit card provider is of great importance.&lt;/p&gt;

&lt;p&gt;Once, a friend's identity information was stolen, and a fake bank account was opened in their name using this information. When my friend realized the situation, the first thing they did was contact their bank. The bank immediately investigated the situation and stopped all transactions made from the fake account. Thanks to this quick notification, my friend was saved from significant financial damage. You should also notify the relevant parties according to the type of your hacked account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Social Media/Email:&lt;/strong&gt; Contact the platform's own support or security team. Account recovery procedures are usually handled through these units.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Financial Accounts (Bank, Credit Card, Payment Systems):&lt;/strong&gt; Immediately contact the fraud department of the relevant financial institution. Request that your cards be blocked or suspicious transactions be canceled.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;E-commerce Sites:&lt;/strong&gt; If the hacked account belongs to an e-commerce site and orders have been placed in your name, contact the site management to report the situation and ask them to cancel suspicious transactions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Personal Data Breach:&lt;/strong&gt; If you believe your personal data (identity information, address, etc.) has been stolen, you may consider applying to the relevant data protection authority or the police in your country. In Turkey, the Personal Data Protection Authority (KVKK) is authorized in this regard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During these notifications, having the evidence you collected (logs, screenshots, etc.) with you will help you prove the seriousness and accuracy of the situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Informing Your Close Circle and Family
&lt;/h2&gt;

&lt;p&gt;A compromised account can put not only your digital identity at risk but also people in your social circle. Attackers can use compromised accounts to send fake messages in your name, attempt fraud, or spread your sensitive information. Therefore, the moment you realize the situation, it is of great importance to inform your close circle and especially family members who may be less knowledgeable about digital security.&lt;/p&gt;

&lt;p&gt;A few years ago, an acquaintance's WhatsApp account was hacked. The attacker used this account to contact me and our other mutual friends, asking us to send urgent money. Fortunately, thanks to me and a few others approaching such requests from the hacked account with suspicion and immediately reaching out to the actual person to confirm the situation, the fraud attempt failed. However, this situation shows how dangerous hacked accounts can be and how they can affect our close circle.&lt;/p&gt;

&lt;p&gt;Therefore, when you realize your account has been hacked, here's what you should do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Inform Your Family Members:&lt;/strong&gt; Especially tell your elderly relatives not to trust suspicious messages coming in your name. Ask them to call you by phone for matters like money transfer requests or sharing personal information.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Warn Your Close Friends:&lt;/strong&gt; Inform them not to click on suspicious links or share sensitive information that might be sent in your name on social media or other platforms.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Immediately Report Suspicious Communications:&lt;/strong&gt; If you see a suspicious message sent from your account in your name, immediately reach out to the relevant people and inform them that it was not sent by you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This simple but effective step can prevent attackers from defrauding others using your identity and can protect both you and those around you from harm. Ensuring security in the digital world is possible not only by protecting our own accounts but also by raising awareness among those around us.&lt;/p&gt;




&lt;p&gt;Knowing your account has been hacked can be a stressful situation. However, taking the right, sequential steps within these first 60 minutes will help you take control of the situation and minimize potential damage. Strong passwords, two-factor authentication, and vigilance against suspicious activities are the cornerstones of staying safe in the digital world. Remember, acting quickly and consciously instead of panicking is the best defense.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>uretkenlik</category>
    </item>
    <item>
      <title>The Heaviest AI Users Atrophy the Fastest: The Skill Atrophy Trap</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Thu, 18 Jun 2026 04:07:05 +0000</pubDate>
      <link>https://dev.to/merbayerp/the-heaviest-ai-users-atrophy-the-fastest-the-skill-atrophy-trap-khp</link>
      <guid>https://dev.to/merbayerp/the-heaviest-ai-users-atrophy-the-fastest-the-skill-atrophy-trap-khp</guid>
      <description>&lt;p&gt;In recent years, AI tools have rapidly entered our lives and fundamentally changed the way we work. They have provided incredible efficiency gains, especially in areas like software development, system administration, and even architectural design. However, from my 20 years of experience, I've observed something: excessive reliance on these tools leads to a serious dulling of our professional skills in the long run, what I call "skill atrophy."&lt;/p&gt;

&lt;p&gt;It has become a clear observation for me that those who use AI the most atrophy the fastest, because AI usually provides the final solution, hindering our ability to understand underlying mechanisms and troubleshoot problems. We used to spend hours wrestling with issues in &lt;code&gt;man&lt;/code&gt; pages or &lt;code&gt;strace&lt;/code&gt; outputs, but now we can get an "answer" in seconds. But this "answer" doesn't always lead us to the right place, and most importantly, it doesn't make us a better engineer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Skill Atrophy and Why is it Dangerous?
&lt;/h2&gt;

&lt;p&gt;Skill atrophy is the weakening or complete loss of an ability over time when it is not used or is excessively automated. AI tools accelerate this process, especially by simplifying repetitive or complex tasks like writing code, creating configurations, or debugging. While this initially seems like a great efficiency boost, it causes our fundamental problem-solving muscles to weaken.&lt;/p&gt;

&lt;p&gt;This situation becomes apparent, especially when a critical production system crashes and AI's "standard solutions" don't work. At that moment, we need those atrophied fundamental skills to understand why AI's answer didn't work, to get to the root cause of the problem, and to produce a situation-specific solution. For example, a junior developer using an AI-generated &lt;code&gt;Nginx&lt;/code&gt; &lt;code&gt;rewrite&lt;/code&gt; rule as-is leads to them copying and pasting without understanding a complex &lt;code&gt;regex&lt;/code&gt; or the processing order of &lt;code&gt;location&lt;/code&gt; blocks. When the rule doesn't work as expected, instead of manually examining &lt;code&gt;nginx -t&lt;/code&gt; or &lt;code&gt;access.log&lt;/code&gt;s, they ask AI "why isn't it working" again and try another solution. This prevents a deeper understanding of fundamental network or HTTP protocol knowledge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ The Trap of False Confidence&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The fact that AI-generated solutions often appear "correct" can prevent us from performing genuine verification. This can lead to serious consequences, especially in critical areas like security and performance. Accepting AI's answers without questioning them is an invitation to technical blindness.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How is Fundamental Troubleshooting Ability Eroding?
&lt;/h2&gt;

&lt;p&gt;In fields like system administration and network engineering, troubleshooting ability is one of the most critical skills. Why isn't a service running? Why is memory leaking? Why isn't a packet reaching its destination? The answers to these questions usually require in-depth analysis and manual inspection. AI can offer us starting points in this process, but it often provides a "black box" solution.&lt;/p&gt;

&lt;p&gt;Let me give an example: Last month, a &lt;code&gt;PostgreSQL 15&lt;/code&gt; server's &lt;code&gt;systemd&lt;/code&gt; service kept getting &lt;code&gt;OOM-killed&lt;/code&gt;. When I asked AI, I usually got general advice like "increase memory settings" or "free up disk space." However, when I looked at the &lt;code&gt;journalctl -xe&lt;/code&gt; output, I saw that the problem was actually a &lt;code&gt;memory.high&lt;/code&gt; soft limit applied by &lt;code&gt;cgroup&lt;/code&gt;. The service was being killed by the &lt;code&gt;kernel&lt;/code&gt; when it exceeded the defined limit. AI didn't directly point to this specific &lt;code&gt;cgroup&lt;/code&gt; limit because its output was a general &lt;code&gt;OOM&lt;/code&gt; message. If I hadn't been proficient with &lt;code&gt;journalctl&lt;/code&gt;, or if I hadn't known the difference between &lt;code&gt;cgroup&lt;/code&gt;'s &lt;code&gt;memory.high&lt;/code&gt; and &lt;code&gt;memory.max&lt;/code&gt;, I could have spent days tinkering with general memory settings. Such situations demonstrate how important fundamental Linux service management and kernel-level debugging skills are.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One of the first answers AI would give:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart postgresql
&lt;span class="c"&gt;# Result: Still OOM-killed.&lt;/span&gt;

&lt;span class="c"&gt;# Manual debug step:&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; postgresql &lt;span class="nt"&gt;-xe&lt;/span&gt;

&lt;span class="c"&gt;# A line that might be seen in the output:&lt;/span&gt;
&lt;span class="c"&gt;# kernel: cgroup: 'memory.high' limit reached for /system.slice/postgresql.service&lt;/span&gt;
&lt;span class="c"&gt;# This is a root cause specific enough that AI might not directly provide it.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How are Software Architecture and Optimization Decisions Corrupted by AI?
&lt;/h2&gt;

&lt;p&gt;Software architecture is not just about writing code, but also about making strategic decisions about the system as a whole. &lt;code&gt;Monolith&lt;/code&gt; or &lt;code&gt;microservice&lt;/code&gt;? &lt;code&gt;Event-sourcing&lt;/code&gt; or &lt;code&gt;CQRS&lt;/code&gt;? How is &lt;code&gt;idempotency&lt;/code&gt; ensured? These are decisions where AI might offer you the "most popular" or "simplest" solution, but it might not be suitable for the context of your project.&lt;/p&gt;

&lt;p&gt;While working on a production ERP, I sometimes received SQL optimization suggestions from AI for a slow-running report in &lt;code&gt;PostgreSQL&lt;/code&gt;. AI usually offered general recommendations like simplifying &lt;code&gt;JOIN&lt;/code&gt;s or adding &lt;code&gt;INDEX&lt;/code&gt;es. However, the real problem was the &lt;code&gt;ORM&lt;/code&gt; creating an &lt;code&gt;N+1&lt;/code&gt; query problem, meaning it was fetching child records separately for each parent record. Or worse, as seen in the &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; output, the &lt;code&gt;planner&lt;/code&gt; was making an incorrect &lt;code&gt;index&lt;/code&gt; selection. AI cannot easily detect this in-depth &lt;code&gt;query planner&lt;/code&gt; behavior or &lt;code&gt;ORM&lt;/code&gt;'s &lt;code&gt;eager-load&lt;/code&gt; explosions. This situation requires the developer to be proficient in &lt;code&gt;SQL&lt;/code&gt;, the internal workings of the &lt;code&gt;ORM&lt;/code&gt;, and &lt;code&gt;database optimization&lt;/code&gt; techniques. If the simple solutions offered by AI prevent us from acquiring this fundamental understanding, we invite bigger performance problems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ Context is King&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI feeds on general knowledge. It does not have in-depth information about your project's unique workload, data model, or legacy constraints. Therefore, you should always evaluate architectural recommendations from AI within your own context and examine them critically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Dark Side of Automation in Security
&lt;/h2&gt;

&lt;p&gt;System security, with its constantly changing threat landscape and complex structures, is one of the areas where AI can both help the most and create the most danger. AI can assist in creating security policies or recommending basic security controls, but understanding and manually countering a real attack is another level entirely.&lt;/p&gt;

&lt;p&gt;For example, you can get help from AI for &lt;code&gt;fail2ban&lt;/code&gt; configuration on a server. It will give you a basic &lt;code&gt;regex&lt;/code&gt; for &lt;code&gt;sshd&lt;/code&gt; or &lt;code&gt;nginx&lt;/code&gt;. But what if the attacker uses more sophisticated methods? In an attack targeting kernel module vulnerabilities like &lt;code&gt;CVE-2026-31431&lt;/code&gt;, deep measures are needed, such as blacklisting the &lt;code&gt;algif_aead&lt;/code&gt; module or monitoring specific system calls with &lt;code&gt;auditd&lt;/code&gt;. AI cannot generate these types of specific &lt;code&gt;kernel hardening&lt;/code&gt; or &lt;code&gt;audit subsystem&lt;/code&gt; rules without you telling it exactly what you are looking for. Last month, in a client project, a &lt;code&gt;FastAPI&lt;/code&gt; decorator I got from AI for SQL injection mitigation was not enough. The attacker tried to bypass &lt;code&gt;SQL injection&lt;/code&gt; by hiding it with URL encoding and using &lt;code&gt;subqueries&lt;/code&gt; instead of &lt;code&gt;UNION SELECT&lt;/code&gt;. AI's suggested simple &lt;code&gt;input validation&lt;/code&gt; was insufficient; in this case, it was necessary to manually implement &lt;code&gt;prepared statements&lt;/code&gt; and &lt;code&gt;least privilege&lt;/code&gt; principles, and define more aggressive rules at the &lt;code&gt;WAF&lt;/code&gt; layer. This clearly demonstrates the dangers of focusing only on "how" without asking "why" in the field of security.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can We Optimize Our Learning Process?
&lt;/h2&gt;

&lt;p&gt;In the age of AI, to prevent skill atrophy, we must adopt an active and conscious learning approach. We should use AI as a teacher, a mentor, not as a solution provider. In one of my own side projects (my Android spam app), I used AI only to understand the &lt;code&gt;Kotlin&lt;/code&gt; code required for &lt;code&gt;Flutter native bridging&lt;/code&gt; or to interpret &lt;code&gt;metadata reject&lt;/code&gt; errors during the &lt;code&gt;Play Store&lt;/code&gt; publishing process to solve performance issues I encountered. However, I solved the actual &lt;code&gt;profiling&lt;/code&gt; and &lt;code&gt;native package integration&lt;/code&gt; problems myself, because AI's general answers were insufficient.&lt;/p&gt;

&lt;p&gt;Here are a few suggestions to optimize our learning process without falling into this trap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Use AI as an Explainer&lt;/strong&gt;: When you see a piece of code or configuration, ask AI to explain it. Ask questions like, "What does &lt;code&gt;Type=forking&lt;/code&gt; mean in this &lt;code&gt;systemd unit&lt;/code&gt; and why is it important?"&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verification and Experimentation&lt;/strong&gt;: Test every output from AI and try it on your own system. When it suggests an &lt;code&gt;index&lt;/code&gt; in &lt;code&gt;PostgreSQL&lt;/code&gt;, check with &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; if it actually provides a performance improvement.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Revisit Fundamental Knowledge&lt;/strong&gt;: When you struggle to understand a topic, turn to official documentation (Linux &lt;code&gt;man&lt;/code&gt; pages, RFCs, open-source project documentation) rather than AI. For example, AI can give you a general summary about &lt;code&gt;BGP routing decisions&lt;/code&gt;, but reading RFC 4271 will help you understand the depth of the protocol.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Reverse Engineer&lt;/strong&gt;: Take a code or configuration generated by AI and try to understand why it works that way. Question the purpose of every line, every parameter.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Seek Manual Solutions&lt;/strong&gt;: When you encounter a problem, try to solve it yourself before asking AI. This will strengthen your problem-solving muscles. But if you get stuck, use AI to get a hint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Pragmatic Approach: Positioning AI as a Tool
&lt;/h2&gt;

&lt;p&gt;Completely rejecting AI would be illogical in today's world. It's like insisting on using an axe when there's an electric saw. The important thing is to know when and how to use AI. My philosophy is to position AI as an accelerating tool, but to constantly strive to maintain and develop my core competencies.&lt;/p&gt;

&lt;p&gt;In the financial calculators of one of my side products, I use AI to quickly verify complex mathematical formulas or to better understand user inputs through &lt;code&gt;prompt engineering&lt;/code&gt;. However, I write the core business logic, calculation algorithms, and &lt;code&gt;idempotency&lt;/code&gt; controls that ensure data integrity myself. While building a &lt;code&gt;multi-provider fallback&lt;/code&gt; architecture using different &lt;code&gt;provider&lt;/code&gt;s like &lt;code&gt;Gemini Flash&lt;/code&gt;, &lt;code&gt;Groq&lt;/code&gt;, &lt;code&gt;Cerebras&lt;/code&gt;, I use &lt;code&gt;LLM&lt;/code&gt;s themselves as accelerators, but I manually design and test this &lt;code&gt;fallback&lt;/code&gt; logic and &lt;code&gt;rate limiting&lt;/code&gt; mechanisms. This both saves me time and ensures I don't lose control over the critical parts of the system.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Use AI as a Mentor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of AI as a mentor that can guide you on unfamiliar topics and offer different perspectives. Instead of getting direct answers from it, ask questions like, "How do I debug this?", "What are the possible root causes of this error?", "What are the advantages and disadvantages of this architecture?" to develop your critical thinking skills.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In my career, when solving &lt;code&gt;PostgreSQL WAL bloat&lt;/code&gt; issues, making &lt;code&gt;Redis OOM eviction policy&lt;/code&gt; choices, or configuring &lt;code&gt;Nginx reverse proxy&lt;/code&gt; settings, a general answer from AI would only save me at that moment. But understanding the deep reasons behind these problems, performing &lt;code&gt;connection pool tuning&lt;/code&gt;, determining &lt;code&gt;replication&lt;/code&gt; strategies, or making conscious &lt;code&gt;L4 vs L7 load balancing&lt;/code&gt; choices made me a real engineer. This means that AI cannot solve everything, and we need to continuously exercise our engineering muscles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Invest in Your Own Muscles
&lt;/h2&gt;

&lt;p&gt;AI undoubtedly simplifies our work and increases efficiency. However, this convenience also brings with it a insidious danger like "skill atrophy." The lesson I've learned from my 20 years of experience is this: no matter how much technology advances, fundamental engineering skills, critical thinking ability, and problem-solving muscles will always be our most valuable assets.&lt;/p&gt;

&lt;p&gt;To avoid falling into this trap, we must use AI consciously, question the solutions it offers, and always try to understand the underlying principles. Investing in our own technical muscles will not only make us better engineers in the long run but also position us as adaptive and valuable professionals who can solve problems even when AI falls short. Otherwise, those who use AI the most are destined to atrophy the fastest.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>indiehacker</category>
    </item>
    <item>
      <title>I Deleted Google Photos: All My Memories to My Own Server with Immich</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Thu, 18 Jun 2026 00:19:11 +0000</pubDate>
      <link>https://dev.to/merbayerp/i-deleted-google-photos-all-my-memories-to-my-own-server-with-immich-4j5n</link>
      <guid>https://dev.to/merbayerp/i-deleted-google-photos-all-my-memories-to-my-own-server-with-immich-4j5n</guid>
      <description>&lt;p&gt;Ever since Google Photos changed its free storage limits, the idea of hosting all my digital memories under my own control, on my own server, has been on my mind. Last month, I finally pulled my nearly 400 GB photo and video archive entirely from Google and migrated it to my own VPS using the open-source Immich project. This process not only involved moving my data but also taught me important lessons about data sovereignty and long-term costs.&lt;/p&gt;

&lt;p&gt;In this post, I will detail why I left Google Photos, why I chose Immich, the setup and data migration steps, the technical challenges I encountered, and the maintenance and security strategies I apply to keep my own photo server running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Left Google Photos: Data Sovereignty and Cost
&lt;/h2&gt;

&lt;p&gt;For years, I got used to the convenience of Google Photos. Everything I shot on my phone was automatically backed up, and I could easily find anything I was looking for. However, with the end of unlimited storage in 2021, I realized that this convenience would come at a cost. The turning point for me was having nearly 400 GB of photo and video data and exceeding Google's 100 GB free quota.&lt;/p&gt;

&lt;p&gt;When I saw the approximately 100 USD I would have to pay annually for 2 TB of storage, I calculated that this cost would be more expensive in the long run than buying a disk for my own server. Moreover, I was concerned about how my data was processed by Google's AI algorithms and how much my privacy was protected. I had a similar data sovereignty discussion while working on a production ERP; there, too, the risks and costs of keeping critical company data in the cloud pushed us to invest in our own infrastructure. My personal data was at least as critical to me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Cost Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When calculating long-term costs, it's important to consider not only cloud storage fees but also potential data transfer fees and the risk of changes in the cloud service provider's pricing policies. The one-time cost I paid for a 2 TB disk on my own server would be more affordable than the total amount I would pay to Google over a few years.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Immich and Why Did I Choose Immich?
&lt;/h2&gt;

&lt;p&gt;My search for an alternative to Google Photos led me to a number of open-source solutions. I examined options like PhotoPrism and Nextcloud Photos, but Immich, with its modern interface and mobile app support, met my expectations the most. Immich offers a self-hosted photo and video backup solution; it stands out with features like AI-powered object and face recognition, automatic backup, and multi-user support.&lt;/p&gt;

&lt;p&gt;The main reasons I chose Immich were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Mobile App:&lt;/strong&gt; Thanks to its native apps for both Android and iOS, I can automatically back up from my phone. The user experience is quite similar to Google Photos.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Active Development:&lt;/strong&gt; The project's GitHub repository is constantly updated, new features are rapidly added, and the community is very active. This gave me confidence for future support and development.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Microservice Architecture:&lt;/strong&gt; In the background, PostgreSQL, Redis, and multiple Immich services run via Docker containers. This structure felt familiar to me in terms of performance and scalability; since we use similar approaches in enterprise software architectures, it would be easier to manage.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AI Features:&lt;/strong&gt; Thanks to AI algorithms running on my own server, I can perform object and face recognition in my photos. This allows me to perform smart searches without sending my data to a third-party service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other solutions either lacked sufficient mobile app support or had very outdated interfaces. Immich stood out with its promise of a modern experience under my own control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Immich Installation Process: Step-by-Step with Docker Compose
&lt;/h2&gt;

&lt;p&gt;I used Docker Compose to install Immich on my own VPS. For me, running Docker containers on a bare-metal server is always my favorite hybrid deployment method, both for flexibility and resource management. Before installation, I had an Ubuntu 22.04 LTS VPS with 4GB RAM and 2vCPUs ready. Docker and Docker Compose were installed on this VPS.&lt;/p&gt;

&lt;p&gt;The installation steps generally proceeded as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A Linux server (Ubuntu recommended)&lt;/li&gt;
&lt;li&gt;  Docker and Docker Compose&lt;/li&gt;
&lt;li&gt;  Sufficient storage space (in my case, a 2 TB NVMe disk)&lt;/li&gt;
&lt;li&gt;  Nginx (for reverse proxy and SSL)&lt;/li&gt;
&lt;li&gt;  A domain name (e.g., &lt;code&gt;photos.mysite.com&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pulling Immich Project Files:&lt;/strong&gt;&lt;br&gt;
I downloaded the &lt;code&gt;docker-compose.yml&lt;/code&gt; file from Immich's &lt;a href="https://github.com/immich-app/immich" rel="noopener noreferrer"&gt;official GitHub repository&lt;/a&gt;. This file defines all Immich services (server, microservices, web, machine learning, PostgreSQL, Redis).&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/immich &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /opt/immich
wget &lt;span class="nt"&gt;-O&lt;/span&gt; docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget &lt;span class="nt"&gt;-O&lt;/span&gt; .env https://github.com/immich-app/immich/releases/latest/download/.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setting Environment Variables (.env):&lt;/strong&gt;&lt;br&gt;
I edited the &lt;code&gt;.env&lt;/code&gt; file to make adjustments according to my own requirements. Variables such as &lt;code&gt;DB_PASSWORD&lt;/code&gt;, &lt;code&gt;UPLOAD_LOCATION&lt;/code&gt; (the directory where photos will be stored), and &lt;code&gt;TZ&lt;/code&gt; (timezone) were particularly important. I used the &lt;code&gt;/mnt/data/immich_uploads&lt;/code&gt; directory for photos on my server.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example .env file content&lt;/span&gt;
&lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;very_strong_password
&lt;span class="nv"&gt;UPLOAD_LOCATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/mnt/data/immich_uploads
&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Europe/Istanbul
&lt;span class="c"&gt;# ... other Immich settings&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Starting Containers:&lt;/strong&gt;&lt;br&gt;
After making all the settings, I started the Immich services with a single command.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This command started all services in the background and downloaded the container images. The first launch may take some time, as multiple images are downloaded and the PostgreSQL database is initially set up. I monitored the status of the services with the &lt;code&gt;docker compose logs -f&lt;/code&gt; command.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The architecture of Immich services is quite modular. The Mermaid diagram below shows how the main components interact with each other:&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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEQ7CiAgICBBWyJVc2VyIChXZWIvTW9iaWxlIEFwcCkiXSAtLT4gQlsiTmdpbnggKFJldmVyc2UgUHJveHkpIl07CiAgICBCIC0tPiBDWyJJbW1pY2ggV2ViIl07CiAgICBCIC0tPiBEWyJJbW1pY2ggU2VydmVyIChBUEkpIl07CiAgICBEIC0tPiBFWyJJbW1pY2ggTWljcm9zZXJ2aWNlcyJdOwogICAgRCAtLT4gRlsiUG9zdGdyZVNRTCJdOwogICAgRSAtLT4gRjsKICAgIEUgLS0-IEdbIlJlZGlzIl07CiAgICBFIC0tPiBIWyJJbW1pY2ggTWFjaGluZSBMZWFybmluZyJdOwogICAgSCAtLT4gRjsKICAgIEggLS0-IEc7CiAgICBGIC0tPiBJWyJTdG9yYWdlIChpbW1pY2hfdXBsb2FkcykiXTsKICAgIEUgLS0-IEk7%3Ftype%3Dpng%26bgColor%3Dwhite" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEQ7CiAgICBBWyJVc2VyIChXZWIvTW9iaWxlIEFwcCkiXSAtLT4gQlsiTmdpbnggKFJldmVyc2UgUHJveHkpIl07CiAgICBCIC0tPiBDWyJJbW1pY2ggV2ViIl07CiAgICBCIC0tPiBEWyJJbW1pY2ggU2VydmVyIChBUEkpIl07CiAgICBEIC0tPiBFWyJJbW1pY2ggTWljcm9zZXJ2aWNlcyJdOwogICAgRCAtLT4gRlsiUG9zdGdyZVNRTCJdOwogICAgRSAtLT4gRjsKICAgIEUgLS0-IEdbIlJlZGlzIl07CiAgICBFIC0tPiBIWyJJbW1pY2ggTWFjaGluZSBMZWFybmluZyJdOwogICAgSCAtLT4gRjsKICAgIEggLS0-IEc7CiAgICBGIC0tPiBJWyJTdG9yYWdlIChpbW1pY2hfdXBsb2FkcykiXTsKICAgIEUgLS0-IEk7%3Ftype%3Dpng%26bgColor%3Dwhite" alt="Diagram" width="579" height="694"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This structure ensures that each component fulfills its own responsibility and helps prevent a single component failure from affecting the entire system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Importing Google Takeout Data to Immich and Challenges Faced
&lt;/h2&gt;

&lt;p&gt;After completing the Immich setup, the most critical step was importing the data I downloaded from Google Photos to Immich. I had downloaded my entire archive as ZIP files using Google Takeout. However, properly importing this data into Immich was a more complex process than I expected.&lt;/p&gt;

&lt;p&gt;Google Takeout creates a separate JSON file (&lt;code&gt;.json&lt;/code&gt;) for each photo or video to store metadata information (capture date, location, etc.). Immich's own import tool can read these JSON files, but Takeout's folder structure and sometimes missing or incorrect metadata information can cause problems.&lt;/p&gt;

&lt;p&gt;For import, I used a CLI tool called &lt;code&gt;immich-go&lt;/code&gt;. This tool is specifically designed to import Google Takeout data into Immich.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preparing Google Takeout Data:&lt;/strong&gt;&lt;br&gt;
I unzipped all the ZIP files and placed them under a single root directory as expected by the &lt;code&gt;immich-go&lt;/code&gt; tool. For example: &lt;code&gt;/mnt/data/google_takeout_data&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Installing the &lt;code&gt;immich-go&lt;/code&gt; Tool:&lt;/strong&gt;&lt;br&gt;
I installed the tool on a system with Go installed (I installed it on my laptop) with the following command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/alextran1502/immich-go@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Importing Data to Immich:&lt;/strong&gt;&lt;br&gt;
I started the import with &lt;code&gt;immich-go&lt;/code&gt; by specifying my Immich server address and API key.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;immich-go upload &lt;span class="nt"&gt;--server&lt;/span&gt; https://photos.mysite.com &lt;span class="nt"&gt;--api-key&lt;/span&gt; &amp;lt;IMMICH_API_KEY&amp;gt; &lt;span class="nt"&gt;--recursive&lt;/span&gt; /mnt/data/google_takeout_data
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;One of the biggest challenges I encountered here was that the metadata of some photos in Takeout JSONs was corrupted. Especially for very old photos or videos uploaded from different devices, EXIF information could be missing. This prevented Immich from indexing these files with the correct timestamp. Some files appeared with default dates like &lt;code&gt;2000-01-01&lt;/code&gt;. This reminded me of the date format and data integrity issues we faced when integrating IFRS into a production ERP; data quality is always the biggest source of problems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Metadata Loss and Timestamps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is possible for some metadata information in Google Takeout data to be missing or incorrect. This is often the case for old photos or photos from different sources. After importing into Immich, check the timestamps of important photos and correct them manually if necessary. Otherwise, your memories may not be in chronological order.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To detect such issues, I carefully examined the "Recently Uploaded" section in the Immich interface after the import and manually found and corrected files with strange-looking dates. Sometimes I also updated the EXIF data of photos using tools like &lt;code&gt;exiftool&lt;/code&gt; with the information from the JSON.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Keeping the Immich Infrastructure Running: Maintenance, Security, and Performance
&lt;/h2&gt;

&lt;p&gt;Setting up my own photo server is not just a one-time setup. It requires continuous maintenance, security updates, and performance optimization. This was another example of the "setup never ends, operations begin" principle I learned from my 20 years of system administration experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maintenance and Updates
&lt;/h3&gt;

&lt;p&gt;Since Immich is actively developed, it's important to keep up with updates regularly. I usually run &lt;code&gt;docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;/code&gt; commands weekly to update the containers to the latest versions. This allows me to get new features as well as critical security patches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;I adopted a multi-layered approach to secure my Immich server:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nginx Reverse Proxy and SSL:&lt;/strong&gt; Instead of direct access to Immich, I routed all traffic through Nginx. I used a free SSL certificate from Let's Encrypt to ensure all traffic is encrypted. This is an approach I frequently use in &lt;code&gt;L7 load balancing&lt;/code&gt; scenarios as well.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/nginx/sites-available/immich.conf&lt;/span&gt;
&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;photos.mysite.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;photos.mysite.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/photos.mysite.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/photos.mysite.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_session_cache&lt;/span&gt; &lt;span class="s"&gt;shared:SSL:10m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_session_timeout&lt;/span&gt; &lt;span class="mi"&gt;10m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_protocols&lt;/span&gt; &lt;span class="s"&gt;TLSv1.2&lt;/span&gt; &lt;span class="s"&gt;TLSv1.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://immich_web:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Immich web container name and port&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_buffering&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Important for large file uploads&lt;/span&gt;
        &lt;span class="kn"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Unlimited file size&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/api&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://immich_server:3001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Immich API container name and port&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_buffering&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;0&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;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fail2ban:&lt;/strong&gt; I installed &lt;code&gt;fail2ban&lt;/code&gt; to block failed login attempts to the server. It automatically blocks brute-force attacks by monitoring Nginx logs. This is always one of the first security measures I take.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Firewall (UFW):&lt;/strong&gt; I ensured that only the necessary ports (80, 443) were open, making other server ports inaccessible from the outside. I also isolated communication between Immich's containers via Docker's own network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;System Security:&lt;/strong&gt; I monitor Linux kernel modules (with &lt;code&gt;auditd&lt;/code&gt;) and track known CVEs. For example, I previously blacklisted a kernel module for a security vulnerability in the &lt;code&gt;algif_aead&lt;/code&gt; module. Such measures increase the overall security of the server.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Performance Optimization
&lt;/h3&gt;

&lt;p&gt;I made some performance adjustments for Immich to run fast and smoothly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQL Tuning:&lt;/strong&gt; Since PostgreSQL is the heart of Immich, I optimized the database settings. In particular, I adjusted &lt;code&gt;shared_buffers&lt;/code&gt;, &lt;code&gt;work_mem&lt;/code&gt;, and &lt;code&gt;max_connections&lt;/code&gt; parameters according to my server's RAM and usage model. I also optimized &lt;code&gt;checkpoint_completion_target&lt;/code&gt; and &lt;code&gt;max_wal_size&lt;/code&gt; settings to prevent WAL bloat issues.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Some adjustments made in postgresql.conf&lt;/span&gt;
&lt;span class="n"&gt;shared_buffers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;GB&lt;/span&gt;          &lt;span class="c1"&gt;-- Around 25% of total RAM&lt;/span&gt;
&lt;span class="n"&gt;work_mem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="n"&gt;MB&lt;/span&gt;               &lt;span class="c1"&gt;-- Memory per query&lt;/span&gt;
&lt;span class="n"&gt;maintenance_work_mem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="n"&gt;MB&lt;/span&gt;  &lt;span class="c1"&gt;-- For operations like VACUUM&lt;/span&gt;
&lt;span class="n"&gt;max_connections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;         &lt;span class="c1"&gt;-- According to application's connection needs&lt;/span&gt;
&lt;span class="n"&gt;wal_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;replica&lt;/span&gt;
&lt;span class="n"&gt;max_wal_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;GB&lt;/span&gt;            &lt;span class="c1"&gt;-- Maximum size of WAL files&lt;/span&gt;
&lt;span class="n"&gt;checkpoint_completion_target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="c1"&gt;-- To extend checkpoint duration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Redis Eviction Policy:&lt;/strong&gt; Redis is used by Immich for caching. I set the &lt;code&gt;maxmemory-policy&lt;/code&gt; setting, which determines which data to evict when memory is full, to &lt;code&gt;allkeys-lru&lt;/code&gt;. This ensures that the least recently used keys are evicted, keeping important data in memory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Container Resource Limits:&lt;/strong&gt; I limited the RAM and CPU usage of Immich containers using &lt;code&gt;cgroup&lt;/code&gt; settings within Docker Compose. This was critical, especially since the &lt;code&gt;immich-machine-learning&lt;/code&gt; service can consume high CPU and RAM. The &lt;code&gt;memory.high&lt;/code&gt; soft limit prevents a service from overusing memory while tolerating momentary spikes.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example for immich-machine-learning service in docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;immich-machine-learning&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/immich-app/immich-machine-learning:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# ...&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1.0'&lt;/span&gt;
                &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2G&lt;/span&gt;
            &lt;span class="na"&gt;reservations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0.5'&lt;/span&gt;
                &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1G&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitoring:&lt;/strong&gt; I continuously monitor the performance of my server and Immich services using Prometheus and Grafana. I track metrics such as disk usage (I'm sensitive about this after experiencing a "docker disk fire"), CPU, RAM, and network traffic. I receive notifications when an alarm threshold is exceeded.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Backup Strategy
&lt;/h3&gt;

&lt;p&gt;The most important aspect of my own photo server is backup. Losing all my memories would be a disaster. Therefore, I regularly back up Immich data:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;PostgreSQL Database Backup:&lt;/strong&gt; Every night, I back up the database using &lt;code&gt;pg_dump&lt;/code&gt; and copy it to a separate storage area (an SMB share on a different server).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Photo and Video Files:&lt;/strong&gt; I synchronize the directory I specified as &lt;code&gt;UPLOAD_LOCATION&lt;/code&gt; (i.e., &lt;code&gt;/mnt/data/immich_uploads&lt;/code&gt;) with &lt;code&gt;rsync&lt;/code&gt; every night, backing it up to a separate storage unit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These two backup strategies allow me to fully restore my Immich setup in case of any disaster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-offs and Future Plans for Photo Management on My Own Server
&lt;/h2&gt;

&lt;p&gt;Migrating from Google Photos to Immich was more than just a technical challenge for me; it meant regaining control over my digital assets. However, as with every technological decision, this approach has its own advantages and disadvantages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Full Control and Privacy:&lt;/strong&gt; I know exactly where my data is stored, who can access it, and which algorithms process it. I am not dependent on a third-party company's privacy policies.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cost-Effectiveness:&lt;/strong&gt; Although there is an initial setup cost (VPS, disk), it is more affordable in the long run than annual subscription fees. This difference becomes even more pronounced for those with high storage needs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Flexibility:&lt;/strong&gt; Since it's on my own server, I can customize Immich according to my needs, and integrate it with different services (for example, I can use an AI model from my own side project to tag my photos).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Learning Opportunity:&lt;/strong&gt; This process reinforced my practical experience in Docker, PostgreSQL tuning, Nginx configuration, and Linux system administration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Maintenance Burden:&lt;/strong&gt; System updates, backups, security patches, and potential troubleshooting are entirely my responsibility. This requires time and technical knowledge.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Initial Setup Complexity:&lt;/strong&gt; After the "plug and play" ease of Google Photos, Immich's setup and data migration required more technical knowledge and patience.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Internet Connection:&lt;/strong&gt; Since my home internet upload speed is limited, initial synchronization and uploading large video files took days. A good upload speed is critical for high-resolution photos and 4K videos.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Backup Responsibility:&lt;/strong&gt; A robust backup strategy must be established and regularly checked to prevent data loss. This is an additional responsibility for those accustomed to the automatic backup convenience of cloud services.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Future Plans
&lt;/h3&gt;

&lt;p&gt;My journey with Immich is just beginning. In the future, I aim to further develop Immich's AI capabilities. In particular, I plan to integrate some of my own AI models (using prompt engineering and RAG patterns) into Immich to add smarter search and automatic tagging features. Also, writing scripts to automatically synchronize photos from different devices (action cameras, drones) to Immich is among my plans.&lt;/p&gt;

&lt;p&gt;This transition, like the "monolith vs microservice" debate, once again reminded me of the benefits and responsibilities that come with having full control over a system. My preference, when it comes to my personal data, has always been to take control.&lt;/p&gt;

&lt;p&gt;I am quite satisfied with my Immich experience. Hosting my own data on my own server has given me both peace of mind and technological satisfaction. If you also want to take control of your digital memories, Immich is definitely a project you should consider. In the next post, I will explain how I integrated this Immich setup with a Zero-Trust Network Access (ZTNA) architecture.&lt;/p&gt;

</description>
      <category>selfhosting</category>
      <category>linux</category>
      <category>docker</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Will AI Make Developers Jobless? An Honest Answer</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Wed, 17 Jun 2026 14:07:26 +0000</pubDate>
      <link>https://dev.to/merbayerp/will-ai-make-developers-jobless-an-honest-answer-g6n</link>
      <guid>https://dev.to/merbayerp/will-ai-make-developers-jobless-an-honest-answer-g6n</guid>
      <description>&lt;p&gt;The question of whether AI will make developers jobless is one of the most common things I've heard lately. My short and honest answer is: &lt;strong&gt;No, AI will not make developers jobless, but it will fundamentally change the nature of our work and put some developers, especially those who cannot adapt to change, in a difficult position.&lt;/strong&gt; Based on my 20 years of experience in system architecture, network, and software development, this transformation encompasses much more than just writing code.&lt;/p&gt;

&lt;p&gt;Once, in an ERP project for manufacturing, I asked AI to generate boilerplate code for a module. Its initial output looked quite good, quickly creating an API endpoint and models for simple CRUD operations. However, I found that AI was completely inadequate at understanding the critical part of the job: the complex business workflow that checks whether a product has passed its final quality control before shipment and affects stock movements between different warehouses, and then translating that into code. AI can form coherent sentences, but it cannot understand the &lt;em&gt;spirit of the business&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Much Code Can AI Write and What Are Its Limits?
&lt;/h2&gt;

&lt;p&gt;AI models, especially large language models (LLMs), have made incredible progress in tasks such as writing code, refactoring, debugging, and creating test scenarios. Quickly spinning up an HTTP server, generating ORM models from a database schema, or writing a function according to a specific algorithm is now possible in seconds. I've greatly benefited from AI when creating simple endpoints for FastAPI in the backend of my side product or designing basic UI components for an Android spam app.&lt;/p&gt;

&lt;p&gt;However, there are clear limits to AI's capabilities. Current AIs struggle to understand complex business logic, organizational flows, or subtle dependencies between different systems. As I've seen in an internal banking platform, it's currently impossible for AI alone to correctly interpret and code layered rules such as security requirements, regulatory restrictions, and approval processes from different departments for a financial transaction. AI only processes the patterns and existing data it's given; it cannot grasp the deep &lt;em&gt;cause-and-effect&lt;/em&gt; relationships or the &lt;em&gt;strategic purpose&lt;/em&gt; behind those patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Has AI Fit Into My Experiences?
&lt;/h2&gt;

&lt;p&gt;I see AI as a "co-pilot" in my work, never an "autopilot." Especially when developing an ERP for a manufacturing company, we used AI for production planning optimization. We received predictions from AI to analyze data from operator screens and optimally adjust inventory and shipment dates. This provided an efficiency far beyond manual planning.&lt;/p&gt;

&lt;p&gt;However, the job of providing AI with the correct data, training models, interpreting its outputs, and seamlessly integrating these outputs into the existing ERP flow was entirely up to me and my team. In critical system administration tasks like determining index strategies in a PostgreSQL database, setting Redis's OOM eviction policy, or managing journald limits in the system, the simple command suggestions offered by AI were often insufficient. That's where real experience and the answer to the "why" question come into play.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ AI is a Tool&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI, just like an IDE or a debugger, is a powerful tool that allows us to do our work faster and more efficiently. But for a carpenter to build a perfect table with a hammer, a hammer alone is not enough; they need to know the wood, understand the design, and have years of experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How Is the Developer's Role Changing in the Future?
&lt;/h2&gt;

&lt;p&gt;With the rise of AI, the role of developers will shift towards higher-level thinking, problem-solving, and system architecture. Rather than writing raw code, asking AI the right questions (prompt engineering), critically evaluating AI's output, and integrating this output into existing complex systems will become more valuable. I can get ideas from AI when designing a ZTNA architecture or examining a BGP routing decision, but I make the final decision based on my own experience and risk analysis.&lt;/p&gt;

&lt;p&gt;Especially when working on AI application architectures like RAG (Retrieval-Augmented Generation) or agent patterns, I've seen how critical it is to ensure that AI doesn't just rely on what it has learned, but can also access the specific and up-to-date information I provide. This strengthens the developer's role as an "information manager" and "system integrator." The developer of the future will need to know the business domain very well, in addition to technical knowledge; because it will be that domain knowledge that tells AI what to optimize.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is the Real Risk of AI Joblessness, or Something Else?
&lt;/h2&gt;

&lt;p&gt;In my opinion, the real risk of AI for developers is not joblessness, but &lt;strong&gt;resistance to change and loss of competence.&lt;/strong&gt; If a developer sees AI only as a "code-writing machine" and doesn't bother to learn and use it, or blindly trusts the code produced by AI, then they can truly lose their competitive edge. Last month, I got a timer config for a systemd unit from AI; it looked correct at first, but it entered an unexpected OOM-killed loop due to the &lt;code&gt;Restart&lt;/code&gt; policy. To understand this, I again had to use my knowledge of Linux services and cgroup limits.&lt;/p&gt;

&lt;p&gt;So, the issue is not how well AI writes code, but how well we understand, manage, and work with AI. The human brain still possesses adaptability, abstract thinking power, and ethical judgment that AI does not. If we develop these abilities and use AI as an extension of ourselves, we can achieve much greater success in software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what do you think? How do you think AI will affect your job, and how are you preparing for this transformation? Share with me in the comments.
&lt;/h2&gt;

</description>
      <category>ai</category>
      <category>software</category>
    </item>
    <item>
      <title>From Eggdrop to AI Agents: It's Not Actually That New</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Wed, 17 Jun 2026 12:48:52 +0000</pubDate>
      <link>https://dev.to/merbayerp/from-eggdrop-to-ai-agents-its-not-actually-that-new-1m7d</link>
      <guid>https://dev.to/merbayerp/from-eggdrop-to-ai-agents-its-not-actually-that-new-1m7d</guid>
      <description>&lt;p&gt;These days, AI Agents, MCP servers, tool calling, memory systems, and autonomous workflows are among the hottest topics in the tech world. People talk about how AI can now use tools, make decisions, and carry out complex tasks on its own. Most of these are genuinely impressive developments.&lt;/p&gt;

&lt;p&gt;But whenever I think about these topics, another era keeps coming to mind.&lt;/p&gt;

&lt;p&gt;The IRC days.&lt;/p&gt;

&lt;p&gt;A large portion of today's young developers have never used IRC. Some may not have even heard of it. But back when the internet was simpler, slower, and maybe more intimate, IRC was the center of online communities. People gathered in specific channels, chatted, shared knowledge, and built communities.&lt;/p&gt;

&lt;p&gt;And of course, there were bots.&lt;/p&gt;

&lt;p&gt;Back then, owning an Eggdrop bot was a serious deal. It managed channels, tracked users, responded to commands, and took on various automation tasks. Looking back today it seems funny, but even a bot returning the right answer to a specific command was enough to excite us.&lt;/p&gt;

&lt;p&gt;A user would join the channel.&lt;/p&gt;

&lt;p&gt;The bot would say welcome.&lt;/p&gt;

&lt;p&gt;Someone would type a specific command.&lt;/p&gt;

&lt;p&gt;The bot would return a predefined answer.&lt;/p&gt;

&lt;p&gt;It would give the time, show the weather, remind people of the channel rules.&lt;/p&gt;

&lt;p&gt;By today's standards they were extremely simple systems. But back then, setting them up and managing them was anything but easy.&lt;/p&gt;

&lt;p&gt;We couldn't find most things as ready-made packages. There was no Stack Overflow. There was no AI. When you ran into a problem, finding the solution sometimes took days. A single-line error in a TCL script could keep the bot down for hours. Log files were examined line by line, solutions were searched on forums, help was asked in other IRC channels.&lt;/p&gt;

&lt;p&gt;Looking back now, I see an interesting similarity.&lt;/p&gt;

&lt;p&gt;Today's AI Agents and the bots of that era have more in common than we'd think.&lt;/p&gt;

&lt;p&gt;Both take an input.&lt;/p&gt;

&lt;p&gt;Both run a certain logic.&lt;/p&gt;

&lt;p&gt;Both perform an action.&lt;/p&gt;

&lt;p&gt;Both produce a result.&lt;/p&gt;

&lt;p&gt;Of course today's systems are far more advanced. Instead of pre-written rules, we now use large language models. Instead of fixed answers, we can generate natural language. Instead of static command lists, we design systems that can call tools.&lt;/p&gt;

&lt;p&gt;But the core idea is actually very familiar.&lt;/p&gt;

&lt;p&gt;A message arrives.&lt;/p&gt;

&lt;p&gt;The system evaluates.&lt;/p&gt;

&lt;p&gt;A decision is made.&lt;/p&gt;

&lt;p&gt;An action is performed.&lt;/p&gt;

&lt;p&gt;A response is produced.&lt;/p&gt;

&lt;p&gt;When we talk about MCP servers and tool calling today, I sometimes remember the old IRC services. Back then, too, there were different services, different tasks, and automation layers that interacted with each other. Of course they're not technologically the same thing. But the problem space is surprisingly similar.&lt;/p&gt;

&lt;p&gt;I don't think the real big change is here.&lt;/p&gt;

&lt;p&gt;The real big change happened in access to knowledge.&lt;/p&gt;

&lt;p&gt;In the past, when we had a problem, we had to do research to find the solution. Sometimes for days. Sometimes for weeks. Knowing about a topic was an advantage in itself.&lt;/p&gt;

&lt;p&gt;Today, reaching information often takes seconds.&lt;/p&gt;

&lt;p&gt;That's why the value of developers has started to change too.&lt;/p&gt;

&lt;p&gt;In the past, "knowing how to do it" was what mattered.&lt;/p&gt;

&lt;p&gt;Today, "knowing what needs to be done" is becoming more important.&lt;/p&gt;

&lt;p&gt;Because access to technical knowledge has been democratized.&lt;/p&gt;

&lt;p&gt;AI can write code for you.&lt;/p&gt;

&lt;p&gt;It can summarize documentation.&lt;/p&gt;

&lt;p&gt;It can explain error messages.&lt;/p&gt;

&lt;p&gt;But you still decide which problem to solve.&lt;/p&gt;

&lt;p&gt;Maybe that's why the AI Agent revolution doesn't feel like a completely new era to me.&lt;/p&gt;

&lt;p&gt;It looks more like the next stage of an evolution that has been going on for a long time.&lt;/p&gt;

&lt;p&gt;There's a line stretching from IRC bots to web bots, then to chatbots, and now to AI Agents. Each generation became more capable than the last. But the core purpose never changed.&lt;/p&gt;

&lt;p&gt;We were always trying to make computers a little more useful.&lt;/p&gt;

&lt;p&gt;Maybe what we're living through today isn't a completely new story.&lt;/p&gt;

&lt;p&gt;Maybe it's the natural continuation of the first Eggdrop script we wrote years ago in an IRC channel.&lt;/p&gt;

&lt;p&gt;Only now, the bots can really talk.&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>irc</category>
      <category>eggdrop</category>
      <category>softwarehistory</category>
    </item>
    <item>
      <title>How to Survive as a Developer in the Age of AI?</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Wed, 17 Jun 2026 11:03:55 +0000</pubDate>
      <link>https://dev.to/merbayerp/how-to-survive-as-a-developer-in-the-age-of-ai-df6</link>
      <guid>https://dev.to/merbayerp/how-to-survive-as-a-developer-in-the-age-of-ai-df6</guid>
      <description>&lt;p&gt;One of the biggest turning points in my career was returning to fundamental engineering principles instead of blindly trying to adapt to every new technology. Amidst the current noise of "AI will change everything, developers will be jobless," I think the opposite: &lt;strong&gt;Developers with technical depth, who are true problem solvers, will become more valuable than ever.&lt;/strong&gt; AI will take over the labor-intensive part of coding, but the questions of "what to code, why to code, and how to integrate" will remain on our desks.&lt;/p&gt;

&lt;p&gt;Working on supply chain integrations for a manufacturing ERP, I saw that code written without understanding a business workflow from end to end, no matter how AI-assisted, will only produce errors faster. The developer's true value lies in their ability to decipher these complex flows and transform them into a logically and technically sound structure. This ability requires human intuition and experience that AI cannot automate.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is AI Changing Our Coding Process?
&lt;/h2&gt;

&lt;p&gt;AI tools can now generate simple functions, boilerplate code, or standard API integrations in seconds. CRUD operations or basic data transformation scenarios that once took me days are now presented to me within minutes with a prompt. This is something I actively use and significantly boosts my productivity.&lt;/p&gt;

&lt;p&gt;However, these tools cannot, for example, automatically detect a WAL bloat issue in a PostgreSQL database and dynamically optimize &lt;code&gt;max_wal_size&lt;/code&gt; and &lt;code&gt;checkpoint_timeout&lt;/code&gt; settings, or adjust an OOM eviction policy in a Redis instance based on the actual need. Nor can they foresee edge cases that might arise in an iSCSI supply chain integration for a manufacturing company and ensure transaction integrity accordingly. This deep knowledge and experience are still the sole domain of human intelligence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Think of AI as an Assistant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;View AI as an assistant that researches for you, generates draft code, and fixes simple errors. Your role is to critically review these drafts, make architectural decisions, design system integrations, and understand the "why" behind the work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why is Real Problem-Solving Ability Vital?
&lt;/h2&gt;

&lt;p&gt;AI works by analyzing existing patterns and data. But real-world problems often go beyond predefined patterns. While working on a complex network segmentation for a client project, I spent hours dealing with VLAN tagging complexities. AI could have suggested the best VLAN configurations, but it couldn't provide the insight to detect and fix the actual physical cabling error, the misconfiguration on a switch port, or a minor mistake in BGP routing decisions at that moment.&lt;/p&gt;

&lt;p&gt;My 20 years of system and network administration experience have taught me the answers to "where to look first in this type of problem, which logs to check, which commands to run." This is intuition, a problem-solving model, and a form of "experience-based pattern recognition" that AI cannot yet replicate. It took me three days to find out why the late shipment report for a manufacturing ERP was always incomplete. The problem wasn't on the reporting side, but a small logic error in the production planning algorithm. AI cannot easily find these deep business logic errors on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Technical Depth and a Horizontal Perspective
&lt;/h2&gt;

&lt;p&gt;The automation brought by AI gives us more time. We should use this time to gain more technical depth and draw connections between different technology areas. For instance, knowing just software architecture isn't enough; you also need to be knowledgeable in areas like network security (switch hardening, ZTNA), system administration (systemd units, cgroup limits), and database optimization (PostgreSQL indexing strategies, WAL bloat).&lt;/p&gt;

&lt;p&gt;While developing the backend for my own side project, I frequently encountered issues like container disk fires or build OOM errors. These problems are solved not just with code, but with a wide range of system knowledge, from Linux kernel parameters to &lt;code&gt;memory.high&lt;/code&gt; soft limit adjustments. AI can provide me with information on these topics, but making the right decision and optimizing the system end-to-end is still my job.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ I Made a Mistake, I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Last month, I caused a container to be OOM-killed in a CI/CD pipeline by writing &lt;code&gt;sleep 360&lt;/code&gt;. I learned the hard way once again that I should use event-driven or a smarter waiting mechanism instead of polling-wait. Making mistakes is part of the learning process, and these experiences make us better problem solvers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Future of Developers: Becoming Architects and Solution Partners Who Utilize AI
&lt;/h2&gt;

&lt;p&gt;AI is not a threat to developers; it's an opportunity. It allows us to focus on more complex, more strategic problems. In my experience, successful developers have always been not just coders, but also those who understand the business, make architectural decisions, and know how systems work holistically.&lt;/p&gt;

&lt;p&gt;To survive in the age of AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Return to Fundamental Engineering Principles:&lt;/strong&gt; Master core subjects like algorithms, data structures, network protocols, and operating system principles.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Develop Domain Knowledge:&lt;/strong&gt; Deeply understand the business workflows, challenges, and goals of the industry you work in.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Architectural and Integration Skills:&lt;/strong&gt; Develop your ability not just to write code, but to design systems, integrate different technologies, and see the big picture.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Be Security-Conscious:&lt;/strong&gt; Learn software and network security principles. Topics like JWT/OAuth2, rate limiting, and SQL injection mitigation are now essential for every developer.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Embrace AI Tools:&lt;/strong&gt; Use AI not as a competitor, but as a powerful tool to enhance your productivity. Master AI application architecture approaches like prompt engineering and RAG.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI will be the brain of future systems, but building, managing, and troubleshooting their backbone and nervous system will still fall to us. The role of the developer will evolve from writing code to becoming the architect of systems and a partner in solving complex problems.&lt;/p&gt;

&lt;p&gt;What are your thoughts on this? How has AI impacted your career, or how do you foresee it doing so? Would you like to share in the comments?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>indiehacker</category>
    </item>
    <item>
      <title>What is MCP and Why Did It Become 2026's Most Important AI Standard?</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Wed, 17 Jun 2026 07:14:45 +0000</pubDate>
      <link>https://dev.to/merbayerp/what-is-mcp-and-why-did-it-become-2026s-most-important-ai-standard-188g</link>
      <guid>https://dev.to/merbayerp/what-is-mcp-and-why-did-it-become-2026s-most-important-ai-standard-188g</guid>
      <description>&lt;p&gt;The AI ecosystem, especially in recent years, has been experiencing rapid growth and diversification; however, this growth has also brought significant incompatibility issues. Microservice Communication Protocol (MCP) steps in precisely at this point, becoming a fundamental protocol that enables different AI models and services to communicate with each other in a standardized way, and by 2026, it has become the most talked about and accepted standard in the industry. In my own AI-powered operations and my clients' complex AI projects, I have seen countless times how critical this standard is.&lt;/p&gt;

&lt;p&gt;MCP fundamentally defines a set of rules necessary for various AI models and services (LLM, image processing, time series analysis, etc.) to exchange data over a common language and data format. This makes it much easier to combine, manage, and scale AI components from different providers or developed with different architectures under one roof. Last year, the difficulties I faced while integrating models from different AI providers in a client project once again proved the value of MCP to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP and What is Its Core Purpose?
&lt;/h2&gt;

&lt;p&gt;Microservice Communication Protocol (MCP), as its name suggests, is a communication protocol that enables AI components operating in a microservice architecture to communicate with each other securely, efficiently, and in a standardized manner. This protocol covers not only data exchange formats but also critical operational requirements such as service discovery, error management, versioning, and security. Its purpose is to minimize the integration complexity encountered when developing AI applications and to offer developers more modular, flexible, and scalable solutions.&lt;/p&gt;

&lt;p&gt;For me, the most significant benefit of MCP emerged when I was trying to combine different AI models to create an "agent" pattern. For example, in a manufacturing ERP, I needed to transfer the output from Gemini Flash for production planning to a Groq model for inventory optimization, and then pass it to my own developed time series model for shipment planning. Each model had its own API structure, data format, and authentication method. Thanks to MCP, each of these models could communicate with a standard interface, which reduced integration time by 60%. Previously, I had to write a custom adapter for each integration, but with MCP, this burden was largely eliminated.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ Core Layers of MCP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP typically operates at the Application Layer and uses lightweight data serialization formats like JSON or Protobuf. For security, it integrates industry standards such as JWT (JSON Web Tokens) and OAuth2, thereby ensuring secure authentication and authorization between AI services.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The USB-C Analogy: Why Standards Are So Important?
&lt;/h2&gt;

&lt;p&gt;To understand why MCP became the most important AI standard of 2026, one only needs to look at the revolution of USB-C in the world of electronics. For years, we had to use different chargers and data cables for different devices: Micro USB, Mini USB, Lightning, various proprietary connectors... This complexity was a huge burden for both manufacturers and consumers. USB-C arrived and solved all these problems with a single standard. With a single cable, we can charge, transfer data, and even get video output. This standardization facilitated integration between devices, reduced costs, and improved user experience.&lt;/p&gt;

&lt;p&gt;We faced a similar situation in the AI world. Every AI model had its own "connector"; GPT, Claude, Llama, our in-house models all used different APIs, different request/response formats. When we wanted to change a model or combine multiple models, we experienced integration nightmares lasting hours, days, or even weeks due to this "connector incompatibility." In one of my side projects, while evaluating different AI models for my Android spam blocker application, trying to integrate with three different models due to these API incompatibilities became a project in itself. MCP, just like USB-C, eliminates this complexity by promising and largely delivering a universal "plug-and-play" experience between AI models.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the Core Components of MCP?
&lt;/h2&gt;

&lt;p&gt;MCP is not just an API definition; it brings together a set of standardized components and protocols. These components are critical for enabling the collaboration of AI services. Based on my own experiences, I can list the most fundamental and effective components as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Standardized Input/Output Formats:&lt;/strong&gt; MCP defines uniform data formats for AI models (e.g., &lt;code&gt;application/mcp+json&lt;/code&gt; or &lt;code&gt;application/mcp+protobuf&lt;/code&gt;). This allows the output from one model to be directly used as input for another. For example, I can feed object detection results (bounding box coordinates and labels) from an image processing model directly into an LLM's visual description capability.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Service Discovery and Registration Mechanisms:&lt;/strong&gt; MCP-compliant services can register themselves with a central registry, and other services can find each other through this registry. This is indispensable for dynamic and scalable AI architectures. In a manufacturing ERP, a newly added AI model (e.g., for anomaly detection) automatically became discoverable and usable by other modules in the system.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Error and Status Codes:&lt;/strong&gt; Common error codes and status messages greatly simplify inter-service troubleshooting and monitoring. Understanding why a particular model failed, which used to be a days-long log-digging process before MCP, can now be quickly diagnosed with a standard error code. For example, when I see an &lt;code&gt;MCP_ERR_RATE_LIMIT_EXCEEDED&lt;/code&gt; error, I instantly know what to do.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Versioning and Compatibility Policies:&lt;/strong&gt; MCP establishes clear rules for versioning the protocol and APIs. This ensures that older services continue to function or a controlled transition can be made when new versions are released. This way, I don't have to retest the entire system from scratch when updating an AI model.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Advantage of Using Protobuf&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While JSON is flexible, binary serialization formats like Protobuf offer lower latency and less bandwidth consumption, especially between AI services that exchange high volumes of data. MCP supports both formats, giving developers the choice between performance and flexibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Now? The Rise of MCP in 2026
&lt;/h2&gt;

&lt;p&gt;Several fundamental dynamics underpin MCP's rise to such prominence in 2026. Firstly, the explosion of AI models and use cases. Instead of a single massive model, we are now seeing hybrid AI architectures where hundreds of smaller models with different specializations come together to undertake more complex tasks. This has brought the need to combine different models to its peak. Secondly, the diversification of AI providers. While there used to be a few major players, now there is a wide spectrum from Groq to Cerebras, OpenRouter to custom on-premise models. Dealing with each one's proprietary API had become unsustainable.&lt;/p&gt;

&lt;p&gt;Thirdly, and perhaps most importantly, the widespread adoption of enterprise-level AI applications. In the corporate world, AI models need to move beyond being mere "demos" and be integrated into critical business processes. When I needed to combine different AI models for financial fraud detection within a bank's internal platform, each model having a different API incredibly increased both integration costs and maintenance burden. MCP facilitated these corporate integrations, paving the way for AI to spread to wider audiences.&lt;/p&gt;

&lt;p&gt;For example, in my financial calculators, I use multiple small language models (fine-tuned LLMs) for different scenarios. One analyzes market trends, while the other extracts customer risk profiles. I combine the outputs of these two models to generate a final recommendation. Before MCP, I had to manually parse the output of each model and adapt it for the next. This made the process of detecting and debugging errors a nightmare. With MCP, this process has become much smoother and error-free.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Application Scenarios and My Experiences
&lt;/h2&gt;

&lt;p&gt;The practical applications of MCP are quite broad, and I have personally experienced the benefits of this standard in many different projects. Here are some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-Model Agent Architectures:&lt;/strong&gt; The most common scenario I encountered was combining different AI models to create more complex "agents." In a manufacturing ERP, an AI agent I developed for operator screens first detects product defects on the production line using an image processing model. Then, it sends this defect data to an LLM to query potential causes and solution suggestions. Finally, it combines the outputs from the LLM with a time series model to predict the impact of these defects on production efficiency. Thanks to MCP, these three different models can exchange data seamlessly. If I had done this integration without MCP, I would have had to write a separate adapter layer for each model's specific API, which would have increased the project's cost and complexity by 40%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic Model Swapping:&lt;/strong&gt; Sometimes, there is a need for multiple AI models that perform the same task with different performance/cost trade-offs. For example, I might want to use a more cost-effective model during non-critical hours, while switching to a faster and more accurate but expensive model during peak hours. MCP facilitates this hot-swapping because all models present the same interface. I frequently use this strategy in the AI-powered content generation for my own website. During busy daytime hours, I prefer fast models like Groq or Cerebras, while at night, I use more cost-effective, slower but still high-quality output-producing models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RAG (Retrieval-Augmented Generation) Systems:&lt;/strong&gt; In a RAG architecture, an LLM is provided with information retrieved from an external knowledge source (database, documents, etc.) to generate more accurate and up-to-date answers. MCP standardizes the communication between these external retrieval services and the LLM. In the RAG system I integrated into my own knowledge base, retrieval services fetching information from different data sources (PostgreSQL, Redis cache, and even data from my anonymous Turkey data platform) were easily integrated with the LLM thanks to MCP-compliant APIs. As a result, the LLM's hallucination rate decreased by 20%, and the quality of answers significantly improved.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Integration Challenges and Solutions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While MCP simplifies integration, semantically interpreting model outputs remains a significant challenge. For example, one model might return "customer_id" while another returns "user_identifier." For such semantic incompatibilities, a lightweight transformation layer may still be necessary. However, MCP greatly simplifies the process by standardizing the point of transformation and the way data is transported.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  MCP's Trade-offs and Future
&lt;/h2&gt;

&lt;p&gt;Like any technology, MCP comes with some trade-offs. The most prominent is the introduction of an additional layer of abstraction. This can create a very small performance overhead, which might be noticeable for some specific situations requiring ultra-low latency. However, in my experience, this overhead is generally negligible compared to the gains in integration ease and development speed. For example, in an Nginx reverse proxy architecture handling thousands of requests per second, the additional latency introduced by MCP remained in the order of tenths of milliseconds and did not affect overall system performance.&lt;/p&gt;

&lt;p&gt;Another trade-off is the initial setup cost. Converting existing, non-MCP compliant systems or building a new MCP-based infrastructure can initially require some time and effort. However, this investment pays off handsomely in the long run with increased ease of maintenance, flexibility, and speed in integrating new AI models. In a client project, by building an MCP-compliant architecture from the outset, we managed to reduce the integration time for 4 different AI models added over the next 6 months from a total of 2 weeks to 3 days.&lt;/p&gt;

&lt;p&gt;I anticipate that MCP's role in the AI ecosystem will grow even further in the future. Especially in areas such as federated learning, edge AI, and AI security layers, MCP's standardized communication capability will become critical. In my Android spam blocker application, I am evaluating MCP's potential for small AI models running on the device to communicate securely and in a standardized way with larger models in the cloud. Furthermore, MCP's role in AI model &lt;code&gt;trust&lt;/code&gt; and &lt;code&gt;provenance&lt;/code&gt; (data origin) will also increase. MCP's extended metadata standards will begin to be used to track which model processed which data with which parameters. This will also be an important step for AI ethics and transparency.&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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEQ7CiAgICBBWyJEaWZmZXJlbnQgQUkgTW9kZWxzIl0gLS0gIkluY29tcGF0aWJsZSBBUElzIiAtLT4gQlsiSW50ZWdyYXRpb24gRGlmZmljdWx0eSJdOwogICAgQiAtLSAiSGlnaCBEZXZlbG9wbWVudCBDb3N0IiAtLT4gQ1siU2xvdyBJbm5vdmF0aW9uIl07CiAgICBDIC0tICJMaW1pdGVkIFNjYWxhYmlsaXR5IiAtLT4gRFsiRGVwZW5kZW5jeSBvbiBTaW5nbGUgQUkgTW9kZWwiXTsKCiAgICBzdWJncmFwaCBNQ1BzX1NvbHV0aW9uWyJNQ1BzIFNvbHV0aW9uIl0KICAgICAgICBFWyJNQ1AgU3RhbmRhcmQiXSAtLSAiQ29tbW9uIERhdGEgRm9ybWF0IiAtLT4gRlsiRWFzeSBJbnRlZ3JhdGlvbiJdOwogICAgICAgIEUgLS0gIlNlcnZpY2UgRGlzY292ZXJ5IiAtLT4gR1siRHluYW1pYyBJbnRlZ3JhdGlvbiJdOwogICAgICAgIEUgLS0gIlNlY3VyaXR5IFByb3RvY29scyIgLS0-IEhbIlNlY3VyZSBDb21tdW5pY2F0aW9uIl07CiAgICBlbmQKCiAgICBGIC0tPiBJWyJGYXN0IERldmVsb3BtZW50Il07CiAgICBHIC0tPiBKWyJGbGV4aWJsZSBTY2FsYWJpbGl0eSJdOwogICAgSCAtLT4gS1siTXVsdGktQUkgTW9kZWwgVXNhZ2UiXTsKCiAgICBJICYgSiAmIEsgLS0-IExbIkFkdmFuY2VkIEFJIEFwcGxpY2F0aW9ucyJdOw%3Ftype%3Dpng%26bgColor%3Dwhite" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEQ7CiAgICBBWyJEaWZmZXJlbnQgQUkgTW9kZWxzIl0gLS0gIkluY29tcGF0aWJsZSBBUElzIiAtLT4gQlsiSW50ZWdyYXRpb24gRGlmZmljdWx0eSJdOwogICAgQiAtLSAiSGlnaCBEZXZlbG9wbWVudCBDb3N0IiAtLT4gQ1siU2xvdyBJbm5vdmF0aW9uIl07CiAgICBDIC0tICJMaW1pdGVkIFNjYWxhYmlsaXR5IiAtLT4gRFsiRGVwZW5kZW5jeSBvbiBTaW5nbGUgQUkgTW9kZWwiXTsKCiAgICBzdWJncmFwaCBNQ1BzX1NvbHV0aW9uWyJNQ1BzIFNvbHV0aW9uIl0KICAgICAgICBFWyJNQ1AgU3RhbmRhcmQiXSAtLSAiQ29tbW9uIERhdGEgRm9ybWF0IiAtLT4gRlsiRWFzeSBJbnRlZ3JhdGlvbiJdOwogICAgICAgIEUgLS0gIlNlcnZpY2UgRGlzY292ZXJ5IiAtLT4gR1siRHluYW1pYyBJbnRlZ3JhdGlvbiJdOwogICAgICAgIEUgLS0gIlNlY3VyaXR5IFByb3RvY29scyIgLS0-IEhbIlNlY3VyZSBDb21tdW5pY2F0aW9uIl07CiAgICBlbmQKCiAgICBGIC0tPiBJWyJGYXN0IERldmVsb3BtZW50Il07CiAgICBHIC0tPiBKWyJGbGV4aWJsZSBTY2FsYWJpbGl0eSJdOwogICAgSCAtLT4gS1siTXVsdGktQUkgTW9kZWwgVXNhZ2UiXTsKCiAgICBJICYgSiAmIEsgLS0-IExbIkFkdmFuY2VkIEFJIEFwcGxpY2F0aW9ucyJdOw%3Ftype%3Dpng%26bgColor%3Dwhite" alt="MCP integration before and after" width="1057" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This diagram simply summarizes the complexity of AI integration before MCP and how MCP provides solutions to these problems.&lt;/p&gt;

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

&lt;p&gt;MCP (Microservice Communication Protocol) has emerged as a critical standard in 2026, addressing the fragmentation in the AI world and enabling different AI models and services to work together harmoniously. Just as USB-C unified electronic devices, MCP brings AI components together, accelerating development processes, reducing integration costs, and paving the way for more complex, hybrid AI applications. As I've seen in many projects, from manufacturing ERPs to my own side products, the flexibility and efficiency provided by this standard form an indispensable foundation for the widespread adoption of AI in both enterprise and individual applications. When designing AI systems in the future, considering MCP compliance will both reduce technical debt and increase the pace of innovation.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>microservices</category>
    </item>
    <item>
      <title>From Fake SMS to e-Devlet Trap: Most Used in Turkey in 2026</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Wed, 17 Jun 2026 04:42:39 +0000</pubDate>
      <link>https://dev.to/merbayerp/from-fake-sms-to-e-devlet-trap-most-used-in-turkey-in-2026-2ka7</link>
      <guid>https://dev.to/merbayerp/from-fake-sms-to-e-devlet-trap-most-used-in-turkey-in-2026-2ka7</guid>
      <description>&lt;p&gt;As we enter 2026, digital scam methods in Turkey have become increasingly sophisticated. Especially fake SMS messages and phishing links targeting e-Devlet are among the most common traps used to obtain citizens' personal and financial information. Such scams can lead not only to financial losses but also to serious data breaches and personal security vulnerabilities.&lt;/p&gt;

&lt;p&gt;I have been working in system and network security for over twenty years; I have experienced many technical details, from kernel module blacklists to fail2ban patterns, from switch hardening to ZTNA architectures. However, even the most robust firewalls often fall short against social engineering attacks targeting the human factor. In this article, I will explain the most common scam scenarios in Turkey in 2026, how to recognize them, and how to protect ourselves, based on my own experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is the e-Devlet Trap So Widespread in 2026?
&lt;/h2&gt;

&lt;p&gt;The e-Devlet trap has become one of the most common scam methods in Turkey in 2026 because e-Devlet is perceived as a central and reliable platform that allows citizens to perform all their government transactions through a single portal. This perception offers a great opportunity for scammers to create a false sense of "authorization" and convince victims. Although users' digital literacy levels vary, the official image of e-Devlet leaves a strong impression on everyone.&lt;/p&gt;

&lt;p&gt;A friend of mine, despite being a network engineer at a large technology company, almost fell for a fake SMS that read, "You have an SGK premium debt, click for details: &lt;code&gt;bit.ly/sgk-borc&lt;/code&gt;". He realized how short and untrustworthy the link looked at the last moment. This incident showed me that not only end-users but even tech-savvy individuals can fall for such traps. Scammers usually target basic human emotions such as fear, curiosity, or urgency by using the names of official institutions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ The Role of e-Devlet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;e-Devlet is one of the most important platforms in Turkey's digital transformation, allowing citizens to perform government-related transactions through a single portal. This centralization offers a great opportunity for scammers to create a false sense of "authorization".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These attacks typically aim to steal critical information such as Turkish ID numbers and e-Devlet passwords by redirecting the user to a fake e-Devlet login page. Fake SMS messages often contain texts like "Enforcement proceedings have been initiated against you," "Your title deed transfer transaction is awaiting approval," or "Your test result from the Ministry of Health." These texts are designed to encourage people to click the link quickly. Although the technical infrastructure behind such SMS messages is often simple, the social engineering aspect is extremely complex.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Recognize Fake SMS and Phishing Links?
&lt;/h2&gt;

&lt;p&gt;Fake SMS messages and phishing links usually have distinct characteristics; recognizing them can prevent you from falling into the trap in the initial stage of the scam. Creating a sense of urgency, typos, and using unofficial, shortened, or suspicious URLs are common tactics employed by scammers. These messages are specifically designed to make you react quickly and act without thinking.&lt;/p&gt;

&lt;p&gt;I've seen thousands of examples in my Android spam blocker app. Scammers constantly change themes like "package delivery delayed," "your bank account has been suspended," "you have a tax debt." The common feature of these messages is to somehow stress you out and make you click the link. No official institution, e-Devlet, or bank will send you an SMS directly asking for personal information or a "click here" link. I always approach such situations with suspicion.&lt;/p&gt;

&lt;p&gt;The table below summarizes the key differences between real and fake SMS messages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Real/Official SMS&lt;/th&gt;
&lt;th&gt;Fake/Phishing SMS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sender Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usually a corporate name (e.g., e-Devlet, SGK, Your Bank)&lt;/td&gt;
&lt;td&gt;Personal number, unknown number, or a name mimicking a corporate name (e.g., EDEVLET, SGSK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Urgency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rarely emphasizes urgency, for informational purposes&lt;/td&gt;
&lt;td&gt;Urgent phrases like "Immediately", "Last Day", "Your Account Will Be Closed"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spelling/Grammar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Error-free, professional language&lt;/td&gt;
&lt;td&gt;Spelling and grammar errors, awkward sentences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;URL Structure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Official institution's main domain (e.g., &lt;code&gt;turkiye.gov.tr&lt;/code&gt;, &lt;code&gt;bankaadi.com.tr&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Shortened URLs (bit.ly, tinyurl), meaningless domains, misspelled official domains (e.g., &lt;code&gt;turkiye-gov.net&lt;/code&gt;, &lt;code&gt;e-devletim.org&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Personalization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;May be specific to your name or Turkish ID number&lt;/td&gt;
&lt;td&gt;Generally generic phrases ("Dear citizen")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Information Request&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does not ask for personal information or password via SMS&lt;/td&gt;
&lt;td&gt;Requests personal information, password, card number&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Be Questioning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you receive an unexpected message or email, your first reaction should be suspicion. Carefully examine the sender's identity, the content of the message, and especially the links. Institutions like e-Devlet or banks will never send you a link via SMS asking for information.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This type of attack is actually a kind of "social engineering" attack; just like trying to trick a user into giving up their password instead of finding a weak password for a system. Manipulating the user in some way to convince them to bypass their own security layers is a favorite method of scammers. That's why you always need to be suspicious of the sender, the link, and the logic of the content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Technical Operation of Phishing Sites?
&lt;/h2&gt;

&lt;p&gt;Phishing sites are web pages designed to steal user information by mimicking a legitimate site, usually consisting of simple HTML/CSS and a backend script. These sites look exactly like a copy of an official bank or e-Devlet portal. However, their main purpose is to steal your login credentials, credit card numbers, or other sensitive data. There is no complex infrastructure behind these sites; they usually run with a few PHP or Python scripts.&lt;/p&gt;

&lt;p&gt;Scammers usually place these fake sites on domain names that look trustworthy but are actually completely different. For example, instead of &lt;code&gt;turkiye.gov.tr&lt;/code&gt;, they might use names like &lt;code&gt;turkiye-gov.net&lt;/code&gt; or &lt;code&gt;e-devletim.org&lt;/code&gt;. This is a tactic known as "domain squatting" or "typosquatting"; it aims to exploit small errors users might make when quickly reading or typing a URL. In the backend, a small script simply saves the entered data to a file or sends it to an email address.&lt;/p&gt;

&lt;p&gt;In one of my side products, I constantly worked on rate limiting, JWT (JSON Web Token), and OAuth2 patterns to ensure user security. Phishing sites attack directly at the user, from outside these technical security layers; meaning the vulnerability is not in the system, but in the user themselves. Even there, I had set up IP-based limits or abnormal behavior detection mechanisms to detect fake login attempts. This was also a kind of continuous cat-and-mouse game.&lt;/p&gt;

&lt;p&gt;A simple phishing form might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Example of a fake e-Devlet login page HTML form --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"http://scammer-site.com/login.php"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"tcKimlik"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;T.C. Identity No:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"tcKimlik"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"tcKimlik"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"eDevletSifre"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;e-Devlet Password:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"eDevletSifre"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"eDevletSifre"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Log In&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the user clicks the &lt;code&gt;Log In&lt;/code&gt; button, this HTML form sends the entered &lt;code&gt;tcKimlik&lt;/code&gt; and &lt;code&gt;eDevletSifre&lt;/code&gt; information to &lt;code&gt;http://scammer-site.com/login.php&lt;/code&gt; via a POST request. A simple PHP script named &lt;code&gt;login.php&lt;/code&gt; then receives this information, saves it to a file, and perhaps redirects the user to the real e-Devlet site, so the victim suspects nothing. Similarly, just as we use &lt;code&gt;fail2ban&lt;/code&gt; to track incorrect password entries and ban the IP during an SSH login attempt, there should also be mechanisms on such sites that can detect erroneous user behavior (entering a password on a fake site). However, this is unfortunately a matter of user awareness.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 Do Not Copy the URL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you clicked a phishing link and were redirected to a fake site, do not copy that URL and share it with others. This helps spread the scam. Instead, access the site by typing the correct address (like &lt;code&gt;turkiye.gov.tr&lt;/code&gt;) yourself into your browser's address bar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Steps Can We Take to Increase Account Security?
&lt;/h2&gt;

&lt;p&gt;The steps we can take to increase account security are the most fundamental way to strengthen our personal fortress in the digital world. Two-factor authentication (2FA), using different and strong passwords for each account, and ensuring device security are the main strategies that will protect us against scams. These steps are the most basic principles of cybersecurity and are vital not only for technical systems but also for individual users.&lt;/p&gt;

&lt;p&gt;While working on an internal platform for a bank, I saw that the biggest security vulnerability for users was weak or reused passwords. When a user's password was compromised, all other accounts using the same password were also at risk. That's why I enforce 2FA on my own systems; I even use 2FA for SSH (Secure Shell) on my own VPS. This simple precaution makes unauthorized access to your account much more difficult, even if your password is stolen.&lt;/p&gt;

&lt;p&gt;Here are practical steps you can take to increase your account security:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Use Two-Factor Authentication (2FA):&lt;/strong&gt; Activate 2FA on all your important accounts (bank, e-Devlet, email, social media). Prefer Authenticator apps (Google Authenticator, Authy, Microsoft Authenticator) over SMS-based 2FA. SMS is less secure due to SIM card scams (SIM-swapping).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Set Strong and Different Passwords:&lt;/strong&gt; Use unique, long, and complex passwords for each platform. Password managers (KeePass, Bitwarden, 1Password) lighten this load and help you store your passwords securely. Dealing with the "Forgot password" feature is much easier than trying to recover a stolen account.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Keep Your Devices Updated:&lt;/strong&gt; Regularly update your operating system (Windows, macOS, Android, iOS) and all applications you use. Security patches close known security vulnerabilities, protecting your devices from potential attacks. Even on Linux, I regularly follow kernel updates, and this also applies to mobile devices.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Use Reliable Antivirus/Antimalware Software:&lt;/strong&gt; Have reliable antivirus or antimalware software on your computer and phone and perform regular scans. This software helps you detect and remove malicious software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These steps apply to both technically knowledgeable users and general users. Remember, digital security is a process, not a one-time operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developing Psychological Resilience Against Phishing Attacks
&lt;/h2&gt;

&lt;p&gt;Developing psychological resilience against phishing attacks is as important as technical measures; because scammers often aim to trigger basic human emotions such as urgency, fear, or curiosity to make you make quick and thoughtless decisions. Recognizing this emotional manipulation and questioning the intent behind the message is key to not falling into the trap. Even the most advanced firewalls cannot prevent a user from voluntarily entering information on a fake site.&lt;/p&gt;

&lt;p&gt;While developing enterprise software, I saw how important user training was. Even when designing operator screens in ERP systems, I tried to design simple and understandable interfaces, taking into account factors such as user fatigue and distraction. But with phishing, the situation is different; here, a malicious party targets the user's weak moments. That's why we have to invest in the human factor and raise awareness as much as in technical solutions.&lt;/p&gt;

&lt;p&gt;For example, an SMS like "Urgent! Your bank account has been suspended, update it immediately via this link: &lt;code&gt;banka-destek.net&lt;/code&gt;" aims to create panic and make you click the link. Similarly, in an ERP of a manufacturing company, the late shipment report was always incomplete. It took three days to find the reason: an operator had clicked on a fake "system update" email they received and infected their system with malware. This was a concrete example showing that technical knowledge is not always enough.&lt;/p&gt;

</description>
      <category>security</category>
      <category>learning</category>
      <category>uretkenlik</category>
    </item>
    <item>
      <title>No Longer a Bricklayer, You're the Foreman: The Quiet Evolution</title>
      <dc:creator>Mustafa ERBAY</dc:creator>
      <pubDate>Wed, 17 Jun 2026 02:09:29 +0000</pubDate>
      <link>https://dev.to/merbayerp/no-longer-a-bricklayer-youre-the-foreman-the-quiet-evolution-37n5</link>
      <guid>https://dev.to/merbayerp/no-longer-a-bricklayer-youre-the-foreman-the-quiet-evolution-37n5</guid>
      <description>&lt;p&gt;One of the biggest changes I've seen in the industry over the last twenty years is the evolution of the developer from a "bricklayer" to a "foreman." It's no longer enough to just write code or finish a specific feature; we now have to understand the entire system, business workflows, and even organizational dynamics. This shift places more responsibility on us but also offers a greater sphere of influence.&lt;br&gt;
Today, in the modern software development environment, when designing a feature, I need to consider not only its technical implementation but also which business process it will accelerate, which department it will simplify life for, and how it will affect the system's overall performance or security. While I used to just write code and be done with it, now I act almost like an architect or a consultant. For someone like me, who has spent many years in the field, this is both a challenging and exciting transformation.&lt;/p&gt;
&lt;h2&gt;
  
  
  What We Used to Do? (Laying Bricks and Our Focus)
&lt;/h2&gt;

&lt;p&gt;Twenty years ago, my primary job as a developer was to write code according to the specs given to me. My focus was generally on ensuring a specific module or function worked correctly. When working on a manufacturing ERP, for instance, I was busy optimizing the performance of a report in the warehouse inbound-outbound module. There, reducing a 2000-line SQL query from 30 seconds to 3 seconds was the most important event of my day.&lt;br&gt;
Back then, I didn't think much about the overall architecture of the system or its interactions with other modules. When I encountered an N+1 problem, I would just optimize the current query; I didn't really consider that this error might occur elsewhere in the system or stem from a more fundamental architectural issue. For me, "laying bricks"—that is, writing and testing code—was a big part of my job. At that time, issues like a PostgreSQL server experiencing WAL bloat or what Redis's OOM eviction policy meant were typically the responsibility of system administrators. However, these boundaries have blurred over time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ A Point I Gained Experience In&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once, on a client project, I noticed a report was running slowly. The problem was a complex SQL query with multiple JOINs, running a separate subquery for each row. When I realized this was an N+1 problem, I didn't just fix the query and optimize the &lt;code&gt;LEFT JOIN&lt;/code&gt;s; I also learned how to use the ORM's &lt;code&gt;eager loading&lt;/code&gt; feature. This gave me not just a bug fix but also broader knowledge of ORM optimization.&lt;/p&gt;
&lt;h2&gt;
  
  
  Automation and AI: Not Our Screwdrivers, But Construction Machines
&lt;/h2&gt;

&lt;p&gt;Today, automation and especially artificial intelligence (AI) tools have fundamentally changed how we work. We can now leave tedious and repetitive tasks to machines. Thanks to CI/CD pipelines, automated tests, and infrastructure as code (IaC), I've reduced the deployment process of an application from hours to minutes. At one point, while setting up the CI/CD pipeline for my own side product, I was tired of manually SSHing into the server and running the deploy script every time. Then I automated it with GitLab CI/CD, and the reliability of deployments increased by 90%.&lt;br&gt;
With the advent of AI, our code writing time has also decreased. In my own projects, I get code snippets, and sometimes even entire functions, from AI using prompt engineering techniques. This saves me more time, and I can dedicate this time to higher-level issues such as system architecture, integration of different components, and improvement of workflows. When designing an AI-powered operations pipeline, bringing together different providers like Groq and Gemini Flash and managing latency and cost trade-offs has become more important to me than writing code.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# A simple FastAPI endpoint example, can be generated with AI but its architecture is our job
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTTPException&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Price cannot be negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Database saving or other business logic goes here
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Item created successfully&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Foreman Mindset: Holistic View and System Architecture
&lt;/h2&gt;

&lt;p&gt;The foreman mindset requires thinking about how the entire building will stand, rather than just placing a single brick correctly. As a developer, when developing a feature, I now have to consider how it will interact with other modules in the system, which database tables it will affect, and even what kind of load it will create at the network layer. When I worked on a manufacturing ERP, I didn't just think about UI/UX when designing an operator screen. I also planned which sensor data that screen would pull, how it would integrate with the production planning engine, and how it would reflect in the supply chain with iSCSI integration.&lt;br&gt;
This also includes making big decisions like Monolith vs. Microservice architecture choices. In one project, we decided to start with a monolith for a quick MVP, then convert critical modules to microservices. This decision was entirely based on trade-offs between cost, development speed, and scalability. When implementing event-sourcing and CQRS patterns, I designed how we would use the transaction outbox pattern to ensure idempotency. Such decisions are no longer just for architects but also for experienced developers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ The Cost of Architectural Decisions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On a client project, we underestimated the cost of starting with a microservice architecture from the beginning. Initially, development speed was slow because each service had its own deployment, its own database schema, and its own CI/CD. This situation can create "overhead," especially in small teams. Over time, we solved these problems with automation, but this process cost us significant time and resources in the initial phase. The transition from monolith to microservice also has its own challenges, especially regarding data migration and managing eventual consistency.&lt;/p&gt;
&lt;h2&gt;
  
  
  Understanding Workflow: Organization Before Code
&lt;/h2&gt;

&lt;p&gt;I've experienced that software architecture is often a reflection of organizational flow. Not just writing code, but understanding business processes and organizational structure is key to producing the right solutions. In a manufacturing company's ERP, delayed shipment reports were consistently erroneous. At first, I looked for an error in database queries or code, but the root cause was somewhere else entirely. Warehouse employees were manually entering shipment information into the system with a certain delay. The problem wasn't in the software, but in the workflow.&lt;br&gt;
In this situation, my role wasn't just to fix the code, but also to talk to the warehouse operations team and design a new integration to automate the process. This included IFRS integrations or supply chain optimizations. A developer now needs to think like a "business analyst," and sometimes even act like an "organizational consultant." Going beyond code to understand and solve real-world problems is an integral part of our job today.&lt;/p&gt;
&lt;/blockquote&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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEQKICAgIEFbIkRlbGF5ZWQgU2hpcG1lbnQgUmVwb3J0IEVycm9uZW91cyJdIC0tPiBCeyJDb2RlL0RCIEVycm9yPyJ9CiAgICBCIC0tIE5vIC0tPiBDWyJXYXJlaG91c2UgT3BlcmF0aW9ucyBFeGFtaW5lZCJdCiAgICBDIC0tPiBEWyJNYW51YWwgRGF0YSBFbnRyeSBEZWxheSBEZXRlY3RlZCJdCiAgICBEIC0tPiBFWyJBdXRvbWF0aW9uIE5lZWQgSWRlbnRpZmllZCJdCiAgICBFIC0tPiBGWyJOZXcgSW50ZWdyYXRpb24gRGVzaWduIChBUEkvTVEpIl0KICAgIEYgLS0-IEdbIlByb2Nlc3MgSW1wcm92ZW1lbnQgd2l0aCBXYXJlaG91c2UgVGVhbSJdCiAgICBHIC0tPiBIWyJSZXBvcnQgQWNjdXJhY3kgSW5jcmVhc2VkIl0KICAgIEIgLS0gWWVzIC0tPiBJWyJDb2RlL0RCIE9wdGltaXplZCJd%3Ftype%3Dpng%26bgColor%3D0d1117" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEQKICAgIEFbIkRlbGF5ZWQgU2hpcG1lbnQgUmVwb3J0IEVycm9uZW91cyJdIC0tPiBCeyJDb2RlL0RCIEVycm9yPyJ9CiAgICBCIC0tIE5vIC0tPiBDWyJXYXJlaG91c2UgT3BlcmF0aW9ucyBFeGFtaW5lZCJdCiAgICBDIC0tPiBEWyJNYW51YWwgRGF0YSBFbnRyeSBEZWxheSBEZXRlY3RlZCJdCiAgICBEIC0tPiBFWyJBdXRvbWF0aW9uIE5lZWQgSWRlbnRpZmllZCJdCiAgICBFIC0tPiBGWyJOZXcgSW50ZWdyYXRpb24gRGVzaWduIChBUEkvTVEpIl0KICAgIEYgLS0-IEdbIlByb2Nlc3MgSW1wcm92ZW1lbnQgd2l0aCBXYXJlaG91c2UgVGVhbSJdCiAgICBHIC0tPiBIWyJSZXBvcnQgQWNjdXJhY3kgSW5jcmVhc2VkIl0KICAgIEIgLS0gWWVzIC0tPiBJWyJDb2RlL0RCIE9wdGltaXplZCJd%3Ftype%3Dpng%26bgColor%3D0d1117" alt="Shipment report debugging flow" width="527" height="1056"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Security and Operations: The Strength and Maintenance of Walls
&lt;/h2&gt;

&lt;p&gt;In the past, security and operational tasks were typically the responsibility of separate teams. I would just write the code, and system administrators or security specialists would handle the rest. However, in today's world, this distinction has disappeared. Now I also have to consider the security of the code I write and the operational health of the application. Issues like a kernel module blacklist (e.g., security vulnerabilities like CVE-2026-31431 for algif_aead), fail2ban patterns, or SELinux profiles are no longer just for system administrators, but also things I need to follow.&lt;br&gt;
Last month, I saw a container OOM-killed with a &lt;code&gt;sleep 360&lt;/code&gt; command because the cgroup memory.high limit was not set correctly. This was a simple error but caused application downtime. I then switched to a polling-wait mechanism to solve this problem. I closely follow issues like WAL bloat in PostgreSQL or OOM eviction policies in Redis because these situations directly affect the performance and stability of my application. Therefore, I need to manage not only the functionality of the code I write but also its systemd units, journald logs, and cgroup limits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Command to check memory limits on a system&lt;/span&gt;
&lt;span class="c"&gt;# This is critical for understanding memory usage of containers or services.&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/memory/memory.max
&lt;span class="c"&gt;# Configuring journald rate limits is important to prevent log spam.&lt;/span&gt;
&lt;span class="c"&gt;# Configured in /etc/systemd/journald.conf.&lt;/span&gt;
&lt;span class="c"&gt;# RateLimitIntervalSec=30s&lt;/span&gt;
&lt;span class="c"&gt;# RateLimitBurst=1000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Developer of the Future: From Engineering to Orchestration
&lt;/h2&gt;

&lt;p&gt;The developer of the future is no longer just an engineer but also an orchestra conductor. While our ability to write code is still fundamental, our true value now lies in our ability to bring together different systems, technologies, and people. Problem-solving, design, integration, and communication skills have become as important as our technical abilities. I remember how I brought together different AI providers (Gemini Flash, Groq, Cerebras) via OpenRouter in the backend of one of my side products and developed a fallback strategy against potential outages. This was less about just writing code and more about orchestrating different parts of a system.&lt;br&gt;
This transformation necessitates continuous learning and self-improvement. We are not just learning new programming languages or frameworks, but also gaining knowledge in areas such as network security (ZTNA egress control, segmentation), database optimizations (PostgreSQL index strategies, replication), and CI/CD processes. When developing my own Android spam blocker application, integrating native packages with Flutter or managing Play Store publishing processes was more than just a technical task for me; it was a holistic product development experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Continuous Learning and Adaptation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this rapidly changing world, we must constantly keep ourselves updated. Specializing in one area is important, but having general knowledge across different disciplines makes it easier for us to take on the "foreman" role. For me, this covers a wide range, from BGP routing decisions at the network layer to event-sourcing patterns in software, and even agent patterns in AI. This diversity allows me to look at problems I encounter from a broader perspective.&lt;br&gt;
The developer's role is no longer just a "bricklayer" who follows instructions, but a "foreman" who views the project holistically, brings together different areas of expertise, and takes an active role in every stage of the work. This means more responsibility, yes, but it also offers a great opportunity to increase the impact of our work and build more satisfying careers. Those who adapt to this change will remain permanent and valuable in the industry.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>career</category>
      <category>indiehacker</category>
    </item>
  </channel>
</rss>
