<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="125443" data-post-id="125443">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Fl4m3Ph03n1x" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Fl4m3Ph03n1x/120/11709_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Fl4m3Ph03n1x
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Ahhh, I think I get it now.</p>
<p>All this time I have been investing my time in reading Patterns and Rules, not realizing that Erlang’s landscape requires a different approach from the get go.</p>
<p>After reading evryone’s replies, I have concluded the following:</p>
<ul>
<li>I need to focus more on architectural design principles and not patterns (specially the ones translated from other languages)</li>
<li>I need to invest more on books and courses on how to model applications in Elixir (I suppose it  doesn’t change much from erlang, right?)</li>
</ul>
<p>When I started the book I had a copy of the GoF design patterns right alongside it. I still do, it’s a book I cherish a lot. But I now understand that the Elixir best characteristics are better fostered in a environment not restricted by the patterns of 15 years ago, made for C++.</p>
<p>In a way, this is both humbling and freeing. Humbling because I have cemented my position as a beginner. It somehow feels like after years of being a Senior in other areas where I had nothing more to really learn, coming to Elixir is almost like going back to level 1.</p>
<p>But I also feel free, because now that I understand this, I am more open minded and reading new books and posts from the community will be easier for me. I am not perfect, there will always be a part of me that goes “<em>This really looks like pattern X or goes against rule Y</em>” but now I feel I don’t have to compare everything against this huge database of past experiences and accepting new information (while still applying critical thinking ofc) will be easier.</p>
<p>It also makes me feel better about buying more books about Elixir, so I guess it’s good for everyone <img src="https://forum.elixirforum.com/images/emoji/apple/stuck_out_tongue.png?v=15" title=":stuck_out_tongue:" class="emoji" alt=":stuck_out_tongue:" loading="lazy" width="20" height="20"></p>
<blockquote>
<p>When folks started to write Gang of Four style books for other languages (GoF was originally written for C++ iirc), they needed to change and adapt the patterns. Sometimes they needed to make considerable changes. Sometimes they needed to throw patterns away completely because they didn’t make any sense in the new target language. (I’m thinking of the Ruby one especially.)</p>
</blockquote>
<p>This is an important piece of history I didn’t know of and I can only wish I had heard it before!</p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/2X/3/3d911f9fe5dbc74922940a730035f6e1cccf8528.jpeg" data-download-href="https://forum.elixirforum.com/uploads/default/3d911f9fe5dbc74922940a730035f6e1cccf8528" title="IMG_20190424_111339" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/2X/3/3d911f9fe5dbc74922940a730035f6e1cccf8528_2_690x517.jpeg" alt="IMG_20190424_111339" data-base62-sha1="8ME3bIcjmH3XTSGIeZg2n2jJoes" width="690" height="517" srcset="https://forum.elixirforum.com/uploads/default/optimized/2X/3/3d911f9fe5dbc74922940a730035f6e1cccf8528_2_690x517.jpeg, https://forum.elixirforum.com/uploads/default/optimized/2X/3/3d911f9fe5dbc74922940a730035f6e1cccf8528_2_1035x775.jpeg 1.5x, https://forum.elixirforum.com/uploads/default/optimized/2X/3/3d911f9fe5dbc74922940a730035f6e1cccf8528_2_1380x1034.jpeg 2x" data-dominant-color="9C9A9E"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">IMG_20190424_111339</span><span class="informations">1825×1369 223 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125443" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/22">Post #21</a>
	                </div>
	            </div>
              <div id="likers-container-125443" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125443"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #21"></div>
  </section>
</div>
    <div class="postbit" id="125445" data-post-id="125445">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="LostKobrakai" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/LostKobrakai/120/3072_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  LostKobrakai
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Fl4m3Ph03n1x" data-post="22" data-topic="21702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fl4m3ph03n1x/48/11709_2.png" class="avatar"> Fl4m3Ph03n1x:</div>
<blockquote>
<p>In a way, this is both humbling and freeing. Humbling because I have cemented my position as a beginner. It somehow feels like after years of being a Senior in other areas where I had nothing more to really learn, coming to Elixir is almost like going back to level 1.</p>
</blockquote>
</aside>
<p>Consider it the more senior position to be able to answer with “It depends” and being able to select the way forward given your own constraints and not sticking to patterns just for the sake of it.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125445" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-125445" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125445"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #22"></div>
  </section>
</div>
    <div class="postbit" id="125498" data-post-id="125498">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Cruz" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Cruz/120/13700_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Cruz
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Just a couple of comments. I also like patterns, but I understood they were guidelines, not recipes that should be strictly followed. Hence, I could always find ways to adapt a particular pattern to the situation at hand.</p>
<p>What I like the most about them is the way they communicate experience. In particular, how experienced developers approached a particular problem, and why. I think that’s a great way to learn from others.</p>
<p>On that note, you might find this book useful: " Functional Programming Patterns in Scala and Clojure". I haven’t read it yet, but I find the theme very interesting. From the book description:</p>
<blockquote>
<p>For each pattern, you’ll first see the traditional object-oriented solution, and then dig into the functional replacements in both Scala and Clojure. These patterns are common in the functional world and deserve to become part of your problem-solving toolkit. On the object-oriented side, you’ll see many common patterns, such as Command, Strategy, and Null Object. On the functional side, you’ll learn core functional patterns such as Memoization, Lazy Sequence, and Tail Recursion.</p>
</blockquote>
<p>Saludos!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125498" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-125498" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125498"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #23"></div>
  </section>
</div>
    <div class="postbit" id="125501" data-post-id="125501">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Fl4m3Ph03n1x" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Fl4m3Ph03n1x/120/11709_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Fl4m3Ph03n1x
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Cruz" data-post="24" data-topic="21702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/cruz/48/13700_2.png" class="avatar"> Cruz:</div>
<blockquote>
<p>Just a couple of comments. I also like patterns, but I understood they were guidelines, not recipes that should be strictly followed. Hence, I could always find ways to adapt a particular pattern to the situation at hand.</p>
</blockquote>
</aside>
<p>Ok, I feel I need to answer regarding this assumption people are making about me.</p>
<p>Patterns are pre-fabricated solutions extracted from the industry. In the case of the GoF, it took them years to collect all the patterns published.</p>
<p>If you jump into any problem expecting that a pre-fabricated set of solutions is going to be the perfect fit for everything, then you will suffer. However, if you go on with the mindset of re-inventing the wheel, you will be in a world of pain as well.</p>
<p>Obviously, in the end, the “<em>it depends</em>” meme applies to a lot, but you will eventually have to make decisions and having a set of pre-fabricated solutions that you can adapt to your problems is a very useful tool.</p>
<p>Most Seniors know this, and I personally defend that if you just apply patterns right and left without considering their cost, then you are not really a Senior. As Zack says in his mailing lists: “<em>If you don’t know the downsides of the tools you are using, then you don’t really know the tools you are using</em>” (sorry for bad paraphrasing, but this is the conclusion).</p>
<p>Thanks for the book recommendation <a class="mention" href="/u/cruz" rel="nofollow">@Cruz</a> , but I have another one in mind (Functional patterns in F#) <img src="https://forum.elixirforum.com/images/emoji/apple/stuck_out_tongue.png?v=15" title=":stuck_out_tongue:" class="emoji" alt=":stuck_out_tongue:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125501" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-125501" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125501"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #24"></div>
  </section>
</div>
    <div class="postbit" id="125520" data-post-id="125520">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="peerreynders" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/peerreynders/120/5826_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  peerreynders
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Fl4m3Ph03n1x" data-post="22" data-topic="21702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fl4m3ph03n1x/48/11709_2.png" class="avatar"> Fl4m3Ph03n1x:</div>
<blockquote>
<p>I still do, it’s a book I cherish a lot.</p>
</blockquote>
</aside>
<p>To what extent?</p>
<p>One issue with a large part of the readership of <em>Design Patterns: Elements of Reusable Object-Oriented Software</em> is <em>selective</em> reading which focused on <em>applying</em> patterns and not much else.</p>
<p>Seems a lot of people were possibly skipping the <em>Intent</em> and <em>Motivation</em> sections and more importantly the <em>Applicability</em> and <em>Consequences</em> (benefits and <strong>liabilities</strong>, tradeoffs).</p>
<p>Also a significant value of patterns is to serve as a vocabulary for more precise and <a href="https://forum.elixirforum.com/t/scrutinizing-the-role-and-use-of-design-patterns/14319/3" rel="nofollow">effective communication</a>. It makes it possible to reference the pattern in the context of a solution without having to go into nitty gritty detail (repeatedly).</p>
<p>Even with SOLID - “principles” may be too strong, “guidelines” would be more appropriate. And even those guidelines are not context-free. Following those guidelines still makes certain tradeoffs - tradeoffs that may be acceptable in many circumstances, not so much in others.</p>
<p>It’s always important to consider context and understand the tradeoffs.</p>
<p>While you may not agree with every aspect of <a href="https://youtu.be/tMW08JkFrBA?t=493" rel="noopener nofollow ugc">The SOLID Design Principles Deconstructed (2013)</a> it is interesting to see them challenged (<em>if you’re still following the SOLID principles and you regard yourself as a competent developer, you need to start giving them up</em>).</p>
<p>An earlier discussion - applying SRP to Elixir:</p><aside class="quote quote-modified" data-post="1" data-topic="8704">
  <div class="title">
    <div class="quote-controls"></div>
    <img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/astonj/48/15_2.png" class="avatar">
    <div class="quote-title__text-content">
      <a href="https://forum.elixirforum.com/t/single-responsibility-principle-what-does-it-mean-to-you-and-your-elixir-apps/8704" rel="nofollow">Single Responsibility Principle - what does it mean to you and your Elixir apps?</a> <a class="badge-category__wrapper " href="/c/chat-discussions/chat-discussions/167" rel="nofollow"><span data-category-id="167" style="--category-badge-color: #cca771; --category-badge-text-color: #FFFFFF; --parent-category-badge-color: #cca771;" data-parent-category-id="165" data-drop-close="true" class="badge-category --style-square --has-parent"><span class="badge-category__name">Discussions</span></span></a>
    </div>
  </div>
  <blockquote>
    There is a <a href="https://en.wikipedia.org/wiki/Single_responsibility_principle" rel="noopener nofollow ugc">wikipedia definition</a> on this but it doesn’t really cover how you can go further in functional programming. I feel PragDave’s comment (from his <a href="https://forum.elixirforum.com/t/elixir-for-programmers-pragdave/6335" rel="nofollow">course</a>) is better from an Elixir perspective: 

I know I’m like a broken record, but I can’t help it. I’m really excited to see how a functional approach makes it so much easier to honor the SRP, both at the function and module level. The fact that state is passed around, and not simply shared, means that functions can and modules can both be s…
  </blockquote>
</aside>
 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125520" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/26">Post #25</a>
	                </div>
	            </div>
              <div id="likers-container-125520" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125520"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #25"></div>
  </section>
</div>
    <div class="postbit" id="125536" data-post-id="125536">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Fl4m3Ph03n1x" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Fl4m3Ph03n1x/120/11709_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Fl4m3Ph03n1x
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="peerreynders" data-post="26" data-topic="21702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/peerreynders/48/5826_2.png" class="avatar"> peerreynders:</div>
<blockquote>
<p>Seems a lot of people were possibly skipping the <em>Intent</em> and <em>Motivation</em> sections and more importantly the <em>Applicability</em> and <em>Consequences</em> (benefits and <strong>liabilities</strong> , tradeoffs).</p>
</blockquote>
</aside>
<aside class="quote no-group" data-username="Fl4m3Ph03n1x" data-post="25" data-topic="21702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fl4m3ph03n1x/48/11709_2.png" class="avatar"> Fl4m3Ph03n1x:</div>
<blockquote>
<p>“ <em>If you don’t know the downsides of the tools you are using, then you don’t really know the tools you are using</em> ”</p>
</blockquote>
</aside>
<aside class="quote no-group" data-username="peerreynders" data-post="26" data-topic="21702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/peerreynders/48/5826_2.png" class="avatar"> peerreynders:</div>
<blockquote>
<p>While you may not agree with every aspect of <a href="https://youtu.be/tMW08JkFrBA?t=493" rel="noopener nofollow ugc">The SOLID Design Principles Deconstructed (2013)</a></p>
</blockquote>
</aside>
<p>I actually saw that talk a long time ago and it was illuminating. I actually do agree with him in a lot of keypoints <img src="https://forum.elixirforum.com/images/emoji/apple/smiley.png?v=15" title=":smiley:" class="emoji" alt=":smiley:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125536" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/27">Post #26</a>
	                </div>
	            </div>
              <div id="likers-container-125536" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125536"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #26"></div>
  </section>
</div>
    <div class="postbit" id="125537" data-post-id="125537">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="lance" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  lance
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Functional Web Development with Elixir, OTP, and Phoenix</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Fl4m3Ph03n1x" data-post="22" data-topic="21702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fl4m3ph03n1x/48/11709_2.png" class="avatar"> Fl4m3Ph03n1x:</div>
<blockquote>
<p>I am more open minded and reading new books and posts from the community will be easier for me.</p>
</blockquote>
</aside>
<p>Honestly, this is the most important bit in the whole thread for me. Reading (and listening!) with an open mind is an incredibly valuable skill. May it serve you well!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125537" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/28">Post #27</a>
	                </div>
	            </div>
              <div id="likers-container-125537" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125537"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #27"></div>
  </section>
</div>
    <div class="postbit" id="125552" data-post-id="125552">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="peerreynders" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/peerreynders/120/5826_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  peerreynders
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Fl4m3Ph03n1x" data-post="22" data-topic="21702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fl4m3ph03n1x/48/11709_2.png" class="avatar"> Fl4m3Ph03n1x:</div>
<blockquote>
<p>Humbling because I have cemented my position as a beginner.</p>
</blockquote>
</aside>
<p><a href="https://youtu.be/K8nxTSPHZhs?t=190" rel="noopener nofollow ugc">Erlang Master Class 1: Video 8 - Discussion</a></p>
<aside class="quote no-group">
<blockquote>
<p><em>Francesco Cesarini</em>:</p>
<ul>
<li>The first hurdle is pattern matching.</li>
<li>The second hurdle is understanding recursion and the whole concept of tail recursion versus non-tail recursion.</li>
<li>And the third kind of hurdle is thinking concurrently.</li>
</ul>
<p>…<br>
<em>Joe Armstrong</em>: And both of you, what do you think the best way to learn Erlang is?<br>
<em>Simon Thompson</em>: Practice. Practice. … You don’t learn to swim by reading a book about swimming. … things become easier the more you do them.</p>
</blockquote>
</aside>
<p>So you likely got sucked in by the functional (yet sequential) programming part and now are consciously perceiving the third hurdle: thinking concurrently.</p>
<aside class="quote group-Erlang-Core-Team" data-username="rvirding" data-post="20" data-topic="10738">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/rvirding/48/1409_2.png" class="avatar"><a href="/t/10738/20" rel="nofollow">On another topic</a></div>
<blockquote>
<p>In this respect I don’t so much see them as a language with concurrency but a system with a language.</p>
</blockquote>
</aside>
<p>I also think there is a fourth hurdle: supervision - i.e. designing effective supervision trees.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125552" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/29">Post #28</a>
	                </div>
	            </div>
              <div id="likers-container-125552" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125552"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #28"></div>
  </section>
</div>
    <div class="postbit" id="125579" data-post-id="125579">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="alfert" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/alfert/120/2172_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  alfert
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<blockquote>
<p>When I started the book I had a copy of the GoF design patterns right alongside it. I still do, it’s a book I cherish a lot. But I now understand that the Elixir best characteristics are better fostered in a environment not restricted by the patterns of 15 years ago, made for C++.</p>
</blockquote>
<p>Just to add some more history: Peter Norvig put together a nice analysis of the GoF patterns from the point of view of a Lisp programmer (<a href="http://norvig.com/design-patterns/design-patterns.pdf" rel="noopener nofollow ugc">http://norvig.com/design-patterns/design-patterns.pdf</a>). This was in 1996 and revised in 1998. The short summary: In most cases, you don’t need a pattern, you simply use a function or closure. In Elixir, you will find exactly the same situation, including Lisp macros. Don’t try to use OO patterns in a functional programming language…</p>
<blockquote>
<p>In a way, this is both humbling and freeing. Humbling because I have cemented my position as a beginner. It somehow feels like after years of being a Senior in other areas where I had nothing more to really learn, coming to Elixir is almost like going back to level 1.</p>
</blockquote>
<p>Yes, this is the most shocking experience when changing your programming paradigms. I still remember the long time of confusion around 1990 until I understood OO coming from a Pascal background. Similar happened again when changing towards functional / actor-style programming (do you already know about functors and monads <img src="https://forum.elixirforum.com/images/emoji/apple/wink.png?v=15" title=":wink:" class="emoji" alt=":wink:" loading="lazy" width="20" height="20">?) And I am pretty convinced that the same will happen when I dive into logic programming, may it be classical prolog or miniKanren. Take a look into the wonderful book “Structure and Interpretation of Computer Programs” from Abelson and Sussman on how to implement all these programming concepts in a functional setting.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="125579" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/functional-web-development-with-elixir-otp-is-otp-part-of-the-entity-layer/21702/30">Post #29</a>
	                </div>
	            </div>
              <div id="likers-container-125579" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="125579"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>