<?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: Steven Solomon</title>
    <description>The latest articles on Forem by Steven Solomon (@ssolo112).</description>
    <link>https://forem.com/ssolo112</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%2F170078%2Ff2c44b5c-77c8-4190-a703-599325176d22.jpg</url>
      <title>Forem: Steven Solomon</title>
      <link>https://forem.com/ssolo112</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ssolo112"/>
    <language>en</language>
    <item>
      <title>Mocking Functions in Elixir With ExDoubles</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Mon, 06 Jan 2020 01:54:15 +0000</pubDate>
      <link>https://forem.com/ssolo112/mocking-functions-in-elixir-with-exdoubles-4195</link>
      <guid>https://forem.com/ssolo112/mocking-functions-in-elixir-with-exdoubles-4195</guid>
      <description>&lt;p&gt;This post has moved to: &lt;a href="https://soonernotfaster.com/posts/mocking-functions-in-elixir-with-exdoubles/"&gt;https://soonernotfaster.com/posts/mocking-functions-in-elixir-with-exdoubles/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>testing</category>
      <category>showdev</category>
      <category>agile</category>
    </item>
    <item>
      <title>When was the last time you made a change to your process?</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Mon, 23 Sep 2019 13:53:32 +0000</pubDate>
      <link>https://forem.com/ssolo112/when-was-the-last-time-you-made-a-change-to-your-process-2fio</link>
      <guid>https://forem.com/ssolo112/when-was-the-last-time-you-made-a-change-to-your-process-2fio</guid>
      <description>&lt;p&gt;The values behind agile are intended to increase collaboration, and incremental improvement. However, most teams work as if the primary directive is to ship lots of code, rather than find better ways to deliver value to customers.&lt;/p&gt;

&lt;p&gt;Tell me about a time that your team improved their process or ran an experiment. Then let’s celebrate together and show others that they can improve there work lives too. 🎉&lt;/p&gt;

</description>
      <category>agile</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I use test-driven development every day, ask me anything</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Wed, 31 Jul 2019 13:50:05 +0000</pubDate>
      <link>https://forem.com/ssolo112/i-use-test-driven-development-every-day-ask-me-anything-1k8p</link>
      <guid>https://forem.com/ssolo112/i-use-test-driven-development-every-day-ask-me-anything-1k8p</guid>
      <description>&lt;p&gt;Hey Readers,&lt;/p&gt;

&lt;p&gt;I have been working in software since 2007. After a very frustrating project in 2010, I discovered test-driven development as a way to check my work in an automated fashion. &lt;/p&gt;

&lt;p&gt;I was a lone developer writing an iPad app, working 12 to 14 hour days in order to make the deadlines. I watched in horror, as my stakeholder discovered new regressions at every demo. Out of desperation, I searched the internet for a way to automate all of the manual testing that I was doing. Then I found TDD. &lt;/p&gt;

&lt;p&gt;I bought Kent Beck's book Test-Driven Development by Example. After reading it over a weekend, I wrote my first test that Monday, and I have never looked back.&lt;/p&gt;

&lt;p&gt;For the past 8 years I have used TDD every day at work and on side-projects. It has brought stability, precision, and enjoyment to how I write code. Now, I would like to discuss this technique with you all. &lt;/p&gt;

&lt;p&gt;I invite you to ask me anything. &lt;/p&gt;

&lt;p&gt;Looking forward to your questions,&lt;br&gt;
Steve&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you enjoy the discussion, please leave a like&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ama</category>
      <category>tdd</category>
      <category>discuss</category>
    </item>
    <item>
      <title>My First Week With Elixir As A Rubyist</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Tue, 11 Jun 2019 21:22:42 +0000</pubDate>
      <link>https://forem.com/ssolo112/my-first-week-with-elixir-as-a-rubyist-4480</link>
      <guid>https://forem.com/ssolo112/my-first-week-with-elixir-as-a-rubyist-4480</guid>
      <description>&lt;p&gt;I recently started learning Elixir for an upcoming project. As part of my usual prep work, I have studied the &lt;a href="https://elixir-lang.org/"&gt;language documentation&lt;/a&gt;, walked through the &lt;a href="https://github.com/elixirkoans/elixir-koans"&gt;Koans&lt;/a&gt;, and practiced some katas on &lt;a href="https://exercism.io"&gt;Exercism.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The end result is a few changes to how I approach problem solving, that I want to share with you. &lt;/p&gt;

&lt;p&gt;Before we jump in, some things you might find confusing are:&lt;/p&gt;

&lt;p&gt;1) Function signatures include the number of parameters that they take, referred to as arity. A function signature &lt;code&gt;any?(collection, fn)&lt;/code&gt; would be referred to as &lt;code&gt;any?/2&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;2) Unused parameters are named but are prefixed with an underscore.&lt;/p&gt;

&lt;p&gt;3) &lt;code&gt;iex&lt;/code&gt; is the name of the REPL in Elixir.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pattern matching and Decomposition
&lt;/h1&gt;

&lt;p&gt;Pattern matching as a first class idea is new to me. Usually I would avoid case statements and destructuring, and favor polymorphism, but I have begun to play with some of the interesting cases that are possible.&lt;/p&gt;

&lt;p&gt;Let's look at an example. Here I match the variable &lt;code&gt;a&lt;/code&gt; to a pattern of a string literal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;iex&amp;gt; a = "Some String" # Binds string to a
"Some String"
iex&amp;gt; "Some String" = a # Matches a to the pattern
"Some String"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pattern matching throws an error when there is not a match.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;iex&amp;gt; "Not a Match" = a # Throws an error
** (MatchError) no match of right hand side value: "Some String"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is possible to destructure lists using pattern matching. Here you can see how to separate the first element of a list from the rest of it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;iex&amp;gt; [head | tail] = [1, 2, 3, 4, 5]
iex&amp;gt; head
1
iex&amp;gt; tail
[2, 3, 4, 5]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also destructure more complex data types. For instance, grabbing a key out of a map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;iex&amp;gt; user = %{id: 1, login: %{user_name: 'bob114', password: 'Apple12Sauce!'}}
iex&amp;gt; %{id: id} = user
iex&amp;gt; id
1
iex&amp;gt; %{login: %{user_name: user_name}} = user
iex&amp;gt; user_name
bob114
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Recursion First
&lt;/h1&gt;

&lt;p&gt;I had to adapt my style to embrace recursion. That last time that I wrote so much recursive code was in a computer science course. This is a drastic style change but would be best demonstrated through an example of navigating collections.&lt;/p&gt;

&lt;p&gt;Let's create a function to determine if any element is contained in a collection, and name the function &lt;code&gt;any?/2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I start by asking, "What is the base case for &lt;code&gt;any?/2&lt;/code&gt;?". &lt;/p&gt;

&lt;p&gt;It would be when the list parameter is empty. Using pattern matching we can define a function header that will match the scenario where the first element passed is an empty list, and return &lt;code&gt;false&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;any?&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt; &lt;span class="n"&gt;_a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;# Matches when the first param is an empty list&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next I think ask, "What could be the recursive case?"&lt;/p&gt;

&lt;p&gt;When the list is not empty, I try to divide the problem into smaller parts, allowing me to hit the base cases. There are two possibilities, 1) the first element is equal to the variable, 2) it isn't and we need to keep looking. If we implement scenario one, then we have the &lt;code&gt;head&lt;/code&gt; equal to &lt;code&gt;a&lt;/code&gt;, so we return true.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;any?&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt; &lt;span class="n"&gt;_a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;any?&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;_tail&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the last scenario we deal with recursing the rest of the list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;any?&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt; &lt;span class="n"&gt;_a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;any?&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; 
      &lt;span class="n"&gt;any?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Maintaining state
&lt;/h1&gt;

&lt;p&gt;In Elixir state is managed inside of processes. Each process emulates state transitions by using recursion. Processes allow their state to be changed or queried by other processes via messages. Rather than show you the low level tooling (&lt;code&gt;spawn&lt;/code&gt;, &lt;code&gt;Agent&lt;/code&gt;, or &lt;code&gt;Task&lt;/code&gt;), the most high-level construct I am aware of is the &lt;code&gt;GenServer&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;GenServer&lt;/code&gt; is a core language construct that wraps all the complexity around a process sending and receiving messages. It is a module that has two types of functions, asynchronous and synchronous. &lt;/p&gt;

&lt;p&gt;Synchronous functions are &lt;code&gt;call&lt;/code&gt;s, they will reply to the calling process with some data. They do this by returning a tuple like &lt;code&gt;{:reply, data, state}&lt;/code&gt;. The &lt;code&gt;:reply&lt;/code&gt; tells the server to respond to the caller, the data is what to send in the reply, and the state is the new state for the process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;OurServer&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;GenServer&lt;/span&gt;

  &lt;span class="o"&gt;...&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="ss"&gt;:message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;caller_data&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;_from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;caller_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;caller_data&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Asynchronous functions are &lt;code&gt;cast&lt;/code&gt;s, they do not reply to callers. They return a tuple like &lt;code&gt;{:noreply, state}&lt;/code&gt;. &lt;code&gt;:noreply&lt;/code&gt; tells the server not to reply, and &lt;code&gt;state&lt;/code&gt; is the new state for the process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;OurServer&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;GenServer&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="ss"&gt;:message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;caller_data&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:noreply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;caller_data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In future articles, I plan to discuss &lt;code&gt;GenServer&lt;/code&gt;s more deeply, but that's all for now.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I am venturing out into the wilderness of Functional Languages by trying Elixir for the first time. &lt;/p&gt;

&lt;p&gt;The things I found the most interesting on week one are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pattern matching&lt;/li&gt;
&lt;li&gt;Recursion first&lt;/li&gt;
&lt;li&gt;Emulating state with processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you enjoyed this article and want to read more about Elixir, please leave a comment or a like below. Thanks!&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>functional</category>
      <category>oop</category>
      <category>ruby</category>
    </item>
    <item>
      <title>What is a Techtro?</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Fri, 31 May 2019 11:37:38 +0000</pubDate>
      <link>https://forem.com/ssolo112/what-is-a-techtro-4of</link>
      <guid>https://forem.com/ssolo112/what-is-a-techtro-4of</guid>
      <description>&lt;p&gt;This post has moved to: &lt;a href="https://soonernotfaster.com/posts/what-the-heck-is-a-techtro/"&gt;https://soonernotfaster.com/posts/what-the-heck-is-a-techtro/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agile</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Document Technical Tasks?</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Tue, 21 May 2019 15:23:15 +0000</pubDate>
      <link>https://forem.com/ssolo112/how-to-document-technical-tasks-n8d</link>
      <guid>https://forem.com/ssolo112/how-to-document-technical-tasks-n8d</guid>
      <description>&lt;p&gt;This post has moved to: &lt;a href="https://soonernotfaster.com/posts/how-to-document-technical-tasks/"&gt;https://soonernotfaster.com/posts/how-to-document-technical-tasks/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agile</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What Patty Taught Me</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Tue, 19 Feb 2019 22:53:50 +0000</pubDate>
      <link>https://forem.com/ssolo112/what-patty-taught-me-5de6</link>
      <guid>https://forem.com/ssolo112/what-patty-taught-me-5de6</guid>
      <description>&lt;p&gt;This post has moved to: &lt;a href="https://soonernotfaster.com/posts/what-patty-taught-me/"&gt;https://soonernotfaster.com/posts/what-patty-taught-me/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How do you run a postmortem?</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Mon, 17 Sep 2018 13:00:01 +0000</pubDate>
      <link>https://forem.com/ssolo112/how-do-you-run-a-postmortem-3k0b</link>
      <guid>https://forem.com/ssolo112/how-do-you-run-a-postmortem-3k0b</guid>
      <description>&lt;p&gt;This post has moved to: &lt;a href="https://soonernotfaster.com/posts/how-do-you-run-a-postmortem/"&gt;https://soonernotfaster.com/posts/how-do-you-run-a-postmortem/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Which Type Of Tests Should You Write?</title>
      <dc:creator>Steven Solomon</dc:creator>
      <pubDate>Mon, 10 Sep 2018 13:39:12 +0000</pubDate>
      <link>https://forem.com/ssolo112/which-type-of-tests-should-you-write-e5d</link>
      <guid>https://forem.com/ssolo112/which-type-of-tests-should-you-write-e5d</guid>
      <description>&lt;p&gt;This post has moved to: &lt;a href="https://soonernotfaster.com/posts/which-type-of-tests-should-you-write/"&gt;https://soonernotfaster.com/posts/which-type-of-tests-should-you-write/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
