<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dvir Segal</title>
    <description>The latest articles on Forem by Dvir Segal (@dejavo).</description>
    <link>https://forem.com/dejavo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F59447%2Fc8a2ea63-31c3-46b8-9f90-ef41497615bf.png</url>
      <title>Forem: Dvir Segal</title>
      <link>https://forem.com/dejavo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dejavo"/>
    <language>en</language>
    <item>
      <title>Connecting LLMs to my debugging flow to fix a memory crash</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Sat, 10 Jan 2026 20:31:30 +0000</pubDate>
      <link>https://forem.com/dejavo/connecting-llms-to-my-debugging-flow-to-fix-a-memory-crash-3nac</link>
      <guid>https://forem.com/dejavo/connecting-llms-to-my-debugging-flow-to-fix-a-memory-crash-3nac</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme3zwmhybdta2764klop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme3zwmhybdta2764klop.png" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every engineer has a “Mystery Case” story. 🔍&lt;/p&gt;

&lt;p&gt;For a long time, mine was a service that would run perfectly for weeks, and then, always at the most unexpected times, would violently consume memory and die.&lt;/p&gt;

&lt;p&gt;I didn’t just ignore it. &lt;strong&gt;I fought it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I analyzed logs, optimized code to reduce allocation pressure, and even claimed a “False Victory” once, deploying a fix I &lt;em&gt;swore&lt;/em&gt; was the root cause. The crash stopped for a week, then came back.&lt;/p&gt;

&lt;p&gt;We kept restarting the system by hand to keep it running, but we didn’t know what was really causing the problem. We tried hard to find out why, but checking things manually wasn’t enough. There was just too much data to look through, which hid the important facts. Trying to piece it together ourselves took way too much time and effort. Because we didn’t have a better tool to help us, we got stuck.&lt;/p&gt;

&lt;p&gt;Recently, I finally solved the case. Not by traditional debugging. I did it by using AI to connect a conversation between my varios “disconnected” tools.&lt;/p&gt;

&lt;p&gt;Here is the breakdown of the investigation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Phase 1: Evidence Gathering (Finding the Needle in the Telemetry Haystack)
&lt;/h4&gt;

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

&lt;p&gt;I exported the raw metric data and treated the AI as a &lt;strong&gt;Pattern Matcher&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My Prompt:&lt;/strong&gt; &lt;em&gt;“Analyze this dataset. Find the exact timestamps where memory allocation spikes &amp;gt; 20% in under 60 seconds.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Result:&lt;/strong&gt; It identified two specific seconds in time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I took those timestamps and asked the AI to generate a targeted query for my log aggregator (which have its own agent). The logs lit up. Every single memory spike aligned perfectly with a specific &lt;strong&gt;“System Refresh Event.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In hindsight, this looks obvious. But in a codebase with millions of lines, “obvious” is a luxury you only get &lt;em&gt;after&lt;/em&gt; you know exactly where to look.&lt;/p&gt;

&lt;h4&gt;
  
  
  Phase 2: The Interrogation (The “Chat-to-Profiler” Bridge)
&lt;/h4&gt;

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

&lt;p&gt;Knowing &lt;em&gt;when&lt;/em&gt; it happened was half the battle. I needed to know &lt;em&gt;what&lt;/em&gt; was exploding.&lt;/p&gt;

&lt;p&gt;The crash was happening deep in our core infrastructure. This wasn’t “bad code”; it was battle-tested bedrock logic that has scaled with us for years, making any modification a high-stakes operation requiring surgical precision.&lt;/p&gt;

&lt;p&gt;In previous attempts, analyzing a production dump meant a deep, manual dive into a memory profiler. While modern profilers are powerful, they still require you to do all the heavy lifting. This time, I used a &lt;a href="https://svnscha.de/posts/ai-meets-windbg/" rel="noopener noreferrer"&gt;&lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;&lt;/a&gt; to turn my profiler into a conversational partner. Instead of hunting through heap snapshots myself, I had a dialogue:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;AI:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;“I detect a high volume of duplicate objects on the heap.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Me:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;“That’s impossible, those should be cached and reused.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;AI:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;“The cache references are unique. They are not being reused.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It wasn’t magic. I had to guide the AI, filtering out hallucinations and refining the context, but it handled the syntax while I focused on the semantics. It pointed me to a race condition I had looked at a dozen times but never truly &lt;em&gt;saw&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Phase 3: The Implementation (Architecting the Cure)
&lt;/h4&gt;

&lt;p&gt;The root cause was a classic “Stampede”: clearing old data before the new data was ready.&lt;/p&gt;

&lt;p&gt;I knew the concept of the fix (a “Relay Race” pattern), but implementing high-concurrency caching logic in a critical subsystem is risky.&lt;/p&gt;

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

&lt;p&gt;I used the AI to &lt;strong&gt;implement the solution&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Prompt:&lt;/strong&gt; &lt;em&gt;“Refactor this cache logic to support a ‘Versioned Handoff’. Ensure thread safety during the swap between Version 1 and Version 2.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Result:&lt;/strong&gt; The AI generated the boilerplate for the atomic swapping mechanism.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I didn’t just copy-paste. I established an &lt;strong&gt;“AI Tribunal”&lt;/strong&gt; (Github Copilot ,running cluade, for logic, Gemini for architecture) and performed a rigorous human code review to ensure the locking mechanism was sound before it ever touched the staging enviroment.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Takeaway
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don’t replace yourself; multiply yourself.&lt;/strong&gt; I used AI to handle the “grunt work” of parsing data and generating boilerplate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrate, don’t just chat.&lt;/strong&gt; Connect your tools. Let the metrics talk to the logs, and let the profiler talk to the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect the “Boring” Solution.&lt;/strong&gt; The fix wasn’t a fancy new framework; it was a simple, boring Relay Race pattern.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The case is finally closed. The fires are out, and production is quiet again, exactly how a well-engineered system should feel&lt;/p&gt;

</description>
      <category>programming</category>
      <category>debugging</category>
      <category>artificialintelligen</category>
      <category>llm</category>
    </item>
    <item>
      <title>The Joy of Negative Code Lines</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Fri, 28 Nov 2025 14:49:52 +0000</pubDate>
      <link>https://forem.com/dejavo/the-joy-of-negative-code-lines-114p</link>
      <guid>https://forem.com/dejavo/the-joy-of-negative-code-lines-114p</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs11rn6nnzqoglfoapj1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs11rn6nnzqoglfoapj1.webp" alt=" " width="720" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  There is a common bias in our industry: the instinct to add.
&lt;/h4&gt;

&lt;p&gt;As developers, when we face a problem, our default reaction is to write a new function or add a new library. It feels like progress. But while code drives value, it also carries a &lt;strong&gt;continuous maintenance cost.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every line you write is a line that must be read by teammates, covered by tests, and secured against vulnerabilities. The most efficient system is the one that delivers maximum value with minimum code.&lt;/p&gt;

&lt;h4&gt;
  
  
  The “Just In Case” Hoarder
&lt;/h4&gt;

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

&lt;p&gt;It is easy to spot the “Fear of Deletion” in a Code Review.&lt;/p&gt;

&lt;p&gt;You see a method that isn’t referenced anymore, but it’s still there. Or maybe it’s commented out. The mindset is: &lt;em&gt;“Better keep it. You know, just in case we need to revert.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This turns your codebase into a digital junk drawer.&lt;/p&gt;

&lt;p&gt;“Zombie Code” — logic that is dead but still present, adds noise. It pollutes “Find Usages” results and confuses the next engineer trying to understand the domain. They waste time analyzing functions that provide no value to the user.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to verify usages
&lt;/h4&gt;

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

&lt;p&gt;The hardest part of deleting code is the fear of breaking something hidden. “Find All References” isn’t enough. Here is how to verify usage safely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Static Check:&lt;/strong&gt; Start with the IDE. If a method is private, the compiler is usually right. If it’s public, be suspicious. Tools like &lt;a href="https://www.ndepend.com/" rel="noopener noreferrer"&gt;NDepend&lt;/a&gt; or &lt;a href="https://www.sonarsource.com/products/sonarqube/" rel="noopener noreferrer"&gt;SonarQube&lt;/a&gt; can often spot "dead branches" that visual inspection misses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The External Audit:&lt;/strong&gt; Check the edges. Are frontend analytics still firing events for that feature? Are HTTP logs showing hits on the old API endpoint? Are cloud metrics showing activity on that specific storage? If the edges are silent, the core is likely dead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Database Audit:&lt;/strong&gt; Sometimes the code looks valid, but the &lt;em&gt;data&lt;/em&gt; is stale. Check your database statistics. If a table hasn’t had an INSERT or UPDATE in two years, the code managing that table is likely ghost-logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The “Scream” Test (Use Metrics):&lt;/strong&gt; If you are unsure about a specific internal method, emit a custom metric: Metrics.Increment("deprecated_feature_x_usage"). If the counter stays at zero for a full business cycle, you have your answer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Data beats intuition.&lt;/strong&gt; If you can prove nobody calls it, you can delete it without sweating.&lt;/p&gt;

&lt;h4&gt;
  
  
  The AI Assistant (Your Cleanup Partner)
&lt;/h4&gt;

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

&lt;p&gt;We are in the age of LLMs, and ignoring them would be a mistake. While you should never let an AI autonomously delete code in production, it is an incredible force multiplier for the verification and cleanup phases.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The “Explain This” Test:&lt;/strong&gt; Paste suspicious legacy code into an AI and ask: &lt;em&gt;“Identify potential side effects if this were removed.”&lt;/em&gt; It often finds hidden dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The “Safety Net” Tests:&lt;/strong&gt; Before deleting complex logic, ask the AI to &lt;em&gt;“Write comprehensive unit tests for this function.”&lt;/em&gt; Having tests that fail &lt;em&gt;after&lt;/em&gt; you delete the code confirms you understand its impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate the “Red PR”:&lt;/strong&gt; Once you identify dead code, ask the AI to do the grunt work: &lt;em&gt;“Refactor this file to remove the unused LegacyProcessor class and all references.”&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remember: AI is a tool for acceleration, not abdication.&lt;/strong&gt; You are still the one clicking “Merge.”&lt;/p&gt;

&lt;h4&gt;
  
  
  The Sunset Strategy (Rollout Plan)
&lt;/h4&gt;

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

&lt;p&gt;Verifying is one thing; deleting is another. You need a safety net.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1: The Warning:&lt;/strong&gt; Don’t rely on quiet runtime logs. Mark code @Obsolete to warn other developers in their IDE, and clearly communicate removal dates in your changelog and team channels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2: The “Soft Delete” (Feature Flag):&lt;/strong&gt; Wrap the entry point in a Feature Flag and &lt;strong&gt;turn it off&lt;/strong&gt;. This is your instant rollback mechanism if a critical user complains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 3: The Observation:&lt;/strong&gt; Keep the flag off for a safe period (e.g., 2 sprints). Ensure you have alerting on that disabled path. Silence is golden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 4: The Code Delete&lt;/strong&gt; Once the observation period has passed with zero alerts and no customer complaints, it is safe to delete the code, the flag, and the tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 5: The Data Cleanup:&lt;/strong&gt; Deleting code often leaves behind orphaned data. Wait a few extra sprints to be absolutely sure, then archive the data to cold storage before finally dropping unused tables or columns. Your schema should reflect reality, not history.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  The Bottom Line
&lt;/h4&gt;

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

&lt;p&gt;There is a unique satisfaction in opening a Pull Request where the &lt;strong&gt;Lines Removed&lt;/strong&gt; count is higher than the &lt;strong&gt;Lines Added&lt;/strong&gt;  — it means you have simplified the mental model without sacrificing functionality. If code isn’t running in production, it is just noise; trust your git history, verify with data, and hit delete.&lt;/p&gt;

</description>
      <category>bestpractices</category>
      <category>softwareengineering</category>
      <category>codequality</category>
      <category>technicaldebt</category>
    </item>
    <item>
      <title>Write boring code</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Sun, 19 May 2024 11:57:14 +0000</pubDate>
      <link>https://forem.com/dejavo/write-boring-code-52b6</link>
      <guid>https://forem.com/dejavo/write-boring-code-52b6</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cl0ovOFb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2Afsa40ezPVX_z0he0" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cl0ovOFb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2Afsa40ezPVX_z0he0" alt="" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Debuggability is highly underrated&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In the words of Brian Kernighan, the famous computer scientist and author of the book “The C Programming Language”:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This quote reflects a common experience many developers face while trying to write "smart" code. They often end up with complex solutions that are hard to maintain and debug. This is a common mistake, driven by the desire to demonstrate skills (and maybe to appear clever).&lt;/p&gt;

&lt;p&gt;So… &lt;strong&gt;just write boring and straightforward code.&lt;/strong&gt; Organize it into small, independent modules with clear interfaces and low coupling. This makes it easier to isolate and debug issues within specific components without being affected by the rest of the system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/dejavo/how-to-organize-a-drawer-the-right-way-1c9o"&gt;How to organize a drawer the right way&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Code is written once but read many times&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Make your code readable and self-documented. This means code that follows good naming conventions, uses descriptive variables and function names, and includes clear comments (if needed).&lt;/p&gt;

&lt;p&gt;When implementing your solution, you must think about how it will be executed. You probably focus on the happy trail, but you should also consider how it will fail and how you will debug it &lt;strong&gt;in production&lt;/strong&gt;. Not doing so results in a mistake that can waste a lot of time and effort looking through complicated code to figure out and fix the problem.&lt;/p&gt;

&lt;p&gt;To address this challenge, one must shift her mindset and prioritize &lt;strong&gt;debuggability&lt;/strong&gt; from the start of the project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsehcp35z0likiq5ii2z5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsehcp35z0likiq5ii2z5.png" alt="_Peter Bourgon — Metrics, tracing, and logging_" width="677" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This means leaving breadcrumbs, also known as &lt;strong&gt;logs&lt;/strong&gt; , storing data in machine-readable format to enable efficient parsing and analysis, capturing valuable information about the application’s state, execution flow, and any errors or exceptions. There are several error-handling mechanisms that catch and report issues as early as possible, making it easier to identify and fix bugs. The logs from the different components and services will be collected into a centralized system for easier aggregation and querying.&lt;/p&gt;

&lt;p&gt;In some cases, logs alone don't give us the complete picture of how a system is doing. It's a good idea to use &lt;strong&gt;metrics&lt;/strong&gt; , which help us understand the system's health, performance, and behavior more completely. I’m a big fan of metrics because they give us a clearer view. You can detect anomalies and track quantities over time. Based on the collected data, you will build monitoring dashboards that provide real-time visibility (and alerting system).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Drpc5AWc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/742/0%2A0DvQ08NqpfI1M8-s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Drpc5AWc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/742/0%2A0DvQ08NqpfI1M8-s.jpg" alt="" width="742" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another tool in the debugability arsenal is &lt;strong&gt;tracing&lt;/strong&gt; , which tracks the flow of “requests” across different services and components, enabling us to visualize and analyze the end-to-end journey of a request and pinpoint bottlenecks or failures.&lt;/p&gt;

&lt;p&gt;Furthermore, investing in administrative tooling that reflects the system's state by exposing APIs or CLIs can greatly enhance debuggability by allowing developers and administrators to interact with the system, query its state, and perform various tasks such as triggering debug modes, capturing snapshots, or executing diagnostic commands.&lt;/p&gt;

&lt;p&gt;Lastly, live debugging tools like &lt;a href="https://www.rookout.com/"&gt;Rookout&lt;/a&gt;, &lt;a href="https://www.datadoghq.com/blog/dynamic-instrumentation-application-logging/"&gt;Datadog&lt;/a&gt;, and &lt;a href="https://lightrun.com/"&gt;Lightrun&lt;/a&gt; allow you to debug code in production without any code changes. This is quite amazing and it is done by incorporating their agent into your code that does dynamic instrumentation. This agent is a bridge between your code and their environment. It monitors the code’s execution and identifies points in the flow (such as function calls or variable assignments), and it does some optimization not to instrument everything based on the learned history of “hot” paths to minimize the performance hit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HbB3ssT1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/640/0%2AjSjE4gU84WiVR3DE" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HbB3ssT1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/640/0%2AjSjE4gU84WiVR3DE" alt="" width="640" height="473"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Simple code works better than complicated code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To conclude, writing boring and straightforward code, combined with various observability techniques, which should be included as early as in the design stage, can significantly enhance your system's debuggability.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>codequality</category>
      <category>softwareengineering</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Building LEGO without instructions</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Wed, 20 Mar 2024 11:34:54 +0000</pubDate>
      <link>https://forem.com/dejavo/building-lego-without-instructions-9on</link>
      <guid>https://forem.com/dejavo/building-lego-without-instructions-9on</guid>
      <description>&lt;p&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6-UiWj5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2Ah0GgifAlWUClQskH" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6-UiWj5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2Ah0GgifAlWUClQskH" width="800" height="531"&gt;&lt;/a&gt;Photo by Matt Hudson on Unsplash

&lt;/p&gt;

&lt;p&gt;A few months ago, we had a hackathon at my work.&lt;br&gt;&lt;br&gt;
At the opening event, one of my colleagues said to me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hackathons are similar to building LEGO model without instructions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It stuck with me. I pondered about it.&lt;/p&gt;

&lt;p&gt;What crossed my mind is that hackathons are playgrounds for software engineers, where creativity is key. Imagine being handed a box of LEGO bricks, and the instructions are taken away; what would you build? Probably, whatever comes to your mind.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SGezRe6f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AzsaS5_zuZy8vzFO_hdTm1Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SGezRe6f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AzsaS5_zuZy8vzFO_hdTm1Q.png" width="800" height="457"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;That’s the magic of hackathons — they push you to think beyond boundaries, innovate, and craft something extraordinary from seemingly random pieces. Just as LEGO bricks offer endless possibilities, hackathons provide a platform for boundless innovation.&lt;/p&gt;

&lt;p&gt;There are no rules; your imagination is the only limit. Without a set path to follow, hackathons encourage participants to explore new territories, experiment with fresh ideas, devise effective and unique solutions, and, along the way, have FUN.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UrHgqA7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AXDiER1FiIiUaCe3A.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UrHgqA7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AXDiER1FiIiUaCe3A.jpg" width="800" height="450"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;You start with an array of tools — technologies, APIs, datasets — and the goal is to create something innovative and functional. This process fosters creative problem-solving and rapid prototyping, crucial skills in the dynamic software development landscape.&lt;/p&gt;

&lt;p&gt;To sum up, hackathons serve as platforms for software engineers to push boundaries, explore new ideas, and work together in diverse teams to create groundbreaking solutions. Ultimately, they encourage a culture of continuous learning and experimentation.&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>softwaredevelopment</category>
      <category>careergrowth</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>TIFU at work: Learn and move on!</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Thu, 25 Jan 2024 22:03:28 +0000</pubDate>
      <link>https://forem.com/dejavo/tifu-at-work-learn-and-move-on-24ea</link>
      <guid>https://forem.com/dejavo/tifu-at-work-learn-and-move-on-24ea</guid>
      <description>&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ATq7SUSVacA7WBNhC" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ATq7SUSVacA7WBNhC"&gt;&lt;/a&gt;Photo by Santa Barbara on Unsplash
 
&lt;/p&gt;

&lt;p&gt;Everyone makes mistakes. If someone says otherwise, they’re probably not being straight with you. It’s bound to happen whether you’re new to a job or have been there for a while. You can find plenty of horror stories on Reddit and HackerNews. Take, for example, this post with a collection of those stories:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=7144934" rel="noopener noreferrer"&gt;Ask HN: What's the worst you've ever screwed up at work? | Hacker News&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I felt that gut-wrenching moment when you realize a mistake has been made. The sinking feeling in your stomach, the twinge of shame, or the self-critical thoughts might flood in.&lt;/p&gt;

&lt;p&gt;But here’s the thing: mistakes are a natural part of the journey, and what matters most is how we navigate and &lt;strong&gt;learn from them&lt;/strong&gt;. In this post, I’ll try to explain why.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2AKx7_DnQ8zKk5FaFicxEyFA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2AKx7_DnQ8zKk5FaFicxEyFA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Acknowledge and Own Up
&lt;/h3&gt;

&lt;p&gt;The first step is crucial — acknowledge the mistake. It’s tempting to sweep it under the rug or pass the blame, but trust me, that only makes things worse. Take responsibility and be brutally honest about what went wrong. Embrace the uncomfortable truth; it’s the only way forward.&lt;/p&gt;

&lt;p&gt;Show that you’re proactive and committed to resolving the issue. Follow up and keep your team updated on your progress. Communicate clearly and frequently until the problem is solved.&lt;/p&gt;

&lt;p&gt;Moreover, in my experience, there’s a hidden gem amid chaos — a chance to observe how people react. It’s like a crash course in understanding your company’s DNA. The way individuals handle mistakes reveals volumes about the organization’s culture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2A7KBOMNWrHE5vun58FJXQ2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2A7KBOMNWrHE5vun58FJXQ2w.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Uncover the Why
&lt;/h3&gt;

&lt;p&gt;Once you’ve owned up to the mistake, dive into detective mode to understand why it happened. Was it a knowledge gap, lack of training, or a hurried decision? This isn’t about pointing fingers but gaining insights.&lt;/p&gt;

&lt;p&gt;Think of it as peeling an onion — layer by layer, get to the core of the issue. Was there a miscommunication or a systemic flaw? I can suggest using the 5 Whys technique. This is how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with the problem statement and ask why it happened&lt;/li&gt;
&lt;li&gt;For each answer, ask why again until you reach the root cause&lt;/li&gt;
&lt;li&gt;Repeat the process for different aspects of the problem until you have a comprehensive picture of the situation.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Understanding the why isn’t just for personal growth; it’s about making your team and organization more resilient.&lt;/p&gt;

&lt;p&gt;By figuring out the root cause, you not only learn from your own slip-ups but also contribute to a shared knowledge base. Keep it simple, grab your metaphorical magnifying glass, and unravel the mysteries behind your mistakes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2AfnW7rCbWR84R7gE1VMGyUQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2AfnW7rCbWR84R7gE1VMGyUQ.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix It, Learn from It
&lt;/h3&gt;

&lt;p&gt;Fixing the mistake is an obvious step, but don’t just gloss over it.&lt;/p&gt;

&lt;p&gt;Don’t just patch the error; analyze it like a Git blame gone rogue. What went wrong? Was it a logic gap, a memory leak, or maybe a sneaky exception lurking in the shadows? Understanding the root cause is the key to unlocking points for future levels.&lt;/p&gt;

&lt;p&gt;If you need a guide on how to start when it you against the issue, I once wrote a post about it:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://dvirsegal.medium.com/a-letter-to-the-lonely-developer-bd0ac22ba714" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A88%3A88%2F2%2A8o_AAJBhaMjwCa18vuScqw.png" alt="Dvir Segal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dvirsegal.medium.com/a-letter-to-the-lonely-developer-bd0ac22ba714" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The lonely developer. Remind myself how to solve (debug) any defect (bug) | Medium&lt;/h2&gt;
      &lt;h3&gt;Dvir Segal ・ &lt;time&gt;Sep 29, 2020&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        dvirsegal.Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Provide a high-level overview of what you did to resolve the issue, and accompany it with your key takeaways. Turning the page without reflecting on the lesson learned is a missed opportunity for personal and professional growth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F480%2F0%2A20N2v7DI1vg4lfY5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F480%2F0%2A20N2v7DI1vg4lfY5.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevent Future Slip-Ups
&lt;/h3&gt;

&lt;p&gt;Now armed with insights, take proactive steps to prevent a repeat performance.&lt;/p&gt;

&lt;p&gt;Knowledge is the ultimate firewall. Invest in training, devour documentation like it’s your favorite Stack Overflow thread, and consider adding unit tests like shields against future regressions, allocating more time for tasks, implementing new processes, or adding logs and metrics for better visibility.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/@dvirsegal/the-power-of-the-unit-tests-73badc0fbf28" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A88%3A88%2F2%2A8o_AAJBhaMjwCa18vuScqw.png" alt="Dvir Segal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/@dvirsegal/the-power-of-the-unit-tests-73badc0fbf28" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Power of Unit Tests: Unicorns and Software Harmony by Dvir Segal | Medium&lt;/h2&gt;
      &lt;h3&gt;Dvir Segal ・ &lt;time&gt;Jun 14, 2023&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Remember, prevention is the ultimate hack to keep bugs at bay.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F503%2F1%2AkmBrqtHw6UU6QV0kIWNVDw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F503%2F1%2AkmBrqtHw6UU6QV0kIWNVDw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflect and Share
&lt;/h3&gt;

&lt;p&gt;Don’t let your hard-earned lessons be solo commits. Take a moment to reflect on the entire experience. Consider what could have been done differently and how you can improve professionally. Conduct a retrospective meeting with your team to discuss the mistake and the lessons learned. Use a structured format, such as the Start-Stop-Continue model, to identify what worked well, what didn’t work well, and what can be improved. Encourage everyone to participate and share their perspectives and suggestions.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://dvirsegal.medium.com/look-into-the-past-improve-the-future-a21fa1fc97d" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A88%3A88%2F2%2A8o_AAJBhaMjwCa18vuScqw.png" alt="Dvir Segal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dvirsegal.medium.com/look-into-the-past-improve-the-future-a21fa1fc97d" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;(Agile) Retro: Look into the past, improve the future | by Dvir Segal  | Medium&lt;/h2&gt;
      &lt;h3&gt;Dvir Segal ・ &lt;time&gt;Oct 30, 2020&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        dvirsegal.Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Document your reflections and share them internally as part of a post-mortem. Transform your learning into collective wisdom, turning it into “stronger” code (and fewer regressions).&lt;/p&gt;

&lt;p&gt;Below is a collection of some examples from very respectful companies:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/danluu" rel="noopener noreferrer"&gt;
        danluu
      &lt;/a&gt; / &lt;a href="https://github.com/danluu/post-mortems" rel="noopener noreferrer"&gt;
        post-mortems
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A collection of postmortems. Sorry for the delay in merging PRs!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;A List of Post-mortems!&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#config-errors" rel="noopener noreferrer"&gt;Config Errors&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#hardwarepower-failures" rel="noopener noreferrer"&gt;Hardware/Power Failures&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#conflicts" rel="noopener noreferrer"&gt;Conflicts&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#time" rel="noopener noreferrer"&gt;Time&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#database" rel="noopener noreferrer"&gt;Database&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#uncategorized" rel="noopener noreferrer"&gt;Uncategorized&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#other-lists-of-postmortems" rel="noopener noreferrer"&gt;Other lists of postmortems&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#analysis" rel="noopener noreferrer"&gt;Analysis&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/danluu/post-mortems#contributors" rel="noopener noreferrer"&gt;Contributors&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Config Errors&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://allegro.tech/2018/08/postmortem-why-allegro-went-down.html" rel="nofollow noopener noreferrer"&gt;Allegro&lt;/a&gt;. E-commerce site went down after a sudden traffic spike caused by a marketing campaign. The outage was caused by a configuration error in cluster resource management which prevented more service instances from starting even though hardware resources were available.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20211006135542/https://blog.cloudflare.com/todays-outage-post-mortem-82515/" rel="nofollow noopener noreferrer"&gt;Cloudflare&lt;/a&gt;. A bad config (router rule) caused all of their edge routers to crash, taking down all of Cloudflare.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20211016040522/https://blog.cloudflare.com/cloudflare-outage-on-july-17-2020/" rel="nofollow noopener noreferrer"&gt;Cloudflare&lt;/a&gt;. During a maintenance of their private backbone network, an engineer made a typo in the Atlanta datacenter network configuration, causing all traffic coming from America and Europe flowing to this only datacenter, crushing it.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20220621124002/https://blog.cloudflare.com/cloudflare-outage-on-june-21-2022/" rel="nofollow noopener noreferrer"&gt;Cloudflare&lt;/a&gt;. An incorrect ordering of the disabled BGP advertised prefixes caused malfunction on 19 datacenters.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20221112015610/https://blog.cloudflare.com/partial-cloudflare-outage-on-october-25-2022/" rel="nofollow noopener noreferrer"&gt;Cloudflare&lt;/a&gt;. A change to our Tiered Cache system caused some requests to fail…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/danluu/post-mortems" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Lastly, embrace the “fail fast, iterate faster” mentality. Treat mistakes as experiments gone sideways, valuable data points in the grand algorithm of your career.&lt;/p&gt;

&lt;h3&gt;
  
  
  In Conclusion
&lt;/h3&gt;

&lt;p&gt;Mistakes are an inevitable part of the developer’s journey, but they are also invaluable learning experiences. Acknowledge, understand, fix, prevent, and reflect — these steps can turn a negative situation into a positive opportunity for growth. Remember, it’s not about avoiding mistakes altogether; it’s about handling them with resilience and turning them into stepping stones on your path to success. After all, everyone makes mistakes — it’s the journey of learning from them that truly matters.&lt;/p&gt;

</description>
      <category>softwareengineerlife</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
      <category>fuckupnights</category>
    </item>
    <item>
      <title>The power of the unit tests</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Wed, 14 Jun 2023 05:52:27 +0000</pubDate>
      <link>https://forem.com/dejavo/the-power-of-the-unit-tests-o8b</link>
      <guid>https://forem.com/dejavo/the-power-of-the-unit-tests-o8b</guid>
      <description>&lt;p&gt;
  &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w9KPYwzl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/800/1%2Amn1PJtkGmmOS8bQO1dS65A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w9KPYwzl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/800/1%2Amn1PJtkGmmOS8bQO1dS65A.png" alt="Unit Tests Image" width="800" height="600"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h5&gt;
  
  
  A humoristic post generated with the help of ChatGPT
&lt;/h5&gt;

&lt;h3&gt;
  
  
  Do you wanna see me test? U wanna see me unit test?
&lt;/h3&gt;

&lt;p&gt;In the world of software development, unit testing is an essential process that ensures our code behaves precisely as we expect. But let’s be honest; unit testing is not the most glamorous part of coding. It’s the backstage crew, the hidden orchestrators behind a great performance. And just like the Eurovision Song Contest, our unit tests must be pitch-perfect to score the highest points in reliability and robustness.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_XdJ4P7J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/512/1%2AIbzGS9De9iWOTDaP80t8bw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_XdJ4P7J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/512/1%2AIbzGS9De9iWOTDaP80t8bw.png" alt="Uni Tess Image" width="512" height="512"&gt;&lt;/a&gt;Uni Tess — The personification of unit tests, a meticulously organized individual by stable diffusion
  
&lt;/p&gt;

&lt;h3&gt;
  
  
  Unit Tests: The Unsung Heroes
&lt;/h3&gt;

&lt;p&gt;Think of your software as a competitor in the contest. The software, like the singer, is the face of the performance, taking center stage and getting the applause. But behind that successful performance, there’s a lot of practice and fine-tuning. That’s where our unit tests come in. These tests, the unsung heroes, ensure that each piece of the code (the lyrics, the melody, the rhythm) works correctly. If the tests pass, it’s time for our code to hit the stage!&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zcMNBcSS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/512/1%2AWiDU9NdY4QgZIrXqzlagWg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zcMNBcSS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/512/1%2AWiDU9NdY4QgZIrXqzlagWg.png" alt="Power of the Unicorn Image" width="512" height="512"&gt;&lt;/a&gt;The power of the unicorn by stable diffusion
  
&lt;/p&gt;

&lt;h3&gt;
  
  
  Embracing the Power of the Unicorn
&lt;/h3&gt;

&lt;p&gt;In “Unicorn,” Noa Kirel sings about harnessing the “power of a unicorn,” symbolizing strength and uniqueness. This can be seen as a metaphor for our unit tests. Each test is unique and powerful in its own way, checking a specific part of our code. Combined, they provide the strength and assurance that our software functions correctly.&lt;/p&gt;

&lt;p&gt;Much like Noa Kirel found her “horn” to embrace and used her experience as a young artist to promote strength and togetherness, we too, as developers, must embrace our unit tests. They may face criticism (usually from developers who think they’re not worth the time), but we know their true value. They promote “coexistence and togetherness” in our code, ensuring that each piece works together harmoniously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hitting the High Notes with Unit Tests
&lt;/h3&gt;

&lt;p&gt;“Unicorn” made it to a 3rd-place, showing that a strong performance and a unique message can indeed score high points. The same applies to unit testing. High-quality, well-thought-out unit tests can help your software reach its highest potential and avoid any sour notes (bugs) during the performance (runtime).&lt;/p&gt;

&lt;p&gt;A well-tested software is like a chart-topping hit; it’s reliable, it’s loved by users, and it’s less likely to crash in the middle of the performance. It may not be a unicorn, but in the software world, it’s pretty close!&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rvMovsJk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/556/0%2A7U_5t6ojoL-hOfKQ" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rvMovsJk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/556/0%2A7U_5t6ojoL-hOfKQ" alt="Encore Image" width="556" height="333"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  The Encore
&lt;/h3&gt;

&lt;p&gt;So, the next time you write unit tests, think of yourself as a Eurovision contestant preparing for a big performance. Each test you write is a line in your song, a step in your dance routine, or a note in your melody. Embrace its power, harness the strength of your tests, and get ready to take the stage.&lt;/p&gt;

&lt;p&gt;And remember, in the grand Eurovision of software development, your unit tests could be the difference between a standing ovation and a silent auditorium. So, let’s hit those high notes, and may the best code win!&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>humor</category>
      <category>unittesting</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Navigating through the job search</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Mon, 10 Apr 2023 19:19:04 +0000</pubDate>
      <link>https://forem.com/dejavo/navigating-through-the-job-search-1ilb</link>
      <guid>https://forem.com/dejavo/navigating-through-the-job-search-1ilb</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dE61mAzh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2ANAAn4CBG-IJAwq4L" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dE61mAzh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2ANAAn4CBG-IJAwq4L" alt="" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Photo by Bjarke Rosenbeck on Unsplash
&lt;/p&gt;

&lt;h4&gt;
  
  
  Essential tips and resources for a successful job hunt
&lt;/h4&gt;

&lt;p&gt;I was laid off from my previous job. It came out of nowhere; I decided to take this change as an opportunity and make the best of it. Luckily, I received incredible support from my connections, and I want to give back by sharing some valuable lessons and resources I’ve gathered along my job search journey.&lt;/p&gt;

&lt;p&gt;This blog post is based on a Twitter (Hebrew) thread I created, detailing my experience and offering practical advice to fellow software engineers (and not only) facing a similar situation.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--SuAm-ji0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pbs.twimg.com/profile_images/1231586401675829248/tVgack-h_normal.jpg" alt="Dvir Segal profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Dvir Segal
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @dvir_segal
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kDgU_xDI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      לפני שבוע וקצת צומצמתי ממקום העבודה כחלק מגל פיטורים גדול. זה הגיע משום מקום.סוג של הלם. אני מבין שפה זה לא לינקדאין (שם כתבתי פוסט חיפוש), אבל אם לרגע אפשר, אז תודה לכל מי שעזר/ה,  אתם מהממים ואתם יודעים מי אתם/ן! &lt;a href="https://twitter.com/hashtag/%D7%A4%D7%99%D7%93%D7%98%D7%A7"&gt;#פידטק&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/%D7%93%D7%91%D7%99%D7%A8%D7%9E%D7%97%D7%A4%D7%A9%D7%A2%D7%91%D7%95%D7%93%D7%94"&gt;#דבירמחפשעבודה&lt;/a&gt; &lt;br&gt;(לא תייגתי, אני לא יודע אם זה מתאים להם/ן)
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      12:15 PM - 04 Feb 2023
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1621844833915502593" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OXOJJiQT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1621844833915502593" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--foTp-unf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1621844833915502593" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SFHqU4bF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Updating Your Resume
&lt;/h3&gt;

&lt;p&gt;First and foremost, updating your resume is crucial. Use guides and resources like the &lt;a href="https://twitter.com/esapir/status/1578276325235855361"&gt;one&lt;/a&gt; shared by &lt;a href="https://medium.com/u/88a502b20409"&gt;Shahar Avigezer&lt;/a&gt; (written by &lt;a href="https://medium.com/u/8dfbcd08c755"&gt;Erik Sapir&lt;/a&gt;) and the &lt;a href="https://twitter.com/rinaarts/status/1445809699056615424"&gt;one&lt;/a&gt; by &lt;a href="https://medium.com/u/f540d518c481"&gt;Rina Artstain&lt;/a&gt; to help you craft a professional and polished resume showcasing your skills and experience. When you finish your resume, the optimal way to submit it is with a referral. But if it is not an option, just run your CV through the &lt;a href="https://medium.com/u/6ee31f7dd897"&gt;CV Compiler&lt;/a&gt; to see how it scores with applicant tracking systems and what needs to be improved (ATS robot)&lt;/p&gt;

&lt;h3&gt;
  
  
  Leveraging Your Online Presence
&lt;/h3&gt;

&lt;p&gt;Consolidate your online activity into a “business card” with links to your LinkedIn, Twitter, and others. This way, you can showcase additional accomplishments and interests that may not fit your resume. It also demonstrates your professionalism and personal brand. A few years ago, I read a post written by &lt;a href="https://medium.com/u/8b9503902484"&gt;Kshitij Singh&lt;/a&gt; on how he created such a landing page, and I followed his guidelines in his repo below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/singhkshitij/My-Landing-Page"&gt;GitHub - singhkshitij/My-Landing-Page: Minimal Portfolio Page Built with React&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dvirsegal.github.io/dvir-segal/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5m2gGjSC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/655/1%2AdZXqH1AC4YwFm7NIw272cg.gif" alt="" width="655" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparing Your Pitch
&lt;/h3&gt;

&lt;p&gt;Before applying for job positions, write a “tell me about yourself” document, as described in the book “&lt;a href="https://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/0984782850"&gt;Cracking the Coding Interview&lt;/a&gt;”. It should cover your current role and academic background (if applicable) and delves into the role’s details. Finally, hobbies — especially those related to the tech world or “unique”- could serve as conversation starters or perhaps break the ice.&lt;/p&gt;

&lt;p&gt;Furthermore, the book suggested focusing on 2–3 challenging projects you’ve worked on. Write down a list of mistakes you’ve made (we all do them), what you had fun doing, and which conflicts you took part in. Eventually, it will assist you in writing phrases in the SAR (Situation, Action, Result) framework to tell a compelling story about your achievements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NjqFYXiK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/640/0%2Ayp2CdD_22mGgr0Qd" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NjqFYXiK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/640/0%2Ayp2CdD_22mGgr0Qd" alt="" width="640" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Organizing Your Job Search
&lt;/h3&gt;

&lt;p&gt;Use tools like &lt;a href="https://medium.com/u/efd97a1c507b"&gt;Notion&lt;/a&gt; to keep track of your job applications and interviews. This will help you stay organized and focused during your search, ensuring you’re on top of each opportunity. I’ve used the following templates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track down the list of job applications:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.notion.so/templates/job-applications"&gt;Notion Template Gallery - Job applications&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A personal CRM to keep all your leads:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.notioneverything.com/templates/simple-crm"&gt;Simple CRM | Notion Everything&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Researching Potential Employers
&lt;/h3&gt;

&lt;p&gt;Before applying for a job, research the company by checking its location, reading investment analysis, and searching for articles on sites like &lt;a href="https://www.geektime.co.il/"&gt;Geektime&lt;/a&gt; and &lt;a href="https://medium.com/u/7cce2f5ab5c4"&gt;Crunchbase&lt;/a&gt;. Search review-based websites like &lt;a href="https://medium.com/u/a39c61f8b573"&gt;Glassdoor&lt;/a&gt; to get an idea of what it’s like to work there. Prepare a list of questions (🙏 &lt;a href="https://medium.com/u/88a502b20409"&gt;Shahar Avigezer&lt;/a&gt;) to ask the recruiter to refine your job search better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What will my day-to-day look like?&lt;/li&gt;
&lt;li&gt;How will I receive tasks? What percentage of meetings will I have per week?&lt;/li&gt;
&lt;li&gt;What is the percentage split between front-end and back-end work? And from whom?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, do some work with yourself to understand better what you’re looking for by asking the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does Work-Life Balance (WLB) mean for me?&lt;/li&gt;
&lt;li&gt;What hybrid work model works best for me, and how?&lt;/li&gt;
&lt;li&gt;What next role do I aspire to take on in the coming years?&lt;/li&gt;
&lt;li&gt;Which programming language or framework do I prefer for front-end and back-end development?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Being well-informed will help you make better decisions and impress potential employers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparing for Interviews
&lt;/h3&gt;

&lt;p&gt;I recommend the following two websites to help you study for code interviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The interview school by &lt;a href="https://medium.com/u/ecef467f0f28"&gt;Adilet Zhaxybay&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://interviews.school/"&gt;Home&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/techinterviewhb"&gt;The tech interview handbook&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.techinterviewhandbook.org/"&gt;Technical Interview Guide for Busy Engineers | Tech Interview Handbook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They offer guides, practice &lt;a href="https://medium.com/u/33f6b9a1a861"&gt;LeetCode&lt;/a&gt; questions, and tips on various aspects of the interview process. Preparation is key to standing out and performing well during interviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  System Design Interviews
&lt;/h3&gt;

&lt;p&gt;Brush up on key topics and watch the system design interviews video series by Sheeran:&lt;/p&gt;

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

&lt;p&gt;Followed by the introductory video on the importance of this type of interview, what they’re looking for in a candidate, breaking down the problem into details, and how to improve in this area by &lt;a href="https://medium.com/u/939f988143af"&gt;Jackson Gabbard (Synthace)&lt;/a&gt;:&lt;/p&gt;

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

&lt;p&gt;Practice solving problems using resources like the Grokking Modern System Design course by &lt;a href="https://medium.com/u/163aa84775f6"&gt;The Educative Team&lt;/a&gt; and tools like &lt;a href="https://excalidraw.com/"&gt;excalidraw&lt;/a&gt;. The more practice you get, the more confident you’ll showcase your skills.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.educative.io/courses/grokking-modern-system-design-interview-for-engineers-managers"&gt;Grokking Modern System Design Interview for Engineers &amp;amp; Managers - Learn Interactively&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note someone uploaded an old version of the course to &lt;a href="https://medium.com/u/8df3bf3c40ae"&gt;GitHub&lt;/a&gt;, which is enough for practicing, though some recent concepts are probably missing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Ducvoccer/Ducvoccer.github.io/tree/main/system-design/docs/grokking-system-design"&gt;Ducvoccer.github.io/system-design/docs/grokking-system-design at main · Ducvoccer/Ducvoccer.github.io&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Negotiating Your Offer
&lt;/h3&gt;

&lt;p&gt;If you receive a job offer, use resources like the &lt;a href="https://docs.google.com/document/d/1ypLmqKALva4KO8qKX0HfESzHEkinjm7edrFw1jAylYU/edit?usp=sharing"&gt;document&lt;/a&gt; by &lt;a href="https://medium.com/u/1e0658cca392"&gt;Aviad Herman&lt;/a&gt;, The Salary and Offer Negotiation Preparation section in the &lt;a href="//www.techinterviewhandbook.org"&gt;Tech Interview Handbook&lt;/a&gt;, and &lt;a href="https://twitter.com/barnashon"&gt;Iftach&lt;/a&gt;Bar’s lecture on salary expectations to help you negotiate a fair package.&lt;/p&gt;

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

&lt;p&gt;If you receive stock options, consult threads(&lt;a href="https://twitter.com/beersehva/status/1416301132478099457"&gt;#1&lt;/a&gt;, &lt;a href="https://twitter.com/boazbe/status/1482029479149060098"&gt;#2&lt;/a&gt;) by @beersehva and &lt;a href="https://medium.com/u/c934e94437e8"&gt;Boaz Berman&lt;/a&gt; and use tools like EquityBee’s calculator to estimate their value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://equitybee.com/employees/my-options-value"&gt;Option Grant Benchmark Tool | EquityBee&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I hope these tips and resources will be helpful to you on your job search journey. Remember that finding a new job can be challenging, but you can turn it into a new opportunity with perseverance, a strong network, and the right tools. Good luck!&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>joboffer</category>
      <category>softwareengineering</category>
      <category>interview</category>
    </item>
    <item>
      <title>Failing fast to increase feedback loops</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Wed, 09 Nov 2022 13:38:47 +0000</pubDate>
      <link>https://forem.com/dejavo/failing-fast-to-increase-feedback-loops-4g8n</link>
      <guid>https://forem.com/dejavo/failing-fast-to-increase-feedback-loops-4g8n</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wRE4ZDzC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AUOFJXh1-g2mb7l5a" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wRE4ZDzC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AUOFJXh1-g2mb7l5a" alt="" width="880" height="1173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Photo by Omar Flores on Unsplash
&lt;/p&gt;

&lt;h4&gt;
  
  
  How we used integration tests to improve confidence in our code
&lt;/h4&gt;

&lt;p&gt;Picture this: your product owner brings you a set of new requirements, and together you review them. After some preparation and initial work, you get your design reviewed and approved by relevant stakeholders. Then, you enter your focus zone and start implementing it. While doing so, you want to gain confidence, so you add tons of unit tests to cover it, manually test it, and refactor your code based on your tests' results until you feel comfortable with the outcome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w67qNbkH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/480/1%2AwxOAnUORtUJbKGD_dJdzYA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w67qNbkH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/480/1%2AwxOAnUORtUJbKGD_dJdzYA.gif" alt="" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But still, you're left wondering, &lt;em&gt;"how do I get to a strong level of confidence in this code?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this post, I'll discuss what I did when faced with the above situation and how my team and I improved the quality of (and our confidence in) our code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integration tests: what are they, and why do them? 🤔
&lt;/h4&gt;

&lt;p&gt;There is a straightforward answer to the second part of the above question: integration tests help ensure &lt;strong&gt;happy customers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Developers take several approaches to test their code to ensure its integrity. Choosing the suitable testing method depends on your context. Nevertheless, some tests are required for every software. These tests are represented as a layer-based model, known as the testing pyramid proposed by &lt;a href="https://www.mountaingoatsoftware.com/blog/the-forgotten-layer-of-the-test-automation-pyramid"&gt;Mike Cohn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Personally, I think the image below (by &lt;a href="https://medium.com/u/5aa6b9976187"&gt;Atlassian&lt;/a&gt;) emphasizes what we would like to achieve when choosing a specific testing approach by following each of the layers of the pyramid.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gx7JMlyP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ALZKkD_2CaNAHjOrhfAvFJw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gx7JMlyP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ALZKkD_2CaNAHjOrhfAvFJw.png" alt="" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
test pyramid
&lt;/p&gt;

&lt;p&gt;Hence, we chose to implement integration tests to answer the question, "Are we building the system right?"&lt;/p&gt;

&lt;p&gt;Why did we choose integration tests? These tests determine whether the parts of the solution work together as expected. Integration tests implementation is relatively easy and can prevent errors that are hard to catch later on. In addition, integration tests help to validate builds faster, reduce the time to ship, avoid human error, adhere to continuous integration (CI) practices, and minimize cost. As a result, everyone is happier in the long run because bugs are detected earlier, and larger problems are avoided. This increases our confidence and results in higher-quality code.&lt;/p&gt;

&lt;h4&gt;
  
  
  How did we build them? 👷🏻‍♀️👷🏻‍♂️
&lt;/h4&gt;

&lt;p&gt;At &lt;a href="https://www.igentify.com/"&gt;Igentify&lt;/a&gt;, our services are deployed as &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; containers. In a nutshell, containers isolate apps from their environment, solving the "it works on my machine" problem. Docker has a powerful &lt;a href="https://docs.docker.com/engine/api/"&gt;API&lt;/a&gt;, which makes it easy to automate its setup and deployment.&lt;/p&gt;

&lt;p&gt;We use the famous &lt;a href="https://www.testcontainers.org/"&gt;Testcontainers&lt;/a&gt; library that provides lightweight, throwaway instances of anything that can run in a container. The Testcontainers library is test-friendly, open-source, and supports &lt;a href="https://github.com/testcontainers"&gt;multiple programming languages&lt;/a&gt;. Since Igentify's services are being deployed as containers, we already have a Dockerfile, and Testcontainers simply create a new temporary image for it on-the-fly.&lt;/p&gt;

&lt;p&gt;Head to &lt;a href="https://www.testcontainers.org/"&gt;testcontainers&lt;/a&gt; website to find out more.&lt;/p&gt;

&lt;p&gt;If you've read this far, you're likely interested in diving into more technical details 🤓&lt;/p&gt;

&lt;p&gt;As an example, if the design of your system is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service A is a container that talks to the "world" using a message broker in the form of &lt;a href="https://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;It gets a message from the RQ_Queue , processes it, requests a pre-signed s3 URL, and stores its result in the bucket using that URL&lt;/li&gt;
&lt;li&gt;When finished, it responds to RS_Queue with the output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JVdQjI6U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AKm1_M5XR5itK-7EH" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JVdQjI6U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AKm1_M5XR5itK-7EH" alt="" width="880" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Service A Design
&lt;/p&gt;

&lt;p&gt;At a high level, the RabbitMQ container is being replaced by TestContainers' &lt;a href="https://www.testcontainers.org/modules/rabbitmq/"&gt;RabbitMQ module&lt;/a&gt;, and its configuration is being filled by Service A context, which is being initiated by &lt;a href="https://www.baeldung.com/spring-boot-testing#integration-testing-with-springboottest"&gt;@SpringBootTest&lt;/a&gt; annotation. The blob service is essentially a web server that gets requests via REST calls. As part of its API, the blob service generates pre-signed URLs for uploading to cloud storage, which in our case, is an AWS S3 bucket.&lt;/p&gt;

&lt;p&gt;So, how can a web server be controlled in a test environment? API mocking. In practice, it means you replace the real implementation with a local web server for your testing purposes. We use a well-known library named WireMock, where you simply mock the various requests and responses, and you are able to instruct storing files directly to your local drive, bypassing the cloud storage. Two birds with one stone.&lt;/p&gt;

&lt;p&gt;Find more information about Wiremock's &lt;a href="https://wiremock.org/"&gt;flexible API mocking&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The final piece of the puzzle is to add a consumer for the RS_Queue to get the response and use JUnit5 to assert the expected output, resulting in a self-contained environment for testing. The input should be meticulously selected to cover success and\or failure scenarios.&lt;/p&gt;

&lt;p&gt;Eventually, the integration test diagram looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ge1EH4lW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AKN5N-dfQWMtdfnc-" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ge1EH4lW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AKN5N-dfQWMtdfnc-" alt="" width="880" height="688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Service A integration tests
&lt;/p&gt;

&lt;p&gt;The last step was incorporating the integration tests into our continuous integration in the &lt;a href="https://www.jenkins.io/"&gt;Jenkins&lt;/a&gt; server. Currently, we run it every build, but in the future, we will trigger it once a branch is merged into the main (current) branch. That will help us gain certainty that we didn't break anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oyo9DOdf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/430/0%2Ah3evkTl-lK7eWbkR.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oyo9DOdf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/430/0%2Ah3evkTl-lK7eWbkR.jpg" alt="" width="430" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
A Jenkins run
&lt;/p&gt;

&lt;h4&gt;
  
  
  Final Thoughts
&lt;/h4&gt;

&lt;p&gt;In this post, we reviewed how we've designed integration tests for our Java Spring Boot application with the help of TestContainers and WireMock libraries. We showed how we could easily interact with actual data while being as close as possible to the product, giving us confidence in our code.&lt;/p&gt;

&lt;p&gt;I believe these libraries bring a lot of immediate value with a rich set of functionalities. I encourage you to give them a try. Overall, integration tests are a crucial part of any software development, as they help to ensure a more robust product, resulting in happier customers.&lt;/p&gt;

&lt;p&gt;We used integration tests while building version 7 of our &lt;a href="http://www.igentify.com"&gt;Igentify digital genetic platform&lt;/a&gt;, which we released last month. We plan to expand the capabilities of these tests in future releases of our software. If you're interested in learning more, &lt;a href="https://info.igentify.com/en/general"&gt;please let us know here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sofwaredevelopment</category>
      <category>integrationtest</category>
      <category>softwareengineering</category>
      <category>codequality</category>
    </item>
    <item>
      <title>How to organize a drawer the right way</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Sun, 30 Oct 2022 11:41:45 +0000</pubDate>
      <link>https://forem.com/dejavo/how-to-organize-a-drawer-the-right-way-1c9o</link>
      <guid>https://forem.com/dejavo/how-to-organize-a-drawer-the-right-way-1c9o</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UM3dDWCe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AfeDfU6lJBAaHu4Mj" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UM3dDWCe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AfeDfU6lJBAaHu4Mj" alt="" width="880" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Photo by shawnanggg on Unsplash
&lt;/p&gt;

&lt;h4&gt;
  
  
  Or let’s talk about cohesion
&lt;/h4&gt;

&lt;p&gt;TL;DR To make a system cohesive, you &lt;strong&gt;must&lt;/strong&gt; ensure that the parts that go together are close to one another.&lt;/p&gt;

&lt;p&gt;I sometimes find that the cohesion (and coupling) concept is often considered way too academic, and developers tend to talk about other well-known concepts, such as &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it"&gt;YAGNI&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt;, and &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle"&gt;SRP&lt;/a&gt;. The list is long, and I can continue with more acronyms all day 😂 So, I’ve chosen to challenge myself and simplify it.&lt;/p&gt;

&lt;p&gt;I hope I succeeded.&lt;/p&gt;

&lt;p&gt;Have you decided to continue reading?&lt;br&gt;&lt;br&gt;
Let’s talk about why it’s crucial or, in &lt;a href="https://medium.com/u/a8ff3eaa42c"&gt;Kent Beck’s&lt;/a&gt; words:&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--hiPyeMRw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1457857343568244742/FVQ4hpRx_normal.jpg" alt="Kent Beck 🌻 profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Kent Beck 🌻
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @kentbeck
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Coupling vs cohesion. &lt;br&gt;&lt;br&gt;Coupling:&lt;br&gt;  • Can be hard to find&lt;br&gt;  • Can be really hard &amp;amp;/| expensive to eliminate. &lt;br&gt;&lt;br&gt;Cohesive sub-elements are:&lt;br&gt;  • Usually easy to find&lt;br&gt;  • Cheap to achieve, &amp;amp;&lt;br&gt;  • Help you find de-coupling.
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      14:25 PM - 31 Oct 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1322545224220991488" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1322545224220991488" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1322545224220991488" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;You wanna strive for higher cohesion which reduces the coupling and complexity of the systems. What 😱? Let’s be formal for a moment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Cohesion_(computer_science)"&gt;&lt;em&gt;Cohesion&lt;/em&gt;&lt;/a&gt; is the degree to which the elements inside a module belong together.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Coupling_(computer_programming)"&gt;&lt;em&gt;Coupling&lt;/em&gt;&lt;/a&gt; is the degree of interdependence between software modules.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now it’s time for an analogy. Imagine you’re in the kitchen, it’s cold outside, and you wanna make a hot choco, so you open the silverware drawer, and it’s a total mess. Not only will it be hard to organize, but it’s not clear what belongs where and how to find it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JAHhTRud--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/634/0%2ABwTEHzJUrJyjl96E" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JAHhTRud--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/634/0%2ABwTEHzJUrJyjl96E" alt="" width="634" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the contrary, when everything is in its place, you can easily find a knife if needed or store a new spoon. In my eyes, that’s cohesion, lowering the general mess.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--huUzdXx1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/670/0%2Aw1CQpbqPkOrI7e9P" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--huUzdXx1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/670/0%2Aw1CQpbqPkOrI7e9P" alt="" width="670" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The terms cohesion and coupling are tightly related. They are often considered opposites, which isn’t accurate. Coupling is about &lt;em&gt;connections; cohesion&lt;/em&gt; is about &lt;em&gt;belonging together&lt;/em&gt;. The challenge is that cohesion is &lt;em&gt;discovered in a context&lt;/em&gt; and cannot be created initially, meaning — you keep refactoring your code to keep objects in context.&lt;/p&gt;

&lt;p&gt;The ideal scenario (also visible in the picture above) is when objects are arranged by functionality, or in other words, in a domain-driven context. When done correctly, it will result in loose coupling (there is no direct connection between a fork and knife besides the fact they are kitchenware).&lt;/p&gt;

&lt;p&gt;Now… if you’ve reached this point, some code examples can be helpful. Let’s start with coupling:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xiGJc6_m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AedRVyH-9TRTISpYl7sbsPA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xiGJc6_m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AedRVyH-9TRTISpYl7sbsPA.png" alt="" width="880" height="937"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Tight Coupling
&lt;/p&gt;

&lt;p&gt;When running the snippet above, the output is ID is null. You can run it yourself:&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@dejavo/TightCoupling?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;So what’s going on? Each of the validity checks is being bypassed since Student and School classes are tightly coupled in such a way that School has intimate knowledge of Student’s internals and can set its data members. This design could be better. A quick solution will be declaring studentId with private access, forcing other classes to call the public getter and setter methods to access it, as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3meg1fVl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AxekdWkrcnM1ir-awYHjPjw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3meg1fVl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AxekdWkrcnM1ir-awYHjPjw.png" alt="" width="880" height="937"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Loose Coupling
&lt;/p&gt;

&lt;p&gt;In this case, the output is :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You can't initialize studentId to a null
ID is not initialized
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@dejavo/LooseCoupling?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;But how does all of that relate to cohesion 🤷🏻‍♂️ ?&lt;/p&gt;

&lt;p&gt;Let’s get back to the Student and School example. If a class does all the work at once (God object), it results from high cohesion (and high coupling). Basically, there is a strong connection between the object in the same context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ejx9ASZ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A1U2SDmyeZc8hp_Db3-OZdQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ejx9ASZ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A1U2SDmyeZc8hp_Db3-OZdQ.png" alt="" width="880" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Low Cohesion
&lt;/p&gt;

&lt;p&gt;While trying to adhere to the single responsibility (or separation of concerns) principle, the interface should be broken into several &lt;em&gt;classes&lt;/em&gt;, each targeting different functionality (domain-driven), making it easier to maintain and update.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KPSt3Y5L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A4LpKxxAmnyq9u0U3jc7yRw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KPSt3Y5L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A4LpKxxAmnyq9u0U3jc7yRw.png" alt="" width="880" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
High Cohesion
&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Simply put, &lt;strong&gt;cohesion&lt;/strong&gt; means that a &lt;em&gt;class&lt;/em&gt; should represent a single concept. However, remember that achieving full decoupling is only possible with damaging cohesion and vice versa.&lt;/p&gt;

&lt;p&gt;A system architecture that is easy to understand, easy to change, easy to maintain, and to test, is characterized by high cohesion and loose coupling. This combination contributes to the reduction of accidental complexity and enables the creation of well-defined modules.&lt;/p&gt;

&lt;p&gt;Ultimately, I want readers to take away that following those principles leads to a system that is easier to maintain and refactor in the future. This is where the actual value lies, and that’s why you should care about cohesion.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>cohesion</category>
      <category>softwareengineering</category>
      <category>softwaredesign</category>
    </item>
    <item>
      <title>Where do I get writing ideas from?</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Sun, 28 Aug 2022 11:34:06 +0000</pubDate>
      <link>https://forem.com/dejavo/where-do-i-get-writing-ideas-from-2jk2</link>
      <guid>https://forem.com/dejavo/where-do-i-get-writing-ideas-from-2jk2</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8vMxa-oS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AMkrMxkFDfcqju54A" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8vMxa-oS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AMkrMxkFDfcqju54A" alt="" width="880" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Photo by Zach Lucero on Unsplash
&lt;/p&gt;

&lt;p&gt;I’m stuck; I’ve no muse about what to write. I can’t find any idea.&lt;br&gt;&lt;br&gt;
Aha… the famous &lt;a href="https://en.wikipedia.org/wiki/Writer's_block"&gt;&lt;strong&gt;writer’s block&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What do I do in those cases? From where does the inspiration to write about stuff come from? Where do I find ideas? How do I find the time?&lt;/p&gt;

&lt;p&gt;Regarding the second, you &lt;strong&gt;make time&lt;/strong&gt;  — it is all a matter of prioritization. I’ve written about time management in the past, and those methods help me to focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dvirsegal.medium.com/arrange-your-time-and-your-mind-will-follow-304ee0c99a29"&gt;Arrange your time and your mind will follow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ideas?&lt;/strong&gt; come from various sources. I keep an extensive list of podcasts, newsletters, blogs, etc., which I follow to gain more knowledge or, as I call it, the quest for growth, more on that:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/dejavo/in-the-quest-for-growth-material-1mfk"&gt;In the quest for growth material&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Besides that, I found ideas in unique places. I look for questions on Q&amp;amp;A-based websites such &lt;a href="https://softwareengineering.stackexchange.com/"&gt;softwareengineering.stackexchange&lt;/a&gt;, &lt;a href="https://workplace.stackexchange.com/"&gt;workplace.stackexchange&lt;/a&gt; or &lt;a href="https://www.quora.com/"&gt;quora&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sometimes I get ideas from my colleagues or people I follow on &lt;a href="https://twitter.com/dvir_segal"&gt;Twitter&lt;/a&gt;. Actually, Twitter is an interesting place to collect them; I tend to tweet my thoughts, and occasionally a debate might evolve; this can be a trigger to &lt;a href="https://dvirsegal.medium.com/effort-estimation-its-complicated-8e1c77bf572c"&gt;blog&lt;/a&gt; about.&lt;/p&gt;

&lt;p&gt;Anyhow, whether it’s a blog, podcast, or any other source. First, I collect the subjects I think I’d like to write about on a dedicated &lt;a href="https://www.notion.so/"&gt;Notion&lt;/a&gt; page, a sort of ideas log. Afterward, I follow the method I wrote about here to sort it out:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dvirsegal.medium.com/digital-notes-are-your-life-dashboard-e45ae64c64fc"&gt;Digital Notes are your life dashboard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This means that whenever I feel like writing or creating, I already have an arsenal of ideas.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So now I have a prioritized list, the fun part can begin. I pick the first item and start to research it online and collect the info on the subject’s page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Uy8tyqiP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AQBL6-3AzNiiXVG2t2yIE1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Uy8tyqiP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AQBL6-3AzNiiXVG2t2yIE1g.png" alt="" width="880" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
My digital notebook of ideas&lt;/p&gt;

&lt;p&gt;Once I feel ready I start writing, which is about the time I feel I consumed enough sources to write about the subject and express my opinion on it. Don’t get me wrong: research is critical, but sometimes, you just have to stop and start writing and see what happens.&lt;/p&gt;

&lt;p&gt;The draft is ready? I read the whole thing repeatedly and then again 😂 and fix whatever doesn’t get along with my main narrative.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aM-Xvvff--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/634/0%2AKwJoGUjBpXWWCv-p" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aM-Xvvff--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/634/0%2AKwJoGUjBpXWWCv-p" alt="" width="634" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
forget about it&lt;/p&gt;

&lt;p&gt;Finally, I use &lt;a href="https://app.grammarly.com/"&gt;Grammarly&lt;/a&gt; to find any typos and grammar mistakes and if the sentences don’t fit the defined Grammarly goals. I usually pick an informal general audience with a casual domain. My writing style (intent) usually tells a story (as you might have noticed).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7y2RbRv3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/636/1%2AQx8P5WME1H3Nccbmn5eV7Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7y2RbRv3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/636/1%2AQx8P5WME1H3Nccbmn5eV7Q.png" alt="" width="636" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Grammarly goals setting&lt;/p&gt;

&lt;p&gt;Lastly, the reviewers, a bunch of close friends, and colleagues happily read my drafts and share their inputs, and based on their feedback (loops), I’ll rewrite the final draft.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9Z6xAam1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/660/0%2AElaA7Zhqt7p7pOSG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9Z6xAam1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/660/0%2AElaA7Zhqt7p7pOSG" alt="" width="660" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, writing is all about reading and then more writing. As the old saying goes, “the only kind of writing is rewriting”.&lt;/p&gt;

</description>
      <category>writerblock</category>
      <category>writersonwriting</category>
      <category>ideas</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Is Code freeze still relevant?</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Thu, 26 May 2022 14:23:37 +0000</pubDate>
      <link>https://forem.com/dejavo/is-code-freeze-still-relevant-4804</link>
      <guid>https://forem.com/dejavo/is-code-freeze-still-relevant-4804</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QKOKaP_p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2Ajd0kD76jRPYljty_" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QKOKaP_p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2Ajd0kD76jRPYljty_" alt="" width="880" height="660"&gt;&lt;/a&gt;&lt;/p&gt;
 Photo by sydney Rae on Unsplash 



&lt;h4&gt;
  
  
  When practicing CI/CD, does code freeze still matter?
&lt;/h4&gt;

&lt;p&gt;Assuming you are familiar with the concept of code freeze, which is that dedicated time in a project when we (developers) are supposed to be more strict in making changes to the code or other resources for the good of moving the project towards a release or the end of an iteration.&lt;/p&gt;

&lt;p&gt;I’ve recently wondered about that concept; I asked myself why do we need to stop everything when we have a full-scale CI\CD pipeline. Well, you can just pick one of the versions and set it as the release candidate.&lt;/p&gt;

&lt;p&gt;I researched and asked around, below you can find my conclusions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Code freeze? Aha?
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wiDR5bTM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/600/0%2AhgQWPTbYxfH2Wp9v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wiDR5bTM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/600/0%2AhgQWPTbYxfH2Wp9v.jpg" alt="" width="600" height="520"&gt;&lt;/a&gt;&lt;/p&gt;
code freeze bane



&lt;p&gt;First thing, first, defining what code freeze is. &lt;a href="https://en.wikipedia.org/wiki/Freeze_(software_engineering)"&gt;Wikipedia&lt;/a&gt; defines it as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a &lt;strong&gt;freeze&lt;/strong&gt; is a point in time in the development process after which the rules for making changes to the source code or related resources become more strict&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The page underlines 3 common types of freezes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A specification freeze&lt;/strong&gt; is when all parties agree that no new requirements, specifications, or features will be added, as well as stop coding.&lt;/p&gt;

&lt;p&gt;In a &lt;strong&gt;feature freeze&lt;/strong&gt; , all development of new features is suspended so that all effort is focused on finding and fixing bugs and improving the user experience. A feature freeze helps improve the program’s stability by preventing the introduction of new, untested source code, resources, and their interactions.&lt;/p&gt;

&lt;p&gt;Lastly, a &lt;strong&gt;code freeze&lt;/strong&gt; , where no changes are allowed to the source code, ensures that the code areas known to work correctly will continue to do so. Code freezes are more common in the final stages of development when a specific release or iteration is being evaluated.&lt;/p&gt;

&lt;h4&gt;
  
  
  Do we need it at all?
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--coSHvlmn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A3I3WnoIVb5cQsWse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--coSHvlmn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A3I3WnoIVb5cQsWse.png" alt="" width="880" height="880"&gt;&lt;/a&gt;&lt;/p&gt;
Code freeze?



&lt;p&gt;Now that we all synced what it is, the question is whether it’s relevant nowadays, where most (I assume) organizations practice a sort of CI\CD pipeline? the answer is not so simple; &lt;strong&gt;it depends&lt;/strong&gt; on the domain and the product’s needs.&lt;/p&gt;

&lt;p&gt;Take for example what happens at &lt;a href="https://www.igentify.com/"&gt;Igentify&lt;/a&gt; (where I work), the product we develop is regulated as required in the health tech domain. We apply a feature freeze for that purpose, so all features will be stable, the code is shifted to a dedicated branch, and (manual and automated) tests are applied before release. If any bugs were found, we fix them ASAP. In the meantime, new features are being developed in the main (current) branch. So, newer development doesn’t stop; it gets lower priority, and the pace is slower.&lt;/p&gt;

&lt;p&gt;Whereas this notion contradicts the concept of the CD (commit == new version) where you can just take whatever is ready (in terms of code, tests, etc.) from a specific branch and deliver it to production. For instance, if a bug was found, quickly fix it, push and deliver to that branch. In a way, It creates a buffer between developers and production. They can continue to do their work without knowing there is a freeze at all.&lt;/p&gt;

&lt;p&gt;In some cases, it is worth “breaking” the CD concept to mitigate a release risk. For example, I’ve learned that Big Tech companies such as Google do code freeze on the holidays since most of the employees are with their families, which results in less workforce to overcome production issues.&lt;/p&gt;

&lt;h4&gt;
  
  
  A word of caution ⚠️
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xGHp943a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AMx2pbzASSta1Ao5k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xGHp943a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AMx2pbzASSta1Ao5k.jpg" alt="" width="880" height="504"&gt;&lt;/a&gt;&lt;/p&gt;
test, testing, and some more testing



&lt;p&gt;We should stay on guard about the frequency of using a freeze, it may point to &lt;strong&gt;unreliable tests&lt;/strong&gt; , hence strengthening the testing chain will reduce the need for it. Moreover, some might argue that your processes have problems since you say certain contributions can’t integrate. There are many possible reasons, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No automated tests.&lt;/li&gt;
&lt;li&gt;Slow and\or flaky tests.&lt;/li&gt;
&lt;li&gt;Long feature branches.&lt;/li&gt;
&lt;li&gt;Unagreed design changes.&lt;/li&gt;
&lt;li&gt;Broken builds are not being immediately reverted.&lt;/li&gt;
&lt;li&gt;Developers don’t work on the latest main trunk.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever it is, you’re not doing CI if you cannot integrate without stopping the whole team.&lt;/p&gt;

&lt;h4&gt;
  
  
  Final words
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8Fdcwpzb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/876/0%2AxuZFr3pPuQCXP_Rg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Fdcwpzb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/876/0%2AxuZFr3pPuQCXP_Rg.jpg" alt="" width="876" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
The target is to release



&lt;p&gt;The truth is that there are no absolutes here.&lt;/p&gt;

&lt;p&gt;The point of continuous integration and tests is to shorten the feedback loops and give programmers more visibility. As a result, there are fewer problems in testing and builds, but this doesn’t mean you don’t do the other parts of your development cycle — they’re just more efficient and effective, as development-related issues are more likely to be caught earlier in the process.&lt;/p&gt;

&lt;p&gt;Nevertheless, a high degree of confidence does not mean something should go into the release without passing through the same final stages, and the code freeze is a critical element of this. To ensure the baseline for what you ship is as expected, you will still need it (or at least a branch).&lt;/p&gt;

&lt;p&gt;Note that, simpler cases probably don’t require freezing. The CI process should ensure that a development branch's state can be released. Though, there can be MANY reasons why some specific code cannot yet be released into production. It is possible that other dependencies are required to be released at the same time or for any business reasons.&lt;/p&gt;

&lt;p&gt;In any of the cases, IMHO, the release risk has to be managed, in some cases on the account of reducing the CD rate, though we shall strive not to harm it and find other ways.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>codefreeze</category>
      <category>scrum</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>In the quest for growth material</title>
      <dc:creator>Dvir Segal</dc:creator>
      <pubDate>Sat, 26 Mar 2022 17:50:38 +0000</pubDate>
      <link>https://forem.com/dejavo/in-the-quest-for-growth-material-1mfk</link>
      <guid>https://forem.com/dejavo/in-the-quest-for-growth-material-1mfk</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q7RGnPYe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AP4fClaR0staR1ZPN" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q7RGnPYe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AP4fClaR0staR1ZPN" alt="" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;
Photo by William Bayreuther on Unsplash



&lt;h4&gt;
  
  
  Various methods I use to gain new knowledge
&lt;/h4&gt;

&lt;p&gt;A few years ago, I started my journey; picture this, a recent undergraduate SW engineer on his first full-time day job. My team mainly consisted of seniors; I saw those “giants” that both have vast product knowledge and tons of it in software development. They even found the time to be up to date with general tech news. I thought to myself, how do they do that? How can I learn new stuff which is not directly learned on the job? What are their methods? How do they find the time for that?&lt;/p&gt;

&lt;p&gt;As part of my search for &lt;strong&gt;growth material&lt;/strong&gt; , I’ve tried various methods that work for me, and I still do improve them from time to time. In the following post, I’ll elaborate on them. I covered my time management methods in other posts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dvirsegal.medium.com/arrange-your-time-and-your-mind-will-follow-304ee0c99a29"&gt;Arrange your time and your mind will follow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dvirsegal.medium.com/digital-notes-are-your-life-dashboard-e45ae64c64fc"&gt;Digital Notes are your life dashboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xUKSOFf4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/500/0%2AR3Jai-p3jYa5vbwt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xUKSOFf4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/500/0%2AR3Jai-p3jYa5vbwt.jpg" alt="" width="500" height="373"&gt;&lt;/a&gt;newsletters -&lt;a href="https://imgflip.com/i/20dzxh"&gt;src&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Newsletters
&lt;/h4&gt;

&lt;p&gt;I’ve found newsletters as my preferred way of staying on top of new and relevant software engineering topics. Here are the ones I keep reading every week out of the many newsletters I have tried:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://tldr.tech/newsletter"&gt;&lt;strong&gt;TLDR Newsletter&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/tldrdan"&gt;Dan Ni&lt;/a&gt;. TLDR is a daily newsletter with links and TLDRs of the most interesting stories in tech 📱, science 🚀, and coding 💻!&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://levelup.patkua.com/"&gt;&lt;strong&gt;Level Up&lt;/strong&gt;&lt;/a&gt; from &lt;a href="https://twitter.com/patkua"&gt;Pat Kua&lt;/a&gt;. Level up is a weekly newsletter for tech leaders. A collection of ten (or more) interesting links on leadership, technology, organizations, and processes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://softwareleadweekly.com/"&gt;&lt;strong&gt;Software Lead Weekly&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/orenellenbogen"&gt;Oren Ellenbogen&lt;/a&gt;. A weekly email for busy people who care about people, culture, and leadership.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pointer.io/"&gt;&lt;strong&gt;The Pointer&lt;/strong&gt;&lt;/a&gt;. A reading club for software developers, curated by &lt;a href="https://twitter.com/SurajKapoor"&gt;Suraj Kapoor&lt;/a&gt;. Emailed Tuesdays &amp;amp; Fridays with 6–7 links with a tl;dr for each article.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://programmingdigest.net/"&gt;&lt;strong&gt;Programming Digest&lt;/strong&gt;&lt;/a&gt;, curated by &lt;a href="https://twitter.com/jakubgarfield"&gt;Jakub Chodounsky&lt;/a&gt;. A weekly newsletter with the five most interesting stories in programming 👩‍💻, data 💾, and technology 📱.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://console.dev/"&gt;&lt;strong&gt;Console&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/davidmytton"&gt;David Mytton&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/Max_Jennings"&gt;Max Jennings&lt;/a&gt;. A weekly digest of the best developer tools and beta releases for developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above is what works for me; if you’d like more, head to the awsome-weekly repo with an extensive list of weekly newsletters from the software world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jondot/awesome-weekly"&gt;GitHub - jondot/awesome-weekly: An "awesome" type curated list of quality weekly subscription newsletters from the software world&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l0NhZ0aUSE8fXag12/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l0NhZ0aUSE8fXag12/giphy.gif" alt="" width="480" height="270"&gt;&lt;/a&gt;Brain explodes —&lt;a href="https://media.giphy.com/media/l0NhZ0aUSE8fXag12/giphy.gif"&gt;src&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  But.. but, how can you consume that much information?
&lt;/h4&gt;

&lt;p&gt;Our goal is to make reading fun and ensure that the content is relevant to you. If it’s boring, procrastinate. With that in mind, skim before you read!&lt;/p&gt;

&lt;p&gt;A learning technic that I’ve learned in my master’s degree for reading (lots of) academic articles and understanding what’s relevant or not.&lt;/p&gt;

&lt;p&gt;First, read the headline up to the first paragraph. Then, jump to the conclusion and read it. Fluent recognition of words is the key which improves as you consume more content and your vocabulary is getting larger.&lt;/p&gt;

&lt;p&gt;Now you’ll be able to decide if the article is interesting. If it does, go over it again, but this time, you are going to read it while you’ve already established the article’s contextual concept, the essence. Slow down on areas of interest and ignore irrelevant info.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tech for the rescue
&lt;/h4&gt;

&lt;p&gt;Usually, I collect more articles than I’m able to read in a week. I place them using the 1percentgrowth app by &lt;a href="https://medium.com/u/ef7ede9a0d7a"&gt;Shem Magnezi&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://start.1percentgrowth.app/"&gt;1% Growth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;which I recently switched to from &lt;a href="https://medium.com/u/c70f51225816"&gt;Pocket&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getpocket.com/en/"&gt;Pocket&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those apps not only gather your articles but also recommend based on your past readings other hidden gems which relevant for you. A significant benefit of the pocket app is that it allows listening to articles utilizing text to speech engine. This is a true productivity boost. If you decide to use a different service — you can always rely on audioread, which turns your reads into podcasts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://audioread.com/home"&gt;Turn Reads📖 into Podcasts🎧&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or if you read on your computer’s browser, the lovely ‘Read Aloud’ extension is helpful as well:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/read-aloud-a-text-to-spee/hdhinadidafjejdhmfkjgnolgimiaplp"&gt;Read Aloud: A Text to Speech Voice Reader&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And last but not least is wordtune, which creates a tl;dr version of the article to understand more and faster:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.wordtune.com/read"&gt;Wordtune Read&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DYbKZ37Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/620/0%2AIEVVuHWmLugArHnt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DYbKZ37Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/620/0%2AIEVVuHWmLugArHnt.jpg" alt="" width="620" height="465"&gt;&lt;/a&gt;&lt;/p&gt;
Podcasts everywhere -&lt;a href="https://wagner.edu/hawktalk/files/2019/02/1f036s.jpg"&gt;src&lt;/a&gt;



&lt;h4&gt;
  
  
  Podcasts
&lt;/h4&gt;

&lt;p&gt;I frequently listen to (Hebrew) podcasts; I usually play them on x1.4 speed, though I try to play with it and see If I can make it to x2. TBH, this is hard. Below is my listening list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pod.link/307256322"&gt;&lt;strong&gt;Reversim&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/rantav"&gt;Ran Tavori&lt;/a&gt; and &lt;a href="https://twitter.com/orilahav"&gt;Ori Lahav&lt;/a&gt;. Probably one of the iconic podcasts for developers. It covers tech, software, and development culture.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pod.link/1019124387"&gt;&lt;strong&gt;Geekonomy&lt;/strong&gt;&lt;/a&gt; co-hosted by &lt;a href="https://twitter.com/ReemSherman"&gt;Reem Sherman&lt;/a&gt; and &lt;a href="https://twitter.com/Doronir"&gt;Doron Nir&lt;/a&gt;. They interview a special guest in each episode, which brings an interesting subject to talk about.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pod.link/1208444330"&gt;&lt;strong&gt;NoTarbut&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/AviEtzioni"&gt;Avi Etzioni&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/barnashon"&gt;Iftach Bar&lt;/a&gt;. A podcast about the day-to-day of developers’ teams.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pod.link/1447499952"&gt;&lt;strong&gt;CyberCyber&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/idokius"&gt;Ido Keinan&lt;/a&gt; and &lt;a href="https://twitter.com/noamr"&gt;Noam Rotem&lt;/a&gt;. A great way to stay up to date on the recent hacks and cyber security concepts.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pod.link/1566710923"&gt;&lt;strong&gt;Hitech troubles&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/Arbel2025"&gt;Arbel Zinger&lt;/a&gt; and &lt;a href="https://twitter.com/eranyac"&gt;Eran Yacobovitch&lt;/a&gt;, which, in their words, is about the people of the Israeli hi-tech.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pod.link/1555630687"&gt;&lt;strong&gt;The big picture&lt;/strong&gt;&lt;/a&gt; co-hosted by &lt;a href="https://twitter.com/aviadby"&gt;Aviad Ben-Yehuda&lt;/a&gt; and &lt;a href="https://twitter.com/therealnirs"&gt;Nir Sabato&lt;/a&gt;. In each episode, this unique podcast covers the business strategy of one tech company.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pod.link/1549919411"&gt;&lt;strong&gt;BarvazGumi&lt;/strong&gt;&lt;/a&gt; hosted by &lt;a href="https://twitter.com/VickiToVictory1"&gt;Vicky Kalmanovich&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/linoy-shkuri-a9a709143/"&gt;Linoy Shkuri&lt;/a&gt;. Interesting guests that talk about what makes development fun!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pod.link/1383642459"&gt;&lt;strong&gt;Osim Tochna&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;is&lt;/strong&gt; hosted by Boaz Lavi, who brings subjects about code, programming languages, cursed bugs, and machine learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are more to listen to, and I try to review the list to keep it relevant for my interests (like the &lt;a href="https://pod.link/1486670783"&gt;&lt;strong&gt;Root Cause&lt;/strong&gt;&lt;/a&gt;, which stopped recording new episodes).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l0IyajjbNiRvCr7RC/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l0IyajjbNiRvCr7RC/giphy.gif" alt="" width="500" height="280"&gt;&lt;/a&gt;plain old RSS feed —&lt;a href="https://giphy.com/gifs/aetv-l0IyajjbNiRvCr7RC"&gt;src&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  RSS feed
&lt;/h4&gt;

&lt;p&gt;Yeah, I’m aware of the fact this is quite an old concept but still relevant. There are plenty of RSS clients. I’ve found the Feedly free version more than enough for my needs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://feedly.com/"&gt;Feedly - More signal, less noise&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I apply the same skimming method. However, since it's about tech news, reading the headlines will give you the gist of it.&lt;/p&gt;

&lt;p&gt;What’s in my RSS list? This is where I get up to date with recent tech news, in English and as well Hebrew sites — here are my favorites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.xda-developers.com/"&gt;XDA developers&lt;/a&gt; (English)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arstechnica.com/"&gt;Ars Technica&lt;/a&gt; (English)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://9to5google.com/"&gt;9to5Google&lt;/a&gt; (English)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ghacks.net/"&gt;gHacks Tech News&lt;/a&gt; (English)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gtricks.com/"&gt;Gtricks&lt;/a&gt; (English)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.hanselman.com/blog/"&gt;Scott Hanselman’s Blog&lt;/a&gt; (English)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://michaelscodingspot.com/"&gt;Micahel’s coding spot&lt;/a&gt; (English)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.themarker.com/misc/all-headlines"&gt;TheMarker headlines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.geektime.co.il/"&gt;Geektime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tgspot.co.il/"&gt;TGspot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pinatkafe.com/"&gt;Coffee spot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://softwarearchiblog.com/"&gt;Software Archiblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://internet-israel.com/"&gt;Internet Israel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tech12.co.il/"&gt;Tech12&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, it is helpful to follow groups of interest on &lt;a href="https://www.reddit.com/"&gt;Reddit&lt;/a&gt;, &lt;a href="https://www.quora.com/?share=1"&gt;Quora&lt;/a&gt;, or &lt;a href="https://www.facebook.com/"&gt;Facebook&lt;/a&gt;, but that created an information overload for me, so I’ve decided to stop using them, and nowadays, I mainly follow the &lt;a href="https://twitter.com/hashtag/%D7%A4%D7%99%D7%93%D7%98%D7%A7"&gt;Tech Twitter&lt;/a&gt; hashtag and focus on reading content by interesting influencers such as &lt;a href="https://medium.com/u/f540d518c481"&gt;Rina Artstain&lt;/a&gt;, &lt;a href="https://medium.com/u/b70bc0ba5f2e"&gt;Ran Bar-Zik&lt;/a&gt;, &lt;a href="https://medium.com/u/1060f9ec7045"&gt;Oren Ellenbogen&lt;/a&gt;, etc. The list can go on and on, head to my &lt;a href="https://twitter.com/dvir_segal"&gt;profile&lt;/a&gt; for more.&lt;/p&gt;

&lt;h4&gt;
  
  
  To conclude
&lt;/h4&gt;

&lt;p&gt;Calm down, don’t stretch your limits. You can go nuts from &lt;a href="https://en.wikipedia.org/wiki/Fear_of_missing_out"&gt;FOMO&lt;/a&gt; ( I didn’t cover Books as a learning source…).&lt;/p&gt;

&lt;p&gt;Make sure to ask yourself what’s in it for me or what am I looking to learn here? Protect your time before you start consuming it. Ensure the information fits your expected growth and be hyper-aware of biases (be judgmental).&lt;/p&gt;

&lt;p&gt;Explain the content in your own words (I usually tweet about my takeaways). Ask yourself questions after you’re done. Did it remind me of something else? Did it change the way I think? What did I learn from it that I didn’t know before? etc. That way, you can increase the chances it sticks with you, and later, you’ll be able to pull it out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/dvirsegal"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gHm5yFYB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/545/0%2AyvEscsl0vBKOi80O.jpeg" alt="" width="545" height="153"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;if you liked it…&lt;/em&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>growthmindset</category>
      <category>careertips</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
