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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sabiwara" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sabiwara/120/18612_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sabiwara
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Elixir Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="aochagavia" data-post="1" data-topic="48968">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aochagavia/48/27092_2.png" class="avatar"> aochagavia:</div>
<blockquote>
<p>Rename functions, modules, struct fields, etc and have their usages automatically updated.</p>
</blockquote>
</aside>
<p>This <a href="https://github.com/hrzndhrn/recode" rel="noopener nofollow ugc">library</a> has just been published, I haven’t tried it yet and it seems fairly early stage but it could be helping with the refactoring story.</p>
<aside class="quote no-group" data-username="aochagavia" data-post="1" data-topic="48968">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aochagavia/48/27092_2.png" class="avatar"> aochagavia:</div>
<blockquote>
<p>A strict compiler that catches type errors</p>
</blockquote>
</aside>
<p>I understand that Dialyzer and typespecs do not provide the experience you’re looking for, but the new <code>missing_return</code> and <code>extra_return</code> <a href="https://www.erlang.org/news/157#dialyzer" rel="nofollow">flags added in OTP25</a> are quite a nice improvement. I was never able to turn on <code>underspecs</code>/<code>overspecs</code> due to the amount of false positives, but the new flags are catching legit type errors.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="255856" 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/adapting-to-elixir-coming-from-c-and-typescript/48968/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-255856" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="255856"
                     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 #11"></div>
  </section>
</div>
    <div class="postbit" id="256163" data-post-id="256163">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>For what it’s worth, in Jose’s 10yr talk he speaks about prioritizing the IDE experience to make Elixir more accessible and make the learning process easier. It’s toward the end of the presentation here <a href="https://youtu.be/Jf5Hsa1KOc8" rel="noopener nofollow ugc">https://youtu.be/Jf5Hsa1KOc8</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="256163" 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/adapting-to-elixir-coming-from-c-and-typescript/48968/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-256163" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="256163"
                     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 #12"></div>
  </section>
</div>
    <div class="postbit" id="256203" data-post-id="256203">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hi <a class="mention" href="/u/aochagavia" rel="nofollow">@aochagavia</a>! I also came to Elixir from statically typed languages, one of which was F#. I am still struggling a bit with Elixir to a degree because with dynamic languages, there seem to be a wide variety of different styles of programming. For me, I find it unacceptable to have to read a function’s (and its subfunctions’) implementations to understand what it does. I want <code>@typedoc</code> and <code>@spec</code> and the function and argument names to tell me that. I don’t think you’ll necessarily find that in most Elixir codebases. However, many seemingly seem comfortable moving through such codebases and making changes. I’m simultaneously impressed but also suspicious, because I have found several bugs because of this in those codebases.</p>
<p>For me personally, I use Visual Studio Code with the ElixirLS extension (<a href="https://marketplace.visualstudio.com/items?itemName=JakeBecker.elixir-ls" class="inline-onebox" rel="noopener nofollow ugc">ElixirLS: Elixir support and debugger - Visual Studio Marketplace</a>). The extension plus features of Visual Studio Code can help <em>somewhat</em> for your (1) and (2) but definitely not what you’re used to with Visual Studio (I presume). But as far as I know, it’s about as good as you’re going to get right now. For (3), ElixirLS will dynamically display type information, but it’s usually way too generic to be useful. I personally shoot for 100% coverage of typespecs (I see almost no reason not to) and then use Dialyzer. Dialyzer is not really a type checker. It’s sort of its own thing, but it’s as close as you’re going to get to help with this.</p>
<p>In Elixir, you can accomplish type-driven development, and this is definitely something I strive for. Use structs as much as possible and define <code>@type t() :: ...</code> for them so that you can use that type definition in modules that use your structure, including in the module that defines that struct with <code>__MODULE__.t()</code>. I also heavily use <code>@type</code> definitions to create domain-specific types that help make my code easier to read and understand, while also utilizing Dialyzer.</p>
<p>For the most part, I’d say 95% of code away from I/O and process/message boundaries in Elixir and Erlang does not need to be dynamic. So, I treat if it was statically typed via detailed <code>@spec</code> usage, clear argument names, custom <code>@type</code> definitions, and using Dialyzer.</p>
<p>This is certainly an opinionated stance, but I personally see no other way to write solid code that is easily read and maintained and can onboard new developers.</p>
<p>There is no fundamental reason why an advanced and modern IDE experience doesn’t exist yet. It’s just that Elixir is new and it hasn’t been taken on by somebody.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="256203" 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/adapting-to-elixir-coming-from-c-and-typescript/48968/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-256203" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="256203"
                     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>