<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>erlang Archives | Programming Zen</title>
	<atom:link href="https://programmingzen.com/tag/erlang/feed/" rel="self" type="application/rss+xml" />
	<link>https://programmingzen.com/tag/erlang/</link>
	<description>Meditations on programming, startups, and technology</description>
	<lastBuildDate>Thu, 30 Apr 2020 04:01:23 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<site xmlns="com-wordpress:feed-additions:1">1397766</site>	<item>
		<title>Developing with Elixir/OTP Course Review</title>
		<link>https://programmingzen.com/developing-with-elixir-otp-course-review/</link>
					<comments>https://programmingzen.com/developing-with-elixir-otp-course-review/#comments</comments>
		
		<dc:creator><![CDATA[Antonio Cangiano]]></dc:creator>
		<pubDate>Thu, 30 Apr 2020 04:01:22 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[elixir]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[online courses]]></category>
		<category><![CDATA[OTP]]></category>
		<category><![CDATA[pragmaticstudio]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[Ruby]]></category>
		<guid isPermaLink="false">https://programmingzen.com/?p=2457</guid>

					<description><![CDATA[<p>Ruby was the first programming language I truly fell in love with. Yes, I had used several others before (and have since), but Ruby was and still is something dear to me. I can appreciate the usefulness of Python, the simplicity of Go, and the mind-expanding nature of Haskell. Yet, anything that isn&#x2019;t Ruby felt like a usability downgrade. It&#x2019;s all highly subjective, &#xE7;a va sans dire, but Ruby was always my favorite. It&#x2019;s not every day that a language comes along and genuinely excites me to the point of putting Ruby aside (within the scope of what it&#x2019;s great </p>
<p>The post <a href="https://programmingzen.com/developing-with-elixir-otp-course-review/">Developing with Elixir/OTP Course Review</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Ruby was the first programming language I truly fell in love with. Yes, I had used several others before (and have since), but Ruby was and still is something dear to me.</p>



<p>I can appreciate the usefulness of Python, the simplicity of Go, and the mind-expanding nature of Haskell. Yet, anything that isn&#8217;t Ruby felt like a usability downgrade. It&#8217;s all highly subjective, ça va sans dire, but Ruby was always my favorite.</p>



<p>It&#8217;s not every day that a language comes along and genuinely excites me to the point of putting Ruby aside (within the scope of what it&#8217;s great at doing).</p>



<h2 class="wp-block-heading">I &lt;3 Elixir</h2>



<p>That language is Elixir. I&#8217;ve been using it on and off for a few years now. I first <a href="https://programmingzen.com/next-programming-language/">talked about it</a> back in 2016 and even managed to convince my team at IBM to adopt it to an extent. It&#8217;s working out well for us so far and I have a hunch we might double down on it soon.</p>



<p>Since I have a little more time, due to being stuck inside, I&#8217;ve been on a &#8220;study anything in sight related to Elixir and Phoenix&#8221; kick lately.</p>



<p>I am a big fan of Mike and Nicole Clark of The Pragmatic Studio and in the past have highly <a href="https://programmingzen.com/rails-books/">recommended their Ruby and Rails courses</a>. So I decided to start taking their Elixir courses as well. In this post, I&#8217;ll give you a fairly detailed review of their largest course on the subject, <a rel="noreferrer noopener" href="https://pragmaticstudio.com/elixir" target="_blank">Developing with Elixir/OTP</a>.</p>



<h2 class="wp-block-heading">Who is it for?</h2>



<figure class="wp-block-image size-full is-resized"><img data-recalc-dims="1" fetchpriority="high" decoding="async" src="https://i0.wp.com/programmingzen.com/wp-content/uploads/2020/04/developing-with-elixir-otp-review.png?resize=768%2C434&#038;ssl=1" alt="Developing with Elixir/OTP Course Review" class="wp-image-2460" width="768" height="434" srcset="https://i0.wp.com/programmingzen.com/wp-content/uploads/2020/04/developing-with-elixir-otp-review.png?w=1536&amp;ssl=1 1536w, https://i0.wp.com/programmingzen.com/wp-content/uploads/2020/04/developing-with-elixir-otp-review.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/programmingzen.com/wp-content/uploads/2020/04/developing-with-elixir-otp-review.png?resize=1024%2C578&amp;ssl=1 1024w, https://i0.wp.com/programmingzen.com/wp-content/uploads/2020/04/developing-with-elixir-otp-review.png?resize=768%2C434&amp;ssl=1 768w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>Developing with Elixir/OTP is aimed at programmers. It&#8217;s so well explained that beginners can give it a shot, however, they are not the target audience.</p>



<p>The course assumes you have zero knowledge of Elixir itself but it&#8217;s not going to explain basic programming concepts when they are not novel or unique to Elixir.</p>



<p>Experience with Ruby is not required nor assumed, but it&#8217;s beneficial. This isn&#8217;t so much due to the way the course is presented (though there are a couple of nods to Ruby programmers). Rather, it&#8217;s the similarity (on the surface) between the two languages.</p>



<h2 class="wp-block-heading">How much time do you need to invest?</h2>



<p>Developing with Elixir/OTP is a 6.5 hour course divided across 30 modules. There is no way for you to take this course in 6.5 hours and get anything worthwhile from it.</p>



<p>In fact, the secret sauce is that each module has a Notes section dedicated to expanding on the topic, providing tips and tricks, as well as exercises.&nbsp;</p>



<p>I would estimate that it took me around 20 hours or so to finish, despite being very familiar with the subject matter. Mind you, I do like to experiment quite a bit within IEx to veer off the beaten path.</p>



<p>Estimate 30 hours of your time, an hour per module, if you intend to fully absorb and experiment with the material presented.</p>



<p>Unlike their Rails course, you won&#8217;t develop two applications (one while watching the videos and one in the Notes section). In this course, there is only one application that is mostly developed in the videos and then enhanced in the Notes through exercises.</p>



<p>This will save you a lot of time at the small expense of having to pause and resume the video to type along.</p>



<p>Another time-saver is that the code for each module in the course is provided so that you&#8217;re never lost. Particularly useful to copy and paste the more tedious parts (e.g., sample data and template code).</p>



<h2 class="wp-block-heading">What will you build?</h2>



<p>The course starts off by developing a simple web server. Think, high-level transformations of requests into responses. It builds it from the ground up and then layers a simple RESTful API for a fictitious wildlife reserve on top.</p>



<p>They start off with the simplest thing, a function that transforms one specific request into one specific response, and then move up all the way to actually serving the API over HTTP.</p>



<p>The goal, as often stated in the course, is not to replace an established and much more robust web server like Cowboy or a framework like Phoenix. At all.</p>



<p>Instead, it serves two pedagogical purposes. First, it teaches you how to use the language to solve a fairly complex problem. Second, it gives you a deeper understanding of how the production-ready tools you are going to adopt actually work within.</p>



<p>This approach is endemic to their teaching method. For example, they&#8217;ll develop a simple web server and API from scratch and then show you how similar it is to the equivalent Phoenix version. By the time you hit module 17 on Phoenix, you don&#8217;t quite know Phoenix but it should feel oddly familiar. After all, you built a naïve/simplified version of the same controllers, router, templates, etc. from scratch. This is, of course, a deliberate choice.</p>



<p>The same is true when they implement a simple GenServer from scratch and then are able to seamlessly replace it with the real deal (with <code>use GenServer</code>). Yes, you developed the Fisher-Price version of the production-ready tools, but you now understand how they work under the hood. All before Mike and Nicole proceed to teach you how to use the battle-tested ones.</p>



<p>I&#8217;m a fan of this didactic approach and I think it will serve most people well.</p>



<h2 class="wp-block-heading">What will you learn?</h2>



<p>It might be surprising to some but this course does not provide the typical tour of data types and data structures available in the language.</p>



<p>Instead, it uses the language to build something from the beginning and, in the process, it quickly exposes you to a variety of concepts, including how to use common data types.</p>



<p>It doesn&#8217;t cover them thoroughly, however, so reading the <a rel="noreferrer noopener" href="https://elixir-lang.org/getting-started/introduction.html" target="_blank">Elixir tutorial</a> on the official site would be very beneficial prior to or after taking this course.</p>



<p>The course starts off with several modules that are heavily focused on pattern matching. This is a good choice because pattern matching is one of the most valuable and pervasive features of Elixir.</p>



<p>As you would expect, there is also quite a bit of emphasis on immutable data structures, the pipe operator, recursion, and the Enum module.</p>



<p>In the process you&#8217;ll also learn a lot about IEx, Mix, organizing your code in a logical and idiomatic manner, defining Structs as the safer alternatives to maps, and comprehensions. </p>



<p>Testing is covered adequately but not extensively in its own module. Not in a TDD manner from the very start of the course like they did in some of their previous courses. This has, again, didactical advantages even if you choose to adopt TDD in your actual work.</p>



<p>In the second half of the course, things get a little more serious courtesy of OTP, delving deeper into working with sockets, the actor model, Task, GenServer, and linking and monitoring processes.</p>



<h2 class="wp-block-heading">Other points worth making</h2>



<p>In more or less random order:</p>



<ul class="wp-block-list"><li>The course is up to date to Elixir 1.10.x, somewhat rare among Elixir courses. Some of the videos show Mike and Nicole using a previous version (i.e., 1.5), but the Notes use the latest version and the rare differences are noted.  For example, the video shows the old <code>mix new</code> project format which included a <code>config</code> folder. In their hands-on notes for the video, they have a comprehensive &#8220;I don&#8217;t see a config directory&#8221; section to address it. You&#8217;re basically never lost or confused due to version discrepancies.</li><li>The overall quality is excellent. It&#8217;s a really polished product in terms of audio, video, text, and visuals used to aid in explaining the more conceptual parts.</li><li>They answer the overwhelming majority of your &#8220;wait a second&#8221; questions and objections. Either later in the video or right in the notes for that particular module. They genuinely anticipate most questions, which is the hallmark of a great course.</li><li>Most modules have a single 5-15 minute video, but some modules include two videos. So the modules are&#8230; well, modular.</li><li>Although this course will equip you to start studying Phoenix, it doesn&#8217;t really cover the subject. There is a module, as I mentioned, which is just enough to whet your appetite for the framework.</li><li>Erlang interoperability is at least in part addressed in module 20, where sample code from the documentation of <code>gen_tcp</code> is converted from Erlang to Elixir code.</li><li>The course is full of small tips like enabling command history in IEx (with <code>export ERL_AFLAGS="-kernel shell_history enabled"</code>), speeding up unit tests by making them asynchronous (i.e., <code>use ExUnit.Case, async: true</code>), using <code>flush()</code> to clear a process&#8217; mailbox, etc.</li></ul>



<h2 class="wp-block-heading">Is it worth the price?</h2>



<p>At $89, <a href="https://pragmaticstudio.com/elixir">Developing with Elixir/OTP</a> is not your average Udemy course that&#8217;s routinely discounted to $12. That&#8217;s because it&#8217;s not your average course.</p>



<p>If I had to rate it, I&#8217;d give it a 4.5 out of 5. I highly recommend it to working programmers who are interested in picking up Elixir quickly.</p>



<p>I would argue that it&#8217;s a great, current resource that is well worth the price of admission if you favor learning from videos.</p>
<p>The post <a href="https://programmingzen.com/developing-with-elixir-otp-course-review/">Developing with Elixir/OTP Course Review</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://programmingzen.com/developing-with-elixir-otp-course-review/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2457</post-id>	</item>
		<item>
		<title>Elixir Hello World</title>
		<link>https://programmingzen.com/elixir-hello-world/</link>
					<comments>https://programmingzen.com/elixir-hello-world/#respond</comments>
		
		<dc:creator><![CDATA[Antonio Cangiano]]></dc:creator>
		<pubDate>Fri, 11 Oct 2019 04:49:04 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[elixir]]></category>
		<category><![CDATA[elixir-cookbook]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[puts]]></category>
		<category><![CDATA[standard library]]></category>
		<category><![CDATA[strings]]></category>
		<guid isPermaLink="false">https://programmingzen.com/?p=2268</guid>

					<description><![CDATA[<p>It is customary to start programming language tutorials with Hello World programs. So today I&#x2019;m sharing with you a Hello World in Elixir, one of my favorite programming languages (along with Ruby and Python, of course). As you likely know, a Hello World is a very simple program that displays the phrase, Hello, World! Our Elixir Hello World might not be too exciting but it will allow us to discuss quite a few fundamental concepts. Hello World in Elixir As you might expect, this is very straightforward: How to run it The easiest way to run this line of code </p>
<p>The post <a href="https://programmingzen.com/elixir-hello-world/">Elixir Hello World</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>It is customary to start programming language tutorials with Hello World programs. So today I&#8217;m sharing with you a <strong>Hello World in Elixir</strong>, one of my favorite programming languages (along with Ruby and Python, of course).</p>



<p>As you likely know, a Hello World is a very simple program that displays the phrase, <code>Hello, World!</code></p>



<p>Our <strong>Elixir Hello World</strong> might not be too exciting but it will allow us to discuss quite a few fundamental concepts.</p>



<h2 class="wp-block-heading">Hello World in Elixir</h2>



<p>As you might expect, this is very straightforward:</p>



<pre class="wp-block-code"><code>IO.puts("Hello, World!")</code></pre>



<h2 class="wp-block-heading">How to run it</h2>



<p>The easiest way to run this line of code is to launch IEx (i.e., Interactive Elixir). This will also act as a sanity test to ensure that you have installed Elixir correctly on your machine.</p>



<pre class="wp-block-code"><code>$ iex
Erlang/OTP 22 [erts-10.4.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]

Interactive Elixir (1.9.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> </code></pre>



<p>For the best experience on Windows, including tab-based autocompletion in IEx, it&#8217;s worth passing the <code>--werl</code> flag to IEx or permanently enabling it by setting the environment variable <code>IEX_WITH_WERL</code> to <code>true</code>.</p>



<pre class="wp-block-code"><code>C:\> iex --werl</code></pre>



<p>Once you type your Elixir Hello World and press enter, IEx will print out the message <code>Hello, World!</code> and then display the return value of the function, which is the atom <code>:ok</code><sup>1</sup> (indicating that the function executed successfully):</p>



<pre class="wp-block-code"><code>iex(2)> IO.puts("Hello, World!")
Hello, World!
:ok
iex(3)></code></pre>



<p>Alternatively, you could place our one-liner in a <code>hello.exs</code> file and execute it as a script:</p>



<pre class="wp-block-code"><code>$ elixir hello.exs
Hello, World!</code></pre>



<p>You could also create a whole (Mix) project for this, but arguably that is overkill for our humble Hello World. </p>



<h2 class="wp-block-heading">Discussion</h2>



<p><code>puts</code> is a function that prints a message and adds a newline character. <code>write</code> is the variant that does the same but doesn&#8217;t append a newline. They both belong to the <code>IO</code> module, a module that includes, as the name implies, various functions for handling input and output.</p>



<p>At any time, we can learn more about a function by using the <code>h</code> helper within IEx:</p>



<pre class="wp-block-code"><code>iex(3)> h IO.puts

                        def puts(device \\ :stdio, item)

  @spec puts(device(), chardata() | String.Chars.t()) :: :ok

Writes item to the given device, similar to write/2, but adds a newline at the
end.

By default, the device is the standard output. It returns :ok if it succeeds.

## Examples

    IO.puts("Hello World!")
    #=> Hello World!

    IO.puts(:stderr, "error")
    #=> error

iex(4)></code></pre>



<p>Unlike languages like Python and Ruby, in Elixir you need to use a qualified call that includes the module name in order to invoke this function.</p>



<p>If we don&#8217;t qualify the call, we get a compile error:</p>



<pre class="wp-block-code"><code>iex(4)> puts("Hello, World!")
** (CompileError) iex:1: undefined function puts/1</code></pre>



<p>If you wanted to omit the module name, you could import the module (i.e., <code>import IO</code>) beforehand, or more realistically, limit the import to the function(s) that you need:</p>



<pre class="wp-block-code"><code>import IO, only: [puts: 1]

puts("Hello, World!")</code></pre>



<p>That <code>puts: 1</code> indicates that we are specifically importing the version of the function that accepts one argument. You&#8217;ll see that function referred to as <code>IO.puts/1</code> and we say that it has an arity of one or it&#8217;s a one-arity function.</p>



<p>The arity of a function (i.e., the number of arguments it accepts) is important because in Elixir you can have functions with the same name but different arities.</p>



<p>In fact, there are technically two variants of the <code>puts</code> function, <code>IO.puts/1</code> which we just used, and <code>IO.puts/2</code> which also allows us to specify an IO device as its first argument. (I say <em>technically</em> because they are both declared within a single function definition.)</p>



<p>By default, the function prints to the standard output. This can be easily verified by looking at the Elixir source code:</p>



<pre class="wp-block-code"><code>def puts(device \\ :stdio, item) do
  :io.put_chars(map_dev(device), [to_chardata(item), ?\n])
end</code></pre>



<p>As you can see, the underlying implementation makes a call to the Erlang&#8217;s <code>IO.put_chars/2</code> function.</p>



<p>What&#8217;s worth noting here is that:</p>



<ul class="wp-block-list"><li>In Elixir, default parameters can be specified using <code>\\</code>.</li><li>The default IO device for the function is the atom <code>:stdio</code> which maps to <code>:standard_io</code> in Erlang. Basically, by default, it will print to your stdout unless you pass a different device to the function.</li><li>Another common value for the device is <code>:stderr</code> which is a shortcut for Erlang&#8217;s <code>:standard_error</code>.</li><li>When we call the function without a device (leveraging the default parameter) we are calling <code>IO.puts/1</code>. When we pass it a device as its first argument and a string as its second argument, we are calling <code>IO.puts/2</code>.</li></ul>



<p>In practice, you&#8217;ll most commonly use <code>IO.puts/2</code> when printing to the standard error, instead of the standard output:</p>



<pre class="wp-block-code"><code>iex(5)> IO.puts(:stderr, "Hello, Post-Apocalyptic World!")
Hello, Post-Apocalyptic World!
:ok</code></pre>



<p>For such messages, there are also <code>IO.warn/1</code> (used below) and <code>IO.warn/2</code> which output to the standard error and in addition, include a stacktrace (provided by the developer in the case of <code>IO.warn/2</code>).</p>



<pre class="wp-block-code"><code>iex(6)> IO.warn("Hello, Post-Apocalyptic World!")
warning: Hello, Post-Apocalyptic World!
  (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
  (elixir) src/elixir.erl:275: :elixir.eval_forms/4
  (iex) lib/iex/evaluator.ex:257: IEx.Evaluator.handle_eval/5
  (iex) lib/iex/evaluator.ex:237: IEx.Evaluator.do_eval/3
  (iex) lib/iex/evaluator.ex:215: IEx.Evaluator.eval/3

:ok</code></pre>



<p>In most cases, parentheses are optional in Elixir, so we could omit them.<sup>2</sup></p>



<pre class="wp-block-code"><code>IO.puts "Hello, World!"</code></pre>



<p>It&#8217;s worth noting that strings are double-quoted literals in Elixir. Unlike other languages, single-quoted literals are not an alternative way of representing strings.</p>



<p>In Elixir, single-quoted literals represent a related but ultimately different datatype (i.e., List), as we can verify by using the handy data type information helper <code>i</code> in IEx:</p>



<pre class="wp-block-code"><code>iex(7)> i "Hello, World!"
Term
  "Hello, World!"
Data type
  BitString
Byte size
  13
Description
  This is a string: a UTF-8 encoded binary. It's printed surrounded by
  "double quotes" because all UTF-8 encoded code points in it are printable.
Raw representation
  &lt;&lt;72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33>>
Reference modules
  String, :binary
Implemented protocols
  Collectable, IEx.Info, Inspect, List.Chars, String.Chars

iex(8)> i 'Hello, World!'
Term
  'Hello, World!'
Data type
  List
Description
  This is a list of integers that is printed as a sequence of characters
  delimited by single quotes because all the integers in it represent printable
  ASCII characters. Conventionally, a list of Unicode code points is known as a
  charlist and a list of ASCII characters is a subset of it.
Raw representation
  [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33]
Reference modules
  List
Implemented protocols
  Collectable, Enumerable, IEx.Info, Inspect, List.Chars, String.Chars
iex(9)></code></pre>



<p>Strings are encoded in UTF-8, so you can use special characters and even emojis.</p>



<pre><code class="prettyprinted">iex(9)&gt; IO.puts("Fabrizio De André")
Fabrizio De André
:ok

iex(10)&gt; IO.puts("Hello, &#127758;!")
Hello, &#127758;!
:ok</code></pre>



<p>It&#8217;s also possible to print a given character by specifying its UTF-8 codepoint.</p>



<pre><code class="prettyprinted">iex(11)> > IO.puts("Hello, #{<<127758 :: utf8>>}!")
Hello, &#127758;!
:ok</code></pre>



<p>If you are familiar with Ruby, you&#8217;ll recognize the same string interpolation syntax in which the expression that needs to be evaluated is enclosed within <code>#{}</code>.</p>



<p>Windows users encountering issues related to special characters can improve their experience by changing the active console code page by executing <code>chcp 65001</code> in their Command Prompt, before executing IEx.</p>



<p>It doesn&#8217;t get any simpler than a Hello World program, but as you can see, if you dig a little deeper, you can find out quite a few things about a given programming language.</p>



<p>In the next Elixir-related post, I&#8217;ll publish a similar discussion for another seemingly trivial problem: the length of a string in Elixir. It will give us an opportunity to discuss strings more deeply. Subscribe, if you don&#8217;t already, to be notified of its publication.</p>



<h2 class="wp-block-heading">Footnotes</h2>



<ol class="wp-block-list"><li>Atoms are constants whose values are their own names. The value of <code>:ok</code> is <code>:ok</code>. If you are familiar with Ruby, atoms are equivalent to symbols.</li><li>A glaring exception to the parentheses being optional are non-qualified/local calls with zero-arity. In those cases, parentheses are required to distinguish simple variables (e.g., <code>user_list</code>) from actual function calls (e.g., <code>list_user()</code>). To avoid ambiguity, it&#8217;s also important to include parentheses with one-arity functions within pipelines (e.g., <code>"Hello, World!" |&gt; IO.puts()</code>). For stylistic recommendations of when to use parentheses and when to omit them, consider reading these two style guides (<a href="https://github.com/christopheradams/elixir_style_guide#parentheses">1</a>, <a href="https://github.com/lexmag/elixir-style-guide#parentheses">2</a>). At any rate, do not obsess over this. <code>mix format</code> or a properly configured editor will typically take care of applying idiomatic and consistent styling for you.</li></ol>
<p>The post <a href="https://programmingzen.com/elixir-hello-world/">Elixir Hello World</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://programmingzen.com/elixir-hello-world/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2268</post-id>	</item>
		<item>
		<title>A Language for the Next 10 Years</title>
		<link>https://programmingzen.com/next-programming-language/</link>
					<comments>https://programmingzen.com/next-programming-language/#comments</comments>
		
		<dc:creator><![CDATA[Antonio Cangiano]]></dc:creator>
		<pubDate>Tue, 14 Jun 2016 16:30:22 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[beam]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[elixir]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[language for the next decade]]></category>
		<category><![CDATA[programming languages]]></category>
		<category><![CDATA[trends]]></category>
		<guid isPermaLink="false">http://programmingzen.com/?p=1679</guid>

					<description><![CDATA[<p>In early 2006 I had just started my career in IBM. I was the &#x201C;Ruby Guy&#x201D; (or alternatively, the &#x201C;Rails Guy&#x201D;). During a meeting with a few high-profile engineers, I presented what Ruby brought to the table. An IBM Distinguished Engineer stopped me in my tracks and said, &#x201C;It sounds slow&#x201D;. I love Ruby as much as a programmer can possibly love a programming language, but that engineer&#x2019;s conjecture was right on the money. Ruby&#x2019;s emphasis has always been on programmer efficiency, not execution efficiency. Generally speaking, Ruby programs are significantly slower than equivalent programs in C or Java. A </p>
<p>The post <a href="https://programmingzen.com/next-programming-language/">A Language for the Next 10 Years</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In early 2006 I had just started my career in IBM. I was the “Ruby Guy”<a id="fnref:1" class="footnote" title="see footnote" href="#fn:1">[1]</a> (or alternatively, the “Rails Guy”).</p>
<p>During a meeting with a few high-profile engineers, I presented what Ruby brought to the table. An IBM Distinguished Engineer<a id="fnref:2" class="footnote" title="see footnote" href="#fn:2">[2]</a> stopped me in my tracks and said, “It sounds slow”.</p>
<p>I love Ruby as much as a programmer can possibly love a programming language, but that engineer’s conjecture was right on the money. Ruby’s emphasis has always been on programmer efficiency, not execution efficiency.</p>
<p>Generally speaking, Ruby programs are significantly slower than equivalent programs in C or Java.</p>
<p>A lot of work has been done to improve Ruby’s performance, with a good degree of success, and that’s terrific &#8211; but is it enough in today’s world?</p>
<p>In many ways, yes. You’re not going to employ Ruby to calculate 13 trillion digits of Pi, nor will you use it to power the backend of a messaging app with millions of users.</p>
<p>However, Ruby will suit most scripts just fine. Further, I would argue that Rails still gives you the best bang for your buck in terms of web frameworks, when it comes to a large subset of CRUD-based web applications.</p>
<p>Ruby is lovely and has many uses, however, what Ruby is not, is the language that will define the next ten years. As beautifully designed as it is, it simply isn’t the ideal language to tackle the challenges that an increasingly distributed world throws at us.</p>
<p>Concurrency is the name of the game, and Ruby is, for the most part, limited in its ability to cope with it (despite <a href="https://github.com/ruby-concurrency/concurrent-ruby">valuable efforts</a>). It’s not that you can’t do concurrency in Ruby, it’s that there are much better, battle-tested tools to do so.</p>
<p>If you are a fellow Ruby developer who would like to remain relevant in the next decade, I highly suggest that you start looking for something new to pair to Ruby as your main language. (Though, fair warning, you might end up replacing Ruby with it.)</p>
<p>Your main language for the next ten years will be highly dependent on the development context, of course. If you develop iOS apps, Swift is such a language. Android apps? <a href="https://kotlinlang.org/">Kotlin</a> is looking good and might have a shot at that. Data Science? <a href="https://julialang.org/">Julia</a>, if they can sort out a few performance issues, could get the edge over Python and R. System programming? <a href="https://www.rust-lang.org/">Rust</a> and Go will be worth a close look, too.<a id="fnref:3" class="footnote" title="see footnote" href="#fn:3">[3]</a></p>
<p>I’m enough of a generalist to dabble in many programming domains, but above all, I’m a web developer, so my main language for the next decade will have to excel in distributed environments where n machines make m requests, for large values of n and m (e.g., IoT alone enables this scenario).</p>
<p>So what comes after Ruby? Some people might argue that it’s Node.js. Not for me personally, though. I’m afraid Ruby has spoiled me. I find Ruby to be a joy to use. JavaScript, not so much.</p>
<p>We are looking for a high-level language that can handle concurrency like a champ, has an elegant, highly readable syntax, provides a great user experience for the developer, and… is functional. In short, fun and functional. 🙂</p>
<p>I find functional programming (with immutable data types) to be a significantly better approach to thinking about most problems, and modeling solutions for them, than Object Oriented programming.<a id="fnref:4" class="footnote" title="see footnote" href="#fn:4">[4]</a> I blame my past dabbling with Haskell and Clojure for this.</p>
<p>Speaking of Clojure, on the JVM, both Scala (w/ Akka), and Clojure (w/ STM &amp; Pulsar) are valid options.</p>
<p>Of the two, Clojure is the one that comes closer to a great fit for me. Very close. Unfortunately, I&#8217;m somewhat of an aesthete, and coming from Ruby, the Lisp syntax still feels like a downgrade.<a id="fnref:5" class="footnote" title="see footnote" href="#fn:5">[5]</a></p>
<p>Further, the JVM is great, but when it comes to dependable concurrency, you really can’t beat what the Erlang VM (i.e., BEAM) has to offer (<a href="https://www.fastcompany.com/3026758/inside-erlang-the-rare-programming-language-behind-whatsapps-success">ask the team at Whatsapp</a>).</p>
<p>The problem with Erlang is that its Prolog-like syntax feels obsolete. I have never seen an Erlang program and said to myself, “Wow, that was a joy to read”. Or refactor. It’s not the worst, but I personally find it to be a fairly uninspiring language to work with.</p>
<p><img data-recalc-dims="1" decoding="async" style="display: block; margin-left: auto; margin-right: auto;" title="Expression terminators in Erland.jpg" src="https://i0.wp.com/programmingzen.com/wp-content/uploads/2016/06/Expression-terminators-in-Erland.jpg?resize=500%2C272&#038;ssl=1" alt="Expression terminators in Erlang" width="500" height="272" border="0" /></p>
<p>Thankfully Erlang is not the only language for its highly fault-tolerant and concurrent VM. There is indeed a language worth getting excited about.</p>
<p>For me, that language is Elixir. Elixir fits all the requirements above and feels like a joy to both read and use.</p>
<p><img data-recalc-dims="1" decoding="async" style="float: right;" title="Elixir.gif" src="https://i0.wp.com/programmingzen.com/wp-content/uploads/2016/06/Elixir.gif?resize=100%2C191&#038;ssl=1" alt="Elixir" width="100" height="191" border="0" /></p>
<p>Like many other Rubyists, when I first found Elixir I thought of it as Ruby for the Erlang VM, due to its largely familiar syntax. But it turns out to be so much more than that. In fact, it’s much more than Erlang as well.</p>
<p>To hastily summarize, we get:</p>
<ul>
<li>A highly readable, elegant, concurrent, functional programming language.</li>
<li>The fantastic Erlang VM (i.e., BEAM) and OTP integration.</li>
<li>Shared nothing Actor-based concurrency.</li>
<li>Metaprogramming via macros.</li>
<li>Polymorphism via protocols.</li>
<li>A whole host of other nice features (pipeline operator, pattern matching, docstrings, streams, mix, etc).</li>
<li>An excellent web framework called <a href="https://www.phoenixframework.org/">Phoenix</a>.</li>
<li>A fast growing supportive community, that it’s reminiscent of Ruby during the early days of Rails.</li>
</ul>
<p>Ruby’s usage skyrocketed in the past decade and I would argue that Elixir, though not widely adopted as of yet, is well equipped to do the same in the coming ten years.</p>
<p><a href="https://elixir-lang.org/">Give it a try</a> and let me know how you like it.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">Though <a href="https://en.wikipedia.org/wiki/Sam_Ruby">Sam</a> was both literally and figuratively a Ruby guy. 😉  <a class="reversefootnote" title="return to article" href="#fnref:1">^</a></li>
<li id="fn:2">Now an IBM Fellow, which is the highest honor a tech person at IBM can achieve. It’s worth noting that I had not mentioned performance at all until that point. He simply figured it out based on the features of the language.  <a class="reversefootnote" title="return to article" href="#fnref:2">^</a></li>
<li id="fn:3">Some might like <a href="https://nim-lang.org/">Nim</a>, instead. <a href="https://crystal-lang.org/">Crystal</a>, with its Ruby-like syntax, is probably the most interesting option for Rubyists, despite being at very early stages of development.  <a class="reversefootnote" title="return to article" href="#fnref:3">^</a></li>
<li id="fn:4">I suspect that the next decade, outside of system programming, will belong to functional languages (or hybrid languages heavily influenced by functional programming).  <a class="reversefootnote" title="return to article" href="#fnref:4">^</a></li>
<li id="fn:5">I know, I know, I’m putting a lot of emphasis on syntax. That’s because it matters more than most people give it credit for.  <a class="reversefootnote" title="return to article" href="#fnref:5">^</a></li>
</ol>
</div>
<p>The post <a href="https://programmingzen.com/next-programming-language/">A Language for the Next 10 Years</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://programmingzen.com/next-programming-language/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1679</post-id>	</item>
	</channel>
</rss>
