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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="StefanHoutzager" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  StefanHoutzager
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I never realised that I write elixir in a default way. <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"> Well, the talk could be debunked on this forum also. “Why Dave Thomas’ way is wrong.” With all respect. <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"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82040" 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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/22">Post #21</a>
	                </div>
	            </div>
              <div id="likers-container-82040" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82040"
                     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="82095" data-post-id="82095">
  <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="AstonJ" data-post="21" data-topic="14192">
<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"> AstonJ:</div>
<blockquote>
<p>This might be related…</p>
</blockquote>
</aside>
<p>He already talked about his GenServer concerns back in <a href="https://youtu.be/fTYkbPBOt1o?t=1897" rel="noopener nofollow ugc">ElixirDaze 2017</a> through <a href="https://github.com/pragdave/jeeves" rel="noopener nofollow ugc">Jeeves</a> (<em>Service</em> in the talk) - so it might be something different.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82095" 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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-82095" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82095"
                     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="82096" data-post-id="82096">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>It could be his style of the Replaceable Component Architecture that I am such a huge fan of then <img src="https://forum.elixirforum.com/uploads/default/original/2X/6/6c3193d1dd46244da3c8c6f719c9f5e2abdd5ae8.gif?v=15" title=":003:" class="emoji emoji-custom" alt=":003:" loading="lazy" width="20" height="20"></p>
<p>As discussed <a href="https://forum.elixirforum.com/t/discussion-dont-add-a-database-layer-to-your-phoenix-application/8623" rel="nofollow">here</a> and <a href="https://forum.elixirforum.com/t/single-responsibility-principle-what-does-it-mean-to-you-and-your-elixir-apps/8704" rel="nofollow">here</a> <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" 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="82096" 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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-82096" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82096"
                     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="82097" data-post-id="82097">
  <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">
								<p><a href="https://github.com/pragdave/component" class="onebox" target="_blank" rel="noopener nofollow ugc">https://github.com/pragdave/component</a></p>
<blockquote>
<p>This isn’t the code you’re looking for<br>
Move on…</p>
</blockquote>
<p>Edit:<br>
<a href="https://github.com/pragdave/noddy-test" class="onebox" target="_blank" rel="noopener nofollow ugc">https://github.com/pragdave/noddy-test</a></p>
<p>The two subprojects <code>Comp1</code> and <code>Comp2</code> list in <code>mix.exs</code>:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">  defp deps do
    [
      { :component, path: "../../component" },
    ]
  end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82097" 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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-82097" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82097"
                     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="82099" data-post-id="82099">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Whoo hoo I think that could be it <img src="https://forum.elixirforum.com/uploads/default/original/2X/6/6c3193d1dd46244da3c8c6f719c9f5e2abdd5ae8.gif?v=15" title=":003:" class="emoji emoji-custom" alt=":003:" loading="lazy" width="20" height="20"></p>
<p>Seems like our enthusiasm for his RCA ideas is rubbing back on to him too <img src="https://forum.elixirforum.com/images/emoji/apple/purple_heart.png?v=15" title=":purple_heart:" class="emoji" alt=":purple_heart:" 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="82099" 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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/26">Post #25</a>
	                </div>
	            </div>
              <div id="likers-container-82099" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82099"
                     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="82267" data-post-id="82267">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>wow that’s beautiful</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82267" 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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/27">Post #26</a>
	                </div>
	            </div>
              <div id="likers-container-82267" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82267"
                     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="82285" data-post-id="82285">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Dave gave a talk about components and something he called Noddy for component deployment at Empex the other day. It was interesting, and I’d love to hear what people think once the talks are online.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82285" 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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/28">Post #27</a>
	                </div>
	            </div>
              <div id="likers-container-82285" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82285"
                     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="82343" data-post-id="82343">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="the_wildgoose" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  the_wildgoose
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>In my opinion the discussion here misses Dave’s point?</p>
<p>I think I agree with Robert/Sasa, etc <em>IF</em> you already know you need a genserver. The key thing is that often you are writing a module and you are following Sasa’s advice to start without storing state in the module, and so off you go… But then LATER you decide that you need to “upgrade” to storing state in the module…  THIS is where Dave’s approach wins</p>
<p>So his approach makes more sense (to me) if we assume that we are using it from the point of view of writing a small module which DOES NOT store state or use a genserver.  That gives us 2 modules, one for the public api and one for private implementation.  The third module is what we get once you decide to inflate the public api to use some kind of state storage/genserver.</p>
<p>I thought his approach very elegant from this point of view. Equally I think if you already know you need to store some state and you have some clarity that the module is fairly small in scope, then it probably makes sense to start from Robert’s design…?</p>
<p>Link to Dave’s thoughts:<br>
<a href="https://pragdave.me/blog/2017/07/13/decoupling-interface-and-implementation-in-elixir.html" class="inline-onebox" rel="noopener nofollow ugc">Redirect</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82343" data-batch-url="/posts/batch_likers">
                        3
                      </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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/29">Post #28</a>
	                </div>
	            </div>
              <div id="likers-container-82343" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82343"
                     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="82350" data-post-id="82350">
  <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="the_wildgoose" data-post="29" data-topic="14192">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/3ab097/48.png" class="avatar"> the_wildgoose:</div>
<blockquote>
<p>I think I agree with Robert/Sasa, etc <em>IF</em> you already know you need a genserver.</p>
</blockquote>
</aside>
<p>I’d suspect from their point of view the evolution</p>
<blockquote>
<p>if we assume that we are using it from the point of view of writing a small module which DOES NOT store state or use a genserver. That gives us 2 modules, one for the public api and one for private implementation. The third module is what we get once you decide to inflate the public api to use some kind of state storage/genserver.</p>
</blockquote>
<p>as described isn’t something that happens very often if you’ve worked with the BEAM for a while.</p>
<p>You’d likely keep your processes small (just not <em>too small</em>). The stateless module to stateful server evolution doesn’t sound like a common scenario to me. For small processes, three files can seem a bit much <em>unless</em> you have a good reason to go that route.</p>
<blockquote>
<p>Decouple. You know it makes sense.</p>
</blockquote>
<p>I think that should have been</p>
<blockquote>
<p>Decouple where and when it makes sense.</p>
</blockquote>
<p>Edit:</p>
<p>Actually the more I think about it, the more dangerous this approach seems from a systems perspective. While it seems convenient from a code management perspective (however inconvenient two or three separate files per module/server may be) because <em>you don’t need to change the client calls</em> - consider that you are in fact:</p>
<ul>
<li>ripping perfectly good <em>intra-process sequential code</em> out of the client process</li>
<li>and replacing it with <em>calls <strong>across process boundaries</strong></em></li>
</ul>
<p>That transformation should never be done <em>mindlessly</em>. I’d much rather delete the old module and recreate the server under a new name - in the hopes that compilation will tell me where all the client’s are so that I can verify:</p>
<ul>
<li>whether the client needs additional inter-process safeguards</li>
<li>or if we go with “let it crash”, whether the supervison tree needs to be adjusted to account for the additional failure modes.</li>
</ul>
<p><a href="http://steve.vinoski.net/pdf/IEEE-Convenience_Over_Correctness.pdf" rel="noopener nofollow ugc">Convenience over Correctness (2008)</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82350" data-batch-url="/posts/batch_likers">
                        3
                      </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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/30">Post #29</a>
	                </div>
	            </div>
              <div id="likers-container-82350" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82350"
                     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 #29"></div>
  </section>
</div>
    <div class="postbit" id="82470" data-post-id="82470">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group quote-modified" data-username="peerreynders" data-post="30" data-topic="14192">
<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>
<blockquote>
<p>Decouple where and when it makes sense.</p>
</blockquote>
</blockquote>
</aside>
<p>Reminds of Robert’s KICAS principle, keep it consistent and simple</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82470" 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/elixir-for-programmers-course-should-we-adopt-dave-thomas-way-of-organizing-genservers/14192/31">Post #30</a>
	                </div>
	            </div>
              <div id="likers-container-82470" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82470"
                     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 #30"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/14192/load_more?page=4">Load more posts (2 remaining)</a>
</div></template></turbo-stream>