readability/test/fixtures/medium.html

9 lines
76 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html xmlns:cc="http://creativecommons.org/ns#"><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# medium-com: http://ogp.me/ns/fb/medium-com#"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Why Im betting on Elixir — Medium</title><link rel="canonical" href="https://medium.com/@kenmazaika/why-im-betting-on-elixir-7c8f847b58"><meta name="title" content="Why Im betting on Elixir"><meta name="referrer" content="always"><meta name="description" content="And why you should too, unless you want to become a maintenance programmer."><meta property="og:site_name" content="Medium"><meta property="og:title" content="Why Im betting on Elixir"><meta property="og:url" content="https://medium.com/@kenmazaika/why-im-betting-on-elixir-7c8f847b58"><meta property="og:image" content="https://cdn-images-1.medium.com/max/1200/1*tdLleNZLHbx2zfZBUCLqTw.png"><meta property="fb:app_id" content="542599432471018"><meta property="og:description" content="And why you should too, unless you want to become a maintenance programmer."><meta name="twitter:site" content="@Medium"><meta name="twitter:image:src" content="https://cdn-images-1.medium.com/max/1200/1*tdLleNZLHbx2zfZBUCLqTw.png"><link rel="publisher" href="https://plus.google.com/103654360130207659246"><link rel="author" href="https://medium.com/@kenmazaika"><meta name="author" content="Ken Mazaika"><meta property="og:type" content="article"><meta name="twitter:card" content="summary_large_image"><meta property="article:publisher" content="https://www.facebook.com/medium"><meta property="article:author" content="https://medium.com/@kenmazaika"><meta property="fb:smart_publish:robots" content="noauto"><meta property="article:published_time" content="2015-01-31T22:58:05.645Z"><meta name="twitter:creator" content="@KenMazaika"><meta name="twitter:label1" value="Reading time"><meta name="twitter:data1" value="6 mins"><meta name="twitter:app:name:iphone" content="Medium"><meta name="twitter:app:id:iphone" content="828256236"><meta name="twitter:app:url:iphone" content="medium://p/7c8f847b58"><meta property="al:ios:app_name" content="Medium"><meta property="al:ios:app_store_id" content="828256236"><meta property="al:android:package" content="com.medium.reader"><meta property="al:android:app_name" content="Medium"><meta property="al:ios:url" content="medium://p/7c8f847b58"><meta property="al:android:url" content="medium://p/7c8f847b58"><meta property="al:web:url" content="https://medium.com/@kenmazaika/why-im-betting-on-elixir-7c8f847b58"><link rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/7c8f847b58" /><meta name="theme-color" content="#000000"><link rel="stylesheet" type="text/css" href="https://cdn-static-1.medium.com/_/fp/css/fonts-base.by5Oi_VbnwEIvhnWIsuUjA.css" /><link rel="stylesheet" href="https://cdn-static-1.medium.com/_/fp/css/main-base.D9oFDWv7e_HqE2JUksWc_A.css"><script>if (window.top !== window.self) window.top.location = window.self.location.href;var OB_startTime = new Date().getTime(); var OB_loadErrors = []; function _onerror(e) { OB_loadErrors.push(e) }; if (document.addEventListener) document.addEventListener("error", _onerror, true); else if (document.attachEvent) document.attachEvent("onerror", _onerror); function _asyncScript(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = u; f.parentNode.insertBefore(s, f);}function _asyncStyles(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("link"); s.rel = "stylesheet"; s.href = u; f.parentNode.insertBefore(s, f); return s}var _gaq = _gaq || []; _gaq.push(["_setAccount", "UA-24232453-2"]); _gaq.push(["_setDomainName", window.location.hostname]); _gaq.push(["_setAllowLinker", true]); _gaq.push(["_trackPageview"]); _asyncScript(("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js");(new Image()).src = "/_/stat?event=pixel.load&origin=" + encodeURIComponent(location.origin);</script><!--[if lt IE 9]><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.js"></script><![endif]--><link rel="shortcut icon" href="https://cdn-static-1.medium.com/_/fp/icons/favicon-medium.TAS6uQ-Y7kcKgi0xjcYHXw.ico" class="js-favicon is-default"><link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-ipad-retina.png"><link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-iphone-retina.png"><link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-ipad.png"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="mask-icon" href="/favicon.svg" color="#171717"></head><body itemscope itemtype="http://schema.org/Article" class=" postShowScreen browser-chrome os-mac is-withMagicUnderlines is-noJs"><script>document.body.className = document.body.className.replace(/(^|\s)is-noJs(\s|$)/, "$1is-js$2")</script><div class="site-main" id="container"><div class="butterBar butterBar--error"></div><div class="surface"><div id="prerendered" class="screenContent"><canvas class="canvas-renderer"></canvas><nav class="metabar u-clearfix js-metabar metabar--top metabar--centered metabar--postArticle"><div class="metabar-inner u-size1000 u-marginAuto u-xs-left20 u-xs-right20"><div class="metabar-block metabar-block--left u-floatLeft"><a href="https://medium.com/" class="siteNav-logo" data-log-event="home"><svg viewBox="0 0 45 45" width="45" height="45" class="svgIcon svgIcon--logoNew svgIcon-size--45px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-logoNew-45px-p0"></use><use class="svgIcon-use svgIcon-use--part1" xlink:href="#svg-logoNew-45px-p1"></use><use class="svgIcon-use svgIcon-use--part2" xlink:href="#svg-logoNew-45px-p2"></use><use class="svgIcon-use svgIcon-use--part3" xlink:href="#svg-logoNew-45px-p3"></use></svg><span class="u-textScreenReader">Homepage</span></a></div><div class="metabar-block metabar-block--right u-floatRight"><div class="buttonSet buttonSet--wide"></div><div class="buttonSet"><a class="button button--primary button--chromeless u-accentColor--buttonNormal is-inSiteNavBar u-marginRight15" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fmedium.com%3A443%2F%40kenmazaika%2Fwhy-im-betting-on-elixir-7c8f847b58"data-action="sign-in-prompt"data-redirect="https://medium.com:443/@kenmazaika/why-im-betting-on-elixir-7c8f847b58" data-action-source="nav_signup">Sign in / Sign up</a><label class="inputGroup u-sm-hide metabar-predictiveSearch u-baseColor--placeholderNormal metabar-predictiveSearch--simplified" title="Search Medium"><svg viewBox="0 0 25 25" width="25" height="25" class="svgIcon svgIcon--search svgIcon-size--25px u-baseColor--iconNormal"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-search-25px-p0"></use></svg><input class="js-predictiveSearchInput textInput textInput--rounded textInput--darkText u-baseColor--textNormal textInput--transparent" type="search" placeholder="Search Medium" /></label><a class="button button--chromeless u-showOnTablet u-baseColor--buttonNormal button--withIcon" href="https://medium.com/search" title="Search" aria-label="Search"><span class="button-defaultState"><svg viewBox="0 0 25 25" width="25" height="25" class="svgIcon svgIcon--search svgIcon-size--25px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-search-25px-p0"></use></svg></span></a></div></div></div></nav><div class="postActionsBar js-postActionsBar"><div class="postActionsBar-container container u-size740"><div class="postActionsBar-content row js-postActionsBarContent"><div class="postActions col u-xs-size12of12"><div class="u-floatLeft buttonSet buttonSet--withLabels"><div class="buttonSet-inner"><div class="js-actionRecommend" data-post-id="7c8f847b58" data-size="29px"><button class="button button--primary button--large button--chromeless u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it"data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/7c8f847b58"><span class="button-defaultState"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--heart svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-heart-29px-p0"></use></svg></span><span class="button-activeState"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--heartFilled svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-heartFilled-29px-p0"></use></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal" data-action="show-recommends" data-action-value="7c8f847b58">761</button></div></div><div class="buttonSet-inner"><button class="button button--large button--dark button--chromeless u-baseColor--buttonDark button--withIcon button--withSvgIcon" data-action="scroll-to-responses"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--response svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-response-29px-p0"></use></svg></button><button class="button button--chromeless u-baseColor--buttonNormal" data-action="scroll-to-responses">15</button></div></div><div class="u-floatRight buttonSet"><div class="buttonSet-inner"><button class="button button--large button--dark button--chromeless u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_actions_bar"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--twitter svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-twitter-29px-p0"></use></svg></button></div><div class="buttonSet-inner"><button class="button button--large button--dark button--chromeless u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_actions_bar"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--facebook svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-facebook-29px-p0"></use></svg></button></div><div class="buttonSet-separator"></div><div class="buttonSet-inner"><a class="link avatar avatar--inline u-baseColor--link" href="https://medium.com/@kenmazaika" data-action="show-user-card" data-action-type="hover" data-user-id="18c72d00861" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/24/24/0*sLJSyB3q7Q-67HVG.jpeg" class="avatar-image avatar-image--micro" alt="Go to the profile of Ken Mazaika"><span class="avatar-text">Ken Mazaika</span></a><span class="u-xs-hide"><span class="middotDivider"></span><span class="followState js-followState" data-user-id="18c72d00861"><button class="button button--chromeless u-noUserSelect u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="post_actions_bar"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary button--chromeless u-noUserSelect u-accentColor--buttonNormal button--follow js-followButton" title="Follow to get new stories and recommendations from this author" aria-label="Follow to get new stories and recommendations from this author"data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/18c72d00861/7c8f847b58" data-action-source="post_actions_bar_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span></span></div></div></div></div></div></div><article class="u-sizeViewHeightMin100 postArticle postArticle--full" lang="en"><header class="container is-underMetabar u-size740"><div class="row u-showOnMobile"><div class="col u-xs-size12of12 u-xs-bottom10"><div class="postMetaHeader-socialProof"></div></div></div><div class="postMetaHeader row u-xs-top10 u-xs-bottom10"><div class="col u-sm-size5of12"><div class="u-floatLeft"><div class="postMetaInline-avatar"><a class="link avatar u-baseColor--link" href="https://medium.com/@kenmazaika" data-action="show-user-card" data-action-type="hover" data-user-id="18c72d00861" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/36/36/0*sLJSyB3q7Q-67HVG.jpeg" class="avatar-image u-xs-size32x32 u-sm-size36x36" alt="Go to the profile of Ken Mazaika"></a></div><div class="postMetaInline-feedSummary"><a class="link link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@kenmazaika" data-action="show-user-card" data-action-type="hover" data-user-id="18c72d00861" dir="auto">Ken Mazaika</a><span class="postMetaInline postMetaInline--supplemental">Feb 1, 2015<span class="middotDivider"></span><span class="readingTime">7 min read</span></span></div></div></div><div class="col u-sm-size7of12 u-xs-hide"><div class="u-floatRight u-textAlignRight"><div class="postMetaHeader-socialProof"></div></div></div></div></header><main role="main" class="postArticle-content js-postField js-notesSource"><section name="b51d" class=" section--body section--topCenter section-image--aspectRatioViewport is-imageBackgrounded is-backgrounded is-darkBackgrounded u-imageSpectrum section--first"><div class="section-background" data-scroll="aspect-ratio-viewport"contenteditable="false" data-image-id="1*tdLleNZLHbx2zfZBUCLqTw.png" data-width="1165" data-height="541"><div class="section-backgroundImage"style="background-image: url(https://cdn-images-1.medium.com/max/1600/1*tdLleNZLHbx2zfZBUCLqTw.png);"></div><br></div><div class="section-doubleWidthTable u-table u-ignoreBlock"><div class="u-tableCell u-verticalAlignTop u-ignoreBlock"><div class="section-aspectRatioViewportBottomSpacer u-ignoreBlock"><div class="u-ignoreBlock" style="padding-bottom: 23.2189%;"></div></div><div class="section-doubleWidthTable u-table u-ignoreBlock"><div class="section-contentCell u-tableCell u-ignoreBlock"><div class="section-content"><div class="section-inner layoutSingleColumn"><h2 name="dcd7" id="dcd7" class="graf--h2 graf--first">Why Im betting on Elixir</h2><h3 name="e035" id="e035" class="graf--h3 graf-after--h2 graf--last">And why you should too, unless you want to become a maintenance programmer.</h3></div></div></div><div class="u-tableCell u-verticalAlignTop u-ignoreBlock"><div class="section-aspectRatioViewportPlaceholder u-ignoreBlock"><div class="u-ignoreBlock" style="padding-bottom: 46.4378%;"></div></div><div class="section-aspectRatioViewportBottomPlaceholder u-ignoreBlock"><div class="u-ignoreBlock" style="padding-bottom: 23.2189%;"></div></div></div></div></div><div class="u-tableCell u-ignoreBlock"><div class="section-aspectRatioViewportCropPlaceholder u-ignoreBlock"><div class="u-ignoreBlock" style="padding-bottom: 46.4378%;"></div></div></div></div><div class="section-captionContent u-ignoreBlock"></div></section><section name="0100" class=" section--body section--last"><div class="section-divider layoutSingleColumn"><hr class="section-divider"></div><div class="section-content"><div class="section-inner layoutSingleColumn"><p name="3476" id="3476" class="graf--p graf--first"><strong class="markup--strong markup--p-strong"><em class="markup--em markup--p-em">Background: </em></strong><em class="markup--em markup--p-em">Ive spent the past 6 years building web applications in Ruby and the Rails framework. Ive flirted with new programming languages as they came out, but Elixir is the first language that has been able to captivate me.</em></p><h3 name="0ece" id="0ece" class="graf--h3 graf-after--p">Ruby Crushed It!</h3><p name="a616" id="a616" class="graf--p graf-after--h3">The ruby language and the Rails framework completely changed the way web applications were built; it started a religion of values that the community cared about. It pioneered the idea that the tools programmers use should be optimized for developer happiness and productivity.</p><p name="5a73" id="5a73" class="graf--p graf-after--p">It made the bold challenge that it is developers jobs to make sure their code was adequately tested and worked. Other languages and frameworks scoffed at the approach, until it started winning. Then they started incorporating principles from the ruby community in their language and framework.</p><figure name="fc03" id="fc03" class="graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 541px; max-height: 350px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 64.7%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*IT_FzO1BsR1YhuWsWXfCaQ.png" data-width="541" data-height="350"><img src="https://cdn-images-1.medium.com/freeze/max/30/1*IT_FzO1BsR1YhuWsWXfCaQ.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*IT_FzO1BsR1YhuWsWXfCaQ.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*IT_FzO1BsR1YhuWsWXfCaQ.png"></noscript></div></div></figure><p name="7ffa" id="7ffa" class="graf--p graf-after--figure">Ruby went from humble beginnings as an obscure language to one of the most popular languages, largely because of the Rails framework and tremendous leadership from people like DHH, Wycats, Aaron Patterson, Jose Valim and a ton of other superstars.</p><h3 name="8f27" id="8f27" class="graf--h3 graf-after--p">But every so often, artifacts of rubys humble beginnings arise</h3><h4 name="2e21" id="2e21" class="graf--h4 graf-after--h3">Run-away memory!</h4><p name="2cd5" id="2cd5" class="graf--p graf-after--h4">In Zed Shaws infamous “Rails is a Ghetto” post, he rants about how problems with garbage collection required early Rails applications restart their processes around every 4 minutes in order to remain live.</p><p name="c6db" id="c6db" class="graf--p graf-after--p">One of the most popular rails servers out there today is unicorn. My production web application is a Rails application that is fairly simple, in comparison to other applications Ive worked on. I moved the application to a 512MB DigitalOcean droplet following standard instructions. After being deployed for several days, my unicorns had eaten all available memory and the application was quite slow.</p><p name="606f" id="606f" class="graf--p graf-after--p">The solution? The <a href="https://www.digitalocean.com/community/tutorials/how-to-optimize-unicorn-workers-in-a-ruby-on-rails-app" data-href="https://www.digitalocean.com/community/tutorials/how-to-optimize-unicorn-workers-in-a-ruby-on-rails-app" class="markup--anchor markup--p-anchor" rel="nofollow">unicorn-worker-killer</a>. Its not unlike the solution from the early days.</p><p name="0067" id="0067" class="graf--p graf-after--p">My DigitalOcean droplet can handle two unicorn worker threads, which take most of the resources, and Postgres database and few other applications. Request times are okay though, so it gets the job done.</p><h4 name="70ca" id="70ca" class="graf--h4 graf-after--p">Concurrency!</h4><p name="10d0" id="10d0" class="graf--p graf-after--h4">Ive spent years of developing Rails applications, <strong class="markup--strong markup--p-strong">I have never spawned a new thread in a production Rails web application</strong>. Rails itself is thread-safe, but I have the awareness that <strong class="markup--strong markup--p-strong"><em class="markup--em markup--p-em">there be dragons</em></strong> when dealing with different threads, having used them heavily in Java, C++ and other object-oriented languages.</p><p name="05ef" id="05ef" class="graf--p graf-after--p">The fact is, that I dont want to think about mutexes, semaphores, or anything like that. Pausing one thread, while executing another one doesnt seem like its really concurrent anyway. Plus, are you <strong class="markup--strong markup--p-strong"><em class="markup--em markup--p-em">sure</em></strong> your code doesnt cause deadlocks?</p><p name="0cd8" id="0cd8" class="graf--p graf-after--p">Since the testing is a core tenant of the ruby community, its not a surprise that most ruby developers stay away from using threads as theyre basically un-testable, and tend to produce bugs that are difficult to reproduce.</p><p name="7d5b" id="7d5b" class="graf--p graf-after--p">I, like most sane Rails developers, use <a href="https://github.com/mperham/sidekiq" data-href="https://github.com/mperham/sidekiq" class="markup--anchor markup--p-anchor" rel="nofollow">sidekiq</a> or <a href="https://github.com/resque/resque" data-href="https://github.com/resque/resque" class="markup--anchor markup--p-anchor" rel="nofollow">resque</a> to process things in parallel. <a href="http://weblog.rubyonrails.org/2008/11/21/rails-2-2-i18n-http-validators-thread-safety-jruby-1-9-compatibility-docs/" data-href="http://weblog.rubyonrails.org/2008/11/21/rails-2-2-i18n-http-validators-thread-safety-jruby-1-9-compatibility-docs/" class="markup--anchor markup--p-anchor" rel="nofollow">Rails 2.2</a> added thread-safety, but <a href="http://weblog.rubyonrails.org/2014/12/19/Rails-4-2-final/" data-href="http://weblog.rubyonrails.org/2014/12/19/Rails-4-2-final/" class="markup--anchor markup--p-anchor" rel="nofollow">Rails 4.2</a> added the Active Job API, which in my opinion is a heck-of-a-lot more useful.</p><p name="1018" id="1018" class="graf--p graf-after--p">But background jobs are just that, done in the background. Mission critical stuff should remain in the main process, so you can react to failure or make sure transactions go through successfully before completing the task.</p><h4 name="c2a1" id="c2a1" class="graf--h4 graf-after--p">Speed!</h4><p name="afdc" id="afdc" class="graf--p graf-after--h4">Im selfish. I value my time. I value it a lot. And thats why test speed is something I care about. I spent <a href="https://www.youtube.com/watch?v=V7g9amBX92A" data-href="https://www.youtube.com/watch?v=V7g9amBX92A" class="markup--anchor markup--p-anchor" rel="nofollow">serious time</a> optimizing my test suite performance, without making changes to the architecture of the application and causing test-induced-design-damage.</p><p name="f7be" id="f7be" class="graf--p graf-after--p">For a time the project I was working on had unit and functional tests that took just over 20 minutes! At the time I tested using hydra for distributed Rails tests, but I had a hard time getting the test suite to pass (likely due to an obnoxiously complex codebase, with some of the <strong class="markup--strong markup--p-strong"><em class="markup--em markup--p-em">not-so-the-best</em></strong> code in it ☺).</p><p name="81f4" id="81f4" class="graf--p graf-after--p">Even test startup time started to take a long time, around 40 seconds. Ever wait 40 seconds to see: “<em class="markup--em markup--p-em">syntax error, unexpected end-of-input, expecting keyword_end</em>”, or a similar foolish syntax goof-up? I have.</p><p name="228c" id="228c" class="graf--p graf-after--p">The solution? <a href="https://github.com/burke/zeus" data-href="https://github.com/burke/zeus" class="markup--anchor markup--p-anchor" rel="nofollow">Zeus</a>. A wonderful gem that pre-loads typical start-up stuff for a Rails app and can (according to GitHub):</p><blockquote name="58c3" id="58c3" class="graf--blockquote graf-after--p">Boot any rails app in under a second.</blockquote><p name="b80e" id="b80e" class="graf--p graf-after--blockquote">I seriously love this gem and suggest you use it if youre a Rails developer.</p><p name="2fec" id="2fec" class="graf--p graf-after--p">But, how were the developers able to achieve this? They wrote the core of it in friggin Go.</p><h4 name="ee0f" id="ee0f" class="graf--h4 graf-after--p">Scala</h4><p name="19ec" id="19ec" class="graf--p graf-after--h4">A couple years ago, I got super stoked about Scala. Then I started using it, and promptly started hating it.</p><p name="b939" id="b939" class="graf--p graf-after--p">Its has a lot of functional programming concepts. The <a href="https://github.com/akka/akka" data-href="https://github.com/akka/akka" class="markup--anchor markup--p-anchor" rel="nofollow">akka framework</a>, allows highly concurrent fault tolerant applications. It runs on the JVM so any Java library is fair game to use, and the JVM is incredibly well tuned for performance.</p><p name="83e1" id="83e1" class="graf--p graf-after--p">The language itself I found enjoyable, I liked pattern matching. The deal breaker for me? The JVM. Package management for jars IMO is seriously overcomplicated, when comparing it with Rubygems and Bundler.</p><p name="8246" id="8246" class="graf--p graf-after--p">There are a bunch of solutions: SBT, Maven, Ivy, but they all make me cringe when I need to import someone elses library. Maybe Ive been spoiled by Ruby, but Rubys package management is core to my productivity.</p><p name="5109" id="5109" class="graf--p graf-after--p">The other thing that bothered me about Scala was the libraries I was using were largely written in Java by people with an entirely different set of values than I have.</p><p name="2e85" id="2e85" class="graf--p graf-after--p">Building Scala web applications with the Play! framework felt like building a Java web application with the Play! framework, except with slightly better syntax and the ability to do pattern matching. While Play! is influenced by Rails quite a bit, the difference is visceral.</p><h4 name="37cf" id="37cf" class="graf--h4 graf-after--p">The Elixir Ecosystem</h4><p name="393d" id="393d" class="graf--p graf-after--h4"><strong class="markup--strong markup--p-strong">Package Management with Mix</strong></p><p name="dc11" id="dc11" class="graf--p graf-after--p">When first venturing into playing with Elixir, I encountered Mix. Mix is like a hybrid of Bundler and rake in ruby. What blows me away about Mix is this: <strong class="markup--strong markup--p-strong">it doesnt feel worse than Bundler and Rake</strong>. It doesnt seem a lot better either, but the bar is incredibly high and meeting it is impressive!</p><p name="5d07" id="5d07" class="graf--p graf-after--p">Mix just does its job nicely, stays out of the way, and doesnt force you to wrangle XML.</p><p name="52ef" id="52ef" class="graf--p graf-after--p"><strong class="markup--strong markup--p-strong">The Erlang Virtual Machine</strong></p><p name="437f" id="437f" class="graf--p graf-after--p">Elixir runs on the Erlang virtual machine and embraces most of the values of the Erlang community. Both Elixir and Erlang pride themselves for an emphasis on functional programming that are fault-tolerant and highly scalable.</p><p name="9f97" id="9f97" class="graf--p graf-after--p">In most talks about Elixir you can watch on YouTube the following stories about Erlang:</p><ul class="postList"><li name="8151" id="8151" class="graf--li graf-after--p">Erlang is powering around 50% of telecom networks. When was the last time your phone had “Scheduled Maintaince”?</li><li name="f8ad" id="f8ad" class="graf--li graf-after--li">WhatsApp, which was acquired for billions of dollars, was running millions of processes on a single server, supported 450 million users, and had only 32 engineers.</li></ul><p name="ef73" id="ef73" class="graf--p graf-after--li">These values are the same type of values that the Elixir community embraces. Because of this as an Elixir developer, when you use Erlang supervisors or the <a href="https://github.com/ninenines/cowboy" data-href="https://github.com/ninenines/cowboy" class="markup--anchor markup--p-anchor" rel="nofollow">cowboy http</a> server, you dont feel like youre sacrificing your values.</p><p name="efcb" id="efcb" class="graf--p graf-after--p"><strong class="markup--strong markup--p-strong">The Phoenix Web Framework</strong></p><p name="a083" id="a083" class="graf--p graf-after--p">The <a href="https://github.com/phoenixframework/phoenix" data-href="https://github.com/phoenixframework/phoenix" class="markup--anchor markup--p-anchor" rel="nofollow">phoenix framework</a> is clearly heavily influenced by Ruby on Rails and coding a Phoenix Web Application feels a lot like coding a Rails app. I love the Rails router. I love ActionController, ActiveRecord, Rails Views and the way you code web application. I like the organization of Rails applications.</p><p name="5579" id="5579" class="graf--p graf-after--p">Phoenix is such a <em class="markup--em markup--p-em">Railsy</em> solution youll feel like youre building a Rails app, with the exception being that it runs with Elixir and has all the benefits of Elixir and the Erlang virtual machine.</p><p name="f9ea" id="f9ea" class="graf--p graf-after--p">Phoenix also supports WebSockets through channels. It basically gives you the ease of use of WebSockets that Firebase provides with fine-grained control.</p><p name="fc26" id="fc26" class="graf--p graf-after--p">Did I mention its fast? Its fast as lightning. Check out these logs from my $5/month DigitalOcean droplet. Thats right microsecond request speeds from a single core machine:</p><figure name="334b" id="334b" class="graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 422px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 60.199999999999996%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*O8sLJiIZ0Ny5A53cIHBLwQ.png" data-width="1222" data-height="736" data-action="zoom" data-action-value="1*O8sLJiIZ0Ny5A53cIHBLwQ.png"><img src="https://cdn-images-1.medium.com/freeze/max/30/1*O8sLJiIZ0Ny5A53cIHBLwQ.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*O8sLJiIZ0Ny5A53cIHBLwQ.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*O8sLJiIZ0Ny5A53cIHBLwQ.png"></noscript></div></div></figure><p name="0199" id="0199" class="graf--p graf-after--figure"><strong class="markup--strong markup--p-strong">Strong Leadership</strong></p><p name="4c66" id="4c66" class="graf--p graf-after--p">In my opinion, the difference between open source and <strong class="markup--strong markup--p-strong"><em class="markup--em markup--p-em">movement</em></strong>, is all around the leadership involved in the project. In short, I believe really smart people need to be <strong class="markup--strong markup--p-strong"><em class="markup--em markup--p-em">putting the work in</em></strong> to improve the software every single day.</p><p name="c224" id="c224" class="graf--p graf-after--p">The Rails movement gained so much momentum because of all the work put in by DHH, Aaron Patterson, Jose Valim, Wycats, and a ton more brilliant people. Rails wasnt launched at v1 and people stopped doing the work.</p><p name="79ec" id="79ec" class="graf--p graf-after--p"><a href="http://instagram.com/p/yJ5JskI-ZK" data-href="http://instagram.com/p/yJ5JskI-ZK" class="markup--anchor markup--p-anchor" rel="nofollow">Its old-school put in the work mentality</a>, and <a href="http://instagram.com/p/yXrMS-I-V9/" data-href="http://instagram.com/p/yXrMS-I-V9/" class="markup--anchor markup--p-anchor" rel="nofollow">building a community takes work</a>!</p><p name="c5f0" id="c5f0" class="graf--p graf-after--p">Jose Valim, Chris McCord, and all the members of the Elixir-Lang core team and Phoenix core team have, and continue to put in the work that needs to be done for the Elixir community to thrive.</p><h3 name="97ad" id="97ad" class="graf--h3 graf-after--p">Friends, the web is about to under-go a transformational change</h3><p name="006e" id="006e" class="graf--p graf-after--h3">Lets face it. CRUD apps are a commodity these days. The next: <em class="markup--em markup--p-em">AirBnB for Renting Ketchup </em>probably isnt going to survive.</p><p name="6159" id="6159" class="graf--p graf-after--p">The people who will win are going to be the ones who embrace changes in technology. The fact that WebSockets, processes, and concurrency in Phoenix and Elixir are cheap, without sacrificing developer happiness is an absolute game-changer.</p><p name="3345" id="3345" class="graf--p graf-after--p">I totally love Ruby on Rails. It completely changed the way that people thought about building web applications from 20052014.</p><p name="515f" id="515f" class="graf--p graf-after--p">I expect Elixir and Phoenix to have a similar impact from 20152025.</p><p name="e3d4" id="e3d4" class="graf--p graf-after--p">If you want to start building web applications with Phoenix and Elixir, <a href="http://phoenix.thefirehoseproject.com/" data-href="http://phoenix.thefirehoseproject.com/" class="markup--anchor markup--p-anchor" rel="nofollow"><strong class="markup--strong markup--p-strong">check out this tutorial</strong></a>, I built.</p><h3 name="f849" id="f849" class="graf--h3 graf-after--p graf--last"><em class="markup--em markup--h3-em">If you found value in this article, it would mean a lot to me if you hit the recommend button!</em></h3></div></div></section></main><footer class="postArticle-footer"><div class="postActionsFooter container u-size740"><div class="row"><div class="col u-xs-size12of12"></div></div><div class="row"><div class="col u-xs-size12of12 js-postTags"><div class="postTags"><div class="tags tags--postTags tags--borderless"></div></div></div></div><div class="row js-postActionsFooter"><div class="postActions col u-xs-size12of12"><div class="u-floatLeft buttonSet buttonSet--withLabels"><div class="buttonSet-inner"><div class="js-actionRecommend" data-post-id="7c8f847b58" data-size="29px"><button class="button button--primary button--large button--chromeless u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it"data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/7c8f847b58"><span class="button-defaultState"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--heart svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-heart-29px-p0"></use></svg></span><span class="button-activeState"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--heartFilled svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-heartFilled-29px-p0"></use></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal" data-action="show-recommends" data-action-value="7c8f847b58">761</button></div></div><div class="buttonSet-inner"><button class="button button--large button--dark button--chromeless u-baseColor--buttonDark button--withIcon button--withSvgIcon" data-action="scroll-to-responses"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--response svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-response-29px-p0"></use></svg></button><button class="button button--chromeless u-baseColor--buttonNormal" data-action="scroll-to-responses">15</button></div></div><div class="u-floatRight buttonSet buttonSet--narrow"><button class="button button--large button--dark button--chromeless u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_actions_footer"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--twitter svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-twitter-29px-p0"></use></svg></button><button class="button button--large button--dark button--chromeless u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_actions_footer"><svg viewBox="0 0 29 29" width="29" height="29" class="svgIcon svgIcon--facebook svgIcon-size--29px"><use class="svgIcon-use svgIcon-use--part0" xlink:href="#svg-facebook-29px-p0"></use></svg></button></div></div></div></div><div class="container u-size740"><div class="row postFooter-info2"><div class="col u-xs-size12of12"><hr class="postFooter-infoDivider"></div></div><div class="row js-postFooterInfo"><div class="col u-xs-size12of12"><li class="card card-user"><div class="u-floatRight"><span class="followState js-followState buttonSet-inner" data-user-id="18c72d00861"><button class="button button--small u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="footer_card"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary button--small u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton" data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/18c72d00861" data-action-source="footer_card_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span></div><div class="card-imageWrapper "><a class="link avatar u-baseColor--link" href="https://medium.com/@kenmazaika?source=footer_card" title="Go to the profile of Ken Mazaika" aria-label="Go to the profile of Ken Mazaika" data-action-source="footer_card" data-user-id="18c72d00861" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/60/60/0*sLJSyB3q7Q-67HVG.jpeg" class="avatar-image avatar-image--small" alt="Go to the profile of Ken Mazaika"></a></div><div class="card-content"><h3 class="card-name"><a class="link link--primary u-accentColor--hoverTextNormal" href="https://medium.com/@kenmazaika" property="cc:attributionName" title="Go to the profile of Ken Mazaika" aria-label="Go to the profile of Ken Mazaika" rel="author cc:attributionUrl" data-user-id="18c72d00861" dir="auto">Ken Mazaika</a></h3></div></li></div></div></div><div class="js-postPromotionWrapper postPromotionWrapper"></div><div class="js-postBundleWrapper postBundleWrapper"></div><div class="responsesWrapper supplementalPostContent js-responsesWrapper postFooter"></div><div class="supplementalPostContent js-readNext"></div><div class="supplementalPostContent js-heroPromo"></div></footer></article><div class="promoCardWrapper js-promoCardWrapper"><div class="promoCard"><button class="button button--close button--chromeless u-baseColor--buttonNormal" data-action="popup-dismiss">&times;</button><div class="promoCard-header">Dont miss Ken Mazaikas next story</div><div class="u-floatRight"><span class="followState js-followState buttonSet-inner" data-user-id="18c72d00861"><button class="button u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="user_follow_popup"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton" data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/18c72d00861" data-action-source="user_follow_popup_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span></div><div class="avatar"><img src="https://cdn-images-1.medium.com/fit/c/40/40/0*sLJSyB3q7Q-67HVG.jpeg" class="avatar-image avatar-image--smaller" alt="Ken Mazaika"><span class="avatar-text">Ken Mazaika</span></div></div></div></div></div></div><div class="loadingBar"></div><script>// <![CDATA[
window["obvInit"] = function (opt_embedded) {window["obvInit"]["embedded"] = opt_embedded; window["obvInit"]["ready"] = true;}
// ]]></script><script>// <![CDATA[
var GLOBALS = {"audioUrl":"https://d1fcbxp97j4nb2.cloudfront.net","baseUrl":"https://medium.com","bestOfFirstSlug":"may-2013","bestOfLatestSlug":"march-2016","buildLabel":"21177-e72e0d1","currentUser":{"userId":"lo_bdb4da6902e9","isVerified":false,"subscriberEmail":""},"currentUserHasUnverifiedEmail":false,"facebookKey":"542599432471018","facebookScope":["public_profile","email","user_friends"],"isAuthenticated":false,"isCurrentUserVerified":false,"language":"ko-kr","loadingPlaceholderImg":"https://cdn-static-1.medium.com/_/fp/img/media-loading-placeholder.b31hiO4ynbDLRrXWEFF4aQ.png","mediumTwitterScreenName":"medium","miroUrl":"https://cdn-images-1.medium.com","moduleUrls":{"base":"https://cdn-static-1.medium.com/_/fp/js/main-base.bundle.dW__CKUOCc949E_bVvU17g.js","notes":"https://cdn-static-1.medium.com/_/fp/js/main-notes.bundle.m8BGKNU7PqmsTVXWE3A5Bg.js","posters":"https://cdn-static-1.medium.com/_/fp/js/main-posters.bundle.5PlF4sgZVJ6K5Yz0X3oJUA.js","common-async":"https://cdn-static-1.medium.com/_/fp/js/main-common-async.bundle.3qi8aIpGvsNY4Z74b-gAEQ.js","stats":"https://cdn-static-1.medium.com/_/fp/js/main-stats.bundle.MQ1BNv7U1_83sYVGJwq-GA.js","misc-screens":"https://cdn-static-1.medium.com/_/fp/js/main-misc-screens.bundle.WpyYdDdfmUpPOolT80gyfA.js"},"postColumnWidth":700,"previewConfig":{"weightThreshold":1,"weightImageParagraph":0.51,"weightIframeParagraph":0.8,"weightTextParagraph":0.08,"weightEmptyParagraph":0,"weightP":0.003,"weightH":0.005,"weightBq":0.003,"minPTextLength":60,"truncateBoundaryChars":20,"detectTitle":true,"detectTitleLevThreshold":0.15},"productName":"Medium","supportsEdit":true,"termsUrl":"//medium.com/policy/9db0094a1e0f","textshotHost":"textshot.medium.com","transactionId":"1461474166450:7e109fca810b","useragent":{"browser":"chrome","family":"chrome","os":"mac","version":50,"supportsDesktopEdit":true,"supportsInteract":true,"supportsView":true,"isMobile":false,"isTablet":false,"isNative":false,"supportsFileAPI":true,"isTier1":true,"clientVersion":"","unknownParagraphsBad":false,"clientChannel":"","supportsRealScrollEvents":true,"supportsVhUnits":true,"ruinsViewportSections":false,"supportsHtml5Video":true,"supportsMagicUnderlines":true,"isFacebook":false,"isWebView":false,"isFacebookWebView":false,"supportsSvgExternalResources":true,"supportsProgressiveMedia":true,"isGoogle":false,"supportsScrollableMetabar":true},"variants":{"allow_access":true,"allow_signup":true,"can_update_settings":true,"can_send_push_notifications":true,"can_export_data":true,"allow_test_auth":"disallow","enable_email_registration":true,"enable_spam_detection":true,"use_experimental_css":true,"can_resume_from_last_read_location":true,"can_follow_users":true,"receive_post_published_pushes":true,"receive_mention_pushes":true,"feed_homepage":true,"welcome_post_url":"https://about.medium.com","signin_services":"twitter,facebook,google,email","signup_services":"twitter,facebook,google,email","mobile_app_promotion":"dialog","enable_bing_search":true,"enable_algolia_search":true,"show_tagged_posts_in_search":true,"enable_sift_integration":true,"friends_only_quotes":true,"enable_user_search_with_bing":true,"enable_drop_caps":true,"enable_session_cookie_encryption":true,"enable_tag_follow_onboarding":true,"your_top_stories_source":"similar-posts","follower_suggestion_source":"friends-of-friends","android_rating_prompt_recommend_threshold":5,"number_of_top_stories":3,"number_of_in_stream_ts4u":3,"number_of_in_stream_global_top_stories":3,"enable_top_stories_in_stream":true,"enable_top_stories_in_stream_on_ios":true,"enable_top_stories_in_stream_on_android":true,"enable_post_recommend_threshold_in_stream":true,"enable_response_recommend_threshold_in_stream":true,"post_recommend_threshold":1,"response_recommend_threshold":2,"google_sign_in_android":true,"enable_pile_on_activity":true,"enable_onboarding":true,"enable_activity_rollup":true,"custom_miro_url":"https://cdn-images-1.medium.com","ios_custom_miro_url":"https://cdn-images-1.medium.com","enable_friends_recommends_plugin":true,"enable_most_recommended_response":true,"no_push_notification_for_responses":true,"receive_follow_pushes":true,"receive_recommend_pushes":true,"receive_response_pushes":true,"receive_highlight_pushes":true,"enable_ios_badge":true,"enable_small_first_page":true,"enable_response_email2":true,"reengagement_notification_duration":3,"enable_progressive_media":true,"enable_oauth_api":true,"enable_oauth_token_self_issuance":true,"enable_oauth_app_creation":true,"list_of_lists_bucket":"default","use_new_push_notification_logic":true,"enable_send_ios_pushes_using_channel_ids":true,"explore_tab_ios_posts_per_section_limit":4,"enable_user_social_count_healing":true,"enable_social_counts_from_user_stat_total":true,"enable_responses_stream":true,"track_with_social_id":true,"disable_inherit_tags_inline":true,"enable_post_bundles":true,"enable_post_bundles_strategy_tag_based":true,"enable_post_bundles_strategy_author_based":true,"enable_post_bundles_strategy_collection_based":true,"show_author_writes_about":true,"enable_profile_stream_web":true,"top_stories_experiment_source":"topStories02","enable_new_home_feed":true,"add_top_stories_in_new_home_feed":true,"ranked_home_feed_time_decay_grace_period_in_hour":168,"ranked_home_feed_time_decay_hours_per_unit":24,"ranked_home_feed_time_decay_max_units":10,"enable_pub_collection_branding":true,"enable_pubs_migration":true,"enable_pubs_migration_processing":true,"first_feed_experiment_type":"recency","enable_adsnative_integration":true,"enable_post_promotion_tooltip":true,"enable_web_catalog_homepage":true,"enable_publication_favicon":true,"enable_welcome_onboarding_email":true,"enable_pub_navigation":true,"enable_pub_search":true,"browsable_stream_config_bucket":"curated","enable_less_social_email_for_new_users":true,"ios_small_post_preview_truncation_length":5.5,"ios_large_post_preview_truncation_length":5.5,"enable_demediumification":true,"enable_onboarding_after_actions":true,"enable_welcome_email_digest":true,"enable_collection_stats_overview":true,"enable_seen_bloom_filter":true,"hide_pubs_from_profile":true,"enable_reverse_cron_collection_tag_sections":true,"enable_stream_onboarding_promo":true,"enable_pub_collection_branding_editor":true,"enable_web_simplified_metabar_for_posts":true,"onboarding_compressed_graphic_tags":true,"disable_ios_catalog_badging":true,"disable_top_posts_from_followed_tags_provider":true,"enable_sign_in_description_copy_experiment":"Sign in to Medium and never miss new content from people & publications you like."},"xsrfToken":"","iosAppId":"828256236","supportEmail":"yourfriends@medium.com","teamName":"Team Medium","fp":{"/img/default-avatar.png":"https://cdn-static-1.medium.com/_/fp/img/default-avatar.dmbNkD5D-u45r44go_cf0g.png","/img/default-preview-image.png":"https://cdn-static-1.medium.com/_/fp/img/default-preview-image.IsBK38jFAJBlWifMLO4z9g.png","/img/default-preview-image-v2.png":"https://cdn-static-1.medium.com/_/fp/img/default-preview-image-v2.MXL-j6S8fTEd8UFP_foEEw.png","/img/email/app_store_badge@2x.png":"https://cdn-static-1.medium.com/_/fp/img/email/app_store_badge@2x.8bDQGNMm-Xs7Hz6WA2XquQ.png","/img/email/app-devices@2x.png":"https://cdn-static-1.medium.com/_/fp/img/email/app-devices@2x.6hgpI423F62SKyT8Lo6dzA.png","/img/email/check1.png":"https://cdn-static-1.medium.com/_/fp/img/email/check1.0DM77li7vZhq5o2V9cVYLQ.png","/img/email/check2.png":"https://cdn-static-1.medium.com/_/fp/img/email/check2.GLlNusQmn1hwo9WDN-gE1w.png","/img/email/check3.png":"https://cdn-static-1.medium.com/_/fp/img/email/check3.7VxOUVMXAVbHRRnzMrJ_5A.png","/img/email/email-logo.png":"https://cdn-static-1.medium.com/_/fp/img/email/email-logo.x91rxfZYzIT9OJ5-ySD30A.png","/img/email/fb_logo.png":"https://cdn-static-1.medium.com/_/fp/img/email/fb_logo.Q0M98YwNTu77gLWTK6-RyQ.png","/img/email/google_play_badge@2x.png":"https://cdn-static-1.medium.com/_/fp/img/email/google_play_badge@2x.iWEWlt5_Qj20rr79-IGEBQ.png","/img/email/heart.png":"https://cdn-static-1.medium.com/_/fp/img/email/heart._hlyuYQiuuTWrRmDnDphJA.png","/img/email/heart@2x.png":"https://cdn-static-1.medium.com/_/fp/img/email/heart@2x.qvCTX1XHNpntqxt01oypQw.png","/img/email/heart1.png":"https://cdn-static-1.medium.com/_/fp/img/email/heart1.rnGEmSwcGUhztl_zSU7l6Q.png","/img/email/heart2.png":"https://cdn-static-1.medium.com/_/fp/img/email/heart2.HBiLu3koIYsKjjKroohgbA.png","/img/email/heart3.png":"https://cdn-static-1.medium.com/_/fp/img/email/heart3.AIJBOHw11HuhdClVJNtmtg.png","/img/email/large.png":"https://cdn-static-1.medium.com/_/fp/img/email/large.4EIhZbIk5sgqYSoB4YPmUA.png","/img/email/response.png":"https://cdn-static-1.medium.com/_/fp/img/email/response.5ZuN24N5XqS7ofHKg1lKXw.png","/img/email/response@2x.png":"https://cdn-static-1.medium.com/_/fp/img/email/response@2x.xzKQM4FzSurAVkghLQQWkA.png","/img/email/trophy.png":"https://cdn-static-1.medium.com/_/fp/img/email/trophy.YXqqMnNASKQDXZ46YdTWFA.png","/img/email/twitter_logo.png":"https://cdn-static-1.medium.com/_/fp/img/email/twitter_logo.Pz4a3o9WMU5QioxLKcyFhQ.png","/img/email/unlisted.png":"https://cdn-static-1.medium.com/_/fp/img/email/unlisted.ikh8R2LElOz_1YM8A2Db4g.png","/img/email/welcome-heart.png":"https://cdn-static-1.medium.com/_/fp/img/email/welcome-heart.6BRCOGcwGeOCBTql8pbq2g.png","/img/email/welcome-response.png":"https://cdn-static-1.medium.com/_/fp/img/email/welcome-response.iWVQLjiUG5pyQrPyGiYEpw.png","/img/email/welcome-write.png":"https://cdn-static-1.medium.com/_/fp/img/email/welcome-write.afdGsuE6YDk3HkaIASRl0w.png","/img/help/add-media-start.gif":"https://cdn-static-1.medium.com/_/fp/img/help/add-media-start.GXmqQ2Svt1WfZGIZSM93tg.gif","/img/help/add-media.gif":"https://cdn-static-1.medium.com/_/fp/img/help/add-media.SZH2LBmkwVExuhozFfVvYg.gif","/img/help/embed-start.gif":"https://cdn-static-1.medium.com/_/fp/img/help/embed-start.EBJ2PcWFJuYopsQV4wwklA.gif","/img/help/embed.gif":"https://cdn-static-1.medium.com/_/fp/img/help/embed.1BM0Di9vd91Kv8fLioJabw.gif","/img/help/text-highlight-start.gif":"https://cdn-static-1.medium.com/_/fp/img/help/text-highlight-start.AvTbakaFuUCd05YoMECoMQ.gif","/img/help/text-highlight.gif":"https://cdn-static-1.medium.com/_/fp/img/help/text-highlight.XVChoKYZ1-s3gJgHm9-7Yg.gif","/img/help/2.0-add-media.gif":"https://cdn-static-1.medium.com/_/fp/img/help/2.0-add-media.LhrJcTFODoqjnPPuHNEInA.gif","/img/help/2.0-add-media-start.png":"https://cdn-static-1.medium.com/_/fp/img/help/2.0-add-media-start.PTVdm36977cSfaYOpMNTNQ.png","/img/help/2.0-highlight-menu.gif":"https://cdn-static-1.medium.com/_/fp/img/help/2.0-highlight-menu.vMoUc7pXOyYFMJX68LXicw.gif","/img/help/2.0-highlight-menu-start.png":"https://cdn-static-1.medium.com/_/fp/img/help/2.0-highlight-menu-start.7vCytTKUZPOZvr_MCYADsA.png","/img/help/2.0-embed.gif":"https://cdn-static-1.medium.com/_/fp/img/help/2.0-embed.2g5jIXYtWjsRFa9D-hBhMQ.gif","/img/help/2.0-embed-start.png":"https://cdn-static-1.medium.com/_/fp/img/help/2.0-embed-start.LGy_FmixvcoEVIDKjg1jwA.png","/img/help/2.0-mention.gif":"https://cdn-static-1.medium.com/_/fp/img/help/2.0-mention.H9pEv0eHAvkGUVqdrHxH5g.gif","/img/help/2.0-mention-start.png":"https://cdn-static-1.medium.com/_/fp/img/help/2.0-mention-start.ShYTOfy6w3VDU9PKFfOEyw.png","/img/help/highlight-tips-1.gif":"https://cdn-static-1.medium.com/_/fp/img/help/highlight-tips-1.dEp02HXMKtAeKxsV5MWqGg.gif","/img/help/highlight-tips-2.gif":"https://cdn-static-1.medium.com/_/fp/img/help/highlight-tips-2.SyXCciYXeNpx4-GUAuh0XQ.gif","/img/import/highlight-menu.png":"https://cdn-static-1.medium.com/_/fp/img/import/highlight-menu.kzoaVM8mJJ-Hu9m9uo3Omg.png","/img/import/image-highlight-menu.png":"https://cdn-static-1.medium.com/_/fp/img/import/image-highlight-menu.q43-H2dl0JvBS_5znQCW8A.png","/img/import/publish-metabar.png":"https://cdn-static-1.medium.com/_/fp/img/import/publish-metabar.YbEX1a2Pu0rAR_LuKeg8JA.png","/img/payments/amex.png":"https://cdn-static-1.medium.com/_/fp/img/payments/amex.5EPSpIzX7GdCzJlp6ScaDw.png","/img/payments/diners.png":"https://cdn-static-1.medium.com/_/fp/img/payments/diners.NGD5bmkc-37YhAWWR1kzZQ.png","/img/payments/discover.png":"https://cdn-static-1.medium.com/_/fp/img/payments/discover.EZDA3I2LqtScyoBjwnpyAA.png","/img/payments/jcb.png":"https://cdn-static-1.medium.com/_/fp/img/payments/jcb.r4YW_7gdVvO70Y1uobs9zw.png","/img/payments/mastercard.png":"https://cdn-static-1.medium.com/_/fp/img/payments/mastercard.pkLRUgj9PI_snp1LBC8FYQ.png","/img/payments/placeholder.png":"https://cdn-static-1.medium.com/_/fp/img/payments/placeholder.UD4yFjC9YHrS0yCBRmRwvQ.png","/img/payments/visa.png":"https://cdn-static-1.medium.com/_/fp/img/payments/visa.0d40297wdAUwEkxSXQjBoQ.png","/img/payments/credit-card-sprite.png":"https://cdn-static-1.medium.com/_/fp/img/payments/credit-card-sprite.aNIJTodZTkf86-MUkQX7Xw.png","/icons/favicon-dev-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-dev-editor.YKKRxBO8EMvIqhyCwIiJeQ.ico","/icons/favicon-hatch-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-hatch-editor.BuEyHIqlyh2s_XEk4Rl32Q.ico","/icons/favicon-medium-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-medium-editor.PiakrZWB7Yb80quUVQWM6g.ico"},"facebookNamespace":"medium-com","authBaseUrl":"https://medium.com","imageUploadSizeMb":25,"isAuthDomainRequest":true,"algoliaApiEndpoint":"https://MQ57UUUQZ2-dsn.algolia.net","algoliaAppId":"MQ57UUUQZ2","algoliaSearchOnlyApiKey":"aadabda268e3bfaffe7b287709262fec","iosAppStoreUrl":"https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&mt=8","iosAppLinkBaseUrl":"medium:","algoliaIndexPrefix":"medium_","androidPlayStoreUrl":"https://play.google.com/store/apps/details?id=com.medium.reader","googleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","androidPackage":"com.medium.reader","androidPlayStoreMarketScheme":"market://details?id=com.medium.reader","googleAuthUri":"https://accounts.google.com/o/oauth2/auth","androidScheme":"medium","iconsSvgUrl":"/_/proxy-static/_/fp/icons/icons.XPXGTMNoDzAWLNeImSMvkQ.svg","layoutData":{"useDynamicScripts":false,"googleAnalyticsTrackingCode":"UA-24232453-2","jsShivUrl":"https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.js","iconsJsUrl":"https://cdn-static-1.medium.com/_/fp/js/icons.y2MXEMxiKGQ12y_n-WOUKw.js","cssFontUrls":["https://cdn-static-1.medium.com/_/fp/css/fonts-base.by5Oi_VbnwEIvhnWIsuUjA.css"],"useDynamicCss":false,"faviconUrl":"https://cdn-static-1.medium.com/_/fp/icons/favicon-medium.TAS6uQ-Y7kcKgi0xjcYHXw.ico"},"authBaseUrlRev":"moc.muidem//:sptth","isDnt":false,"stripePublishableKey":"pk_test_kgaI7g0OvDySoqecpxnmmqWk","archiveUploadSizeMb":100,"paymentData":{"currencies":{"1":{"label":"US Dollar","external":"usd"}},"countries":{"1":{"label":"United States of America","external":"US"}},"accountTypes":{"1":{"label":"Individual","external":"individual"},"2":{"label":"Company","external":"company"}}},"previewConfig2":{"weightThreshold":1,"weightImageParagraph":0.05,"raiseImage":true,"enforceHeaderHierarchy":true,"isImageInsetRight":true}}
// ]]></script><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/main-base.bundle.dW__CKUOCc949E_bVvU17g.js" async="true"></script><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/icons.y2MXEMxiKGQ12y_n-WOUKw.js"></script><script>// <![CDATA[
window["obvInit"]({"value":{"id":"7c8f847b58","versionId":"37116e0d2fee","creatorId":"18c72d00861","creator":{"userId":"18c72d00861","name":"Ken Mazaika","username":"kenmazaika","createdAt":1375921518763,"lastPostCreatedAt":1461256879753,"imageId":"0*sLJSyB3q7Q-67HVG.jpeg","backgroundImageId":"1*EOcWgdHBARjqatcAAe8KZA.jpeg","bio":"","twitterScreenName":"KenMazaika","socialStats":{"userId":"18c72d00861","usersFollowedCount":67,"usersFollowedByCount":853,"type":"SocialStats"},"social":{"userId":"lo_bdb4da6902e9","targetUserId":"18c72d00861","type":"Social"},"facebookAccountId":"10102167262485419","allowNotes":1,"type":"User"},"homeCollectionId":"","title":"Why Im betting on Elixir","detectedLanguage":"en","latestVersion":"37116e0d2fee","latestPublishedVersion":"37116e0d2fee","hasUnpublishedEdits":false,"latestRev":1145,"createdAt":1422732778320,"updatedAt":1439298709996,"acceptedAt":0,"firstPublishedAt":1422745085645,"latestPublishedAt":1424710407006,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"And why you should too, unless you want to become a maintenance programmer.","bodyModel":{"paragraphs":[{"name":"dcd7","type":2,"text":"Why Im betting on Elixir","markups":[]},{"name":"e035","type":3,"text":"And why you should too, unless you want to become a maintenance programmer.","markups":[]},{"name":"3476","type":1,"text":"Background: Ive spent the past 6 years building web applications in Ruby and the Rails framework. Ive flirted with new programming languages as they came out, but Elixir is the first language that has been able to captivate me.","markups":[{"type":1,"start":0,"end":12},{"type":2,"start":0,"end":229}]},{"name":"0ece","type":3,"text":"Ruby Crushed It!","markups":[]},{"name":"a616","type":1,"text":"The ruby language and the Rails framework completely changed the way web applications were built; it started a religion of values that the community cared about. It pioneered the idea that the tools programmers use should be optimized for developer happiness and productivity.","markups":[]},{"name":"5a73","type":1,"text":"It made the bold challenge that it is developers jobs to make sure their code was adequately tested and worked. Other languages and frameworks scoffed at the approach, until it started winning. Then they started incorporating principles from the ruby community in their language and framework.","markups":[]},{"name":"fc03","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*IT_FzO1BsR1YhuWsWXfCaQ.png","originalWidth":541,"originalHeight":350}},{"name":"7ffa","type":1,"text":"Ruby went from humble beginnings as an obscure language to one of the most popular languages, largely because of the Rails framework and tremendous leadership from people like DHH, Wycats, Aaron Patterson, Jose Valim and a ton of other superstars.","markups":[]},{"name":"8f27","type":3,"text":"But every so often, artifacts of rubys humble beginnings arise","markups":[]},{"name":"2e21","type":13,"text":"Run-away memory!","markups":[]},{"name":"2cd5","type":1,"text":"In Zed Shaws infamous “Rails is a Ghetto” post, he rants about how problems with garbage collection required early Rails applications restart their processes around every 4 minutes in order to remain live.","markups":[]},{"name":"c6db","type":1,"text":"One of the most popular rails servers out there today is unicorn. My production web application is a Rails application that is fairly simple, in comparison to other applications Ive worked on. I moved the application to a 512MB DigitalOcean droplet following standard instructions. After being deployed for several days, my unicorns had eaten all available memory and the application was quite slow.","markups":[]},{"name":"606f","type":1,"text":"The solution? The unicorn-worker-killer. Its not unlike the solution from the early days.","markups":[{"type":3,"start":18,"end":39,"href":"https://www.digitalocean.com/community/tutorials/how-to-optimize-unicorn-workers-in-a-ruby-on-rails-app","title":"","rel":"","anchorType":0}]},{"name":"0067","type":1,"text":"My DigitalOcean droplet can handle two unicorn worker threads, which take most of the resources, and Postgres database and few other applications. Request times are okay though, so it gets the job done.","markups":[]},{"name":"70ca","type":13,"text":"Concurrency!","markups":[]},{"name":"10d0","type":1,"text":"Ive spent years of developing Rails applications, I have never spawned a new thread in a production Rails web application. Rails itself is thread-safe, but I have the awareness that there be dragons when dealing with different threads, having used them heavily in Java, C++ and other object-oriented languages.","markups":[{"type":1,"start":51,"end":122},{"type":1,"start":183,"end":199},{"type":2,"start":183,"end":199}]},{"name":"05ef","type":1,"text":"The fact is, that I dont want to think about mutexes, semaphores, or anything like that. Pausing one thread, while executing another one doesnt seem like its really concurrent anyway. Plus, are you sure your code doesnt cause deadlocks?","markups":[{"type":1,"start":201,"end":205},{"type":2,"start":201,"end":205}]},{"name":"0cd8","type":1,"text":"Since the testing is a core tenant of the ruby community, its not a surprise that most ruby developers stay away from using threads as theyre basically un-testable, and tend to produce bugs that are difficult to reproduce.","markups":[]},{"name":"7d5b","type":1,"text":"I, like most sane Rails developers, use sidekiq or resque to process things in parallel. Rails 2.2 added thread-safety, but Rails 4.2 added the Active Job API, which in my opinion is a heck-of-a-lot more useful.","markups":[{"type":3,"start":40,"end":47,"href":"https://github.com/mperham/sidekiq","title":"","rel":"","anchorType":0},{"type":3,"start":51,"end":57,"href":"https://github.com/resque/resque","title":"","rel":"","anchorType":0},{"type":3,"start":89,"end":98,"href":"http://weblog.rubyonrails.org/2008/11/21/rails-2-2-i18n-http-validators-thread-safety-jruby-1-9-compatibility-docs/","title":"","rel":"","anchorType":0},{"type":3,"start":124,"end":133,"href":"http://weblog.rubyonrails.org/2014/12/19/Rails-4-2-final/","title":"","rel":"","anchorType":0}]},{"name":"1018","type":1,"text":"But background jobs are just that, done in the background. Mission critical stuff should remain in the main process, so you can react to failure or make sure transactions go through successfully before completing the task.","markups":[]},{"name":"c2a1","type":13,"text":"Speed!","markups":[]},{"name":"afdc","type":1,"text":"Im selfish. I value my time. I value it a lot. And thats why test speed is something I care about. I spent serious time optimizing my test suite performance, without making changes to the architecture of the application and causing test-induced-design-damage.","markups":[{"type":3,"start":109,"end":121,"href":"https://www.youtube.com/watch?v=V7g9amBX92A","title":"","rel":"","anchorType":0}]},{"name":"f7be","type":1,"text":"For a time the project I was working on had unit and functional tests that took just over 20 minutes! At the time I tested using hydra for distributed Rails tests, but I had a hard time getting the test suite to pass (likely due to an obnoxiously complex codebase, with some of the not-so-the-best code in it ☺).","markups":[{"type":1,"start":282,"end":297},{"type":2,"start":282,"end":297}]},{"name":"81f4","type":1,"text":"Even test startup time started to take a long time, around 40 seconds. Ever wait 40 seconds to see: “syntax error, unexpected end-of-input, expecting keyword_end”, or a similar foolish syntax goof-up? I have.","markups":[{"type":2,"start":101,"end":161}]},{"name":"228c","type":1,"text":"The solution? Zeus. A wonderful gem that pre-loads typical start-up stuff for a Rails app and can (according to GitHub):","markups":[{"type":3,"start":14,"end":18,"href":"https://github.com/burke/zeus","title":"","rel":"","anchorType":0}]},{"name":"58c3","type":6,"text":"Boot any rails app in under a second.","markups":[]},{"name":"b80e","type":1,"text":"I seriously love this gem and suggest you use it if youre a Rails developer.","markups":[]},{"name":"2fec","type":1,"text":"But, how were the developers able to achieve this? They wrote the core of it in friggin Go.","markups":[]},{"name":"ee0f","type":13,"text":"Scala","markups":[]},{"name":"19ec","type":1,"text":"A couple years ago, I got super stoked about Scala. Then I started using it, and promptly started hating it.","markups":[]},{"name":"b939","type":1,"text":"Its has a lot of functional programming concepts. The akka framework, allows highly concurrent fault tolerant applications. It runs on the JVM so any Java library is fair game to use, and the JVM is incredibly well tuned for performance.","markups":[{"type":3,"start":55,"end":69,"href":"https://github.com/akka/akka","title":"","rel":"","anchorType":0}]},{"name":"83e1","type":1,"text":"The language itself I found enjoyable, I liked pattern matching. The deal breaker for me? The JVM. Package management for jars IMO is seriously overcomplicated, when comparing it with Rubygems and Bundler.","markups":[]},{"name":"8246","type":1,"text":"There are a bunch of solutions: SBT, Maven, Ivy, but they all make me cringe when I need to import someone elses library. Maybe Ive been spoiled by Ruby, but Rubys package management is core to my productivity.","markups":[]},{"name":"5109","type":1,"text":"The other thing that bothered me about Scala was the libraries I was using were largely written in Java by people with an entirely different set of values than I have.","markups":[]},{"name":"2e85","type":1,"text":"Building Scala web applications with the Play! framework felt like building a Java web application with the Play! framework, except with slightly better syntax and the ability to do pattern matching. While Play! is influenced by Rails quite a bit, the difference is visceral.","markups":[]},{"name":"37cf","type":13,"text":"The Elixir Ecosystem","markups":[]},{"name":"393d","type":1,"text":"Package Management with Mix","markups":[{"type":1,"start":0,"end":27}]},{"name":"dc11","type":1,"text":"When first venturing into playing with Elixir, I encountered Mix. Mix is like a hybrid of Bundler and rake in ruby. What blows me away about Mix is this: it doesnt feel worse than Bundler and Rake. It doesnt seem a lot better either, but the bar is incredibly high and meeting it is impressive!","markups":[{"type":1,"start":154,"end":197}]},{"name":"5d07","type":1,"text":"Mix just does its job nicely, stays out of the way, and doesnt force you to wrangle XML.","markups":[]},{"name":"52ef","type":1,"text":"The Erlang Virtual Machine","markups":[{"type":1,"start":0,"end":26}]},{"name":"437f","type":1,"text":"Elixir runs on the Erlang virtual machine and embraces most of the values of the Erlang community. Both Elixir and Erlang pride themselves for an emphasis on functional programming that are fault-tolerant and highly scalable.","markups":[]},{"name":"9f97","type":1,"text":"In most talks about Elixir you can watch on YouTube the following stories about Erlang:","markups":[]},{"name":"8151","type":9,"text":"Erlang is powering around 50% of telecom networks. When was the last time your phone had “Scheduled Maintaince”?","markups":[]},{"name":"f8ad","type":9,"text":"WhatsApp, which was acquired for billions of dollars, was running millions of processes on a single server, supported 450 million users, and had only 32 engineers.","markups":[]},{"name":"ef73","type":1,"text":"These values are the same type of values that the Elixir community embraces. Because of this as an Elixir developer, when you use Erlang supervisors or the cowboy http server, you dont feel like youre sacrificing your values.","markups":[{"type":3,"start":156,"end":167,"href":"https://github.com/ninenines/cowboy","title":"","rel":"","anchorType":0}]},{"name":"efcb","type":1,"text":"The Phoenix Web Framework","markups":[{"type":1,"start":0,"end":25}]},{"name":"a083","type":1,"text":"The phoenix framework is clearly heavily influenced by Ruby on Rails and coding a Phoenix Web Application feels a lot like coding a Rails app. I love the Rails router. I love ActionController, ActiveRecord, Rails Views and the way you code web application. I like the organization of Rails applications.","markups":[{"type":3,"start":4,"end":21,"href":"https://github.com/phoenixframework/phoenix","title":"","rel":"","anchorType":0}]},{"name":"5579","type":1,"text":"Phoenix is such a Railsy solution youll feel like youre building a Rails app, with the exception being that it runs with Elixir and has all the benefits of Elixir and the Erlang virtual machine.","markups":[{"type":2,"start":18,"end":24}]},{"name":"f9ea","type":1,"text":"Phoenix also supports WebSockets through channels. It basically gives you the ease of use of WebSockets that Firebase provides with fine-grained control.","markups":[]},{"name":"fc26","type":1,"text":"Did I mention its fast? Its fast as lightning. Check out these logs from my $5/month DigitalOcean droplet. Thats right microsecond request speeds from a single core machine:","markups":[]},{"name":"334b","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*O8sLJiIZ0Ny5A53cIHBLwQ.png","originalWidth":1222,"originalHeight":736}},{"name":"0199","type":1,"text":"Strong Leadership","markups":[{"type":1,"start":0,"end":17}]},{"name":"4c66","type":1,"text":"In my opinion, the difference between open source and movement, is all around the leadership involved in the project. In short, I believe really smart people need to be putting the work in to improve the software every single day.","markups":[{"type":1,"start":54,"end":62},{"type":1,"start":169,"end":188},{"type":2,"start":54,"end":62},{"type":2,"start":169,"end":188}]},{"name":"c224","type":1,"text":"The Rails movement gained so much momentum because of all the work put in by DHH, Aaron Patterson, Jose Valim, Wycats, and a ton more brilliant people. Rails wasnt launched at v1 and people stopped doing the work.","markups":[]},{"name":"79ec","type":1,"text":"Its old-school put in the work mentality, and building a community takes work!","markups":[{"type":3,"start":0,"end":41,"href":"http://instagram.com/p/yJ5JskI-ZK","title":"","rel":"","anchorType":0},{"type":3,"start":47,"end":78,"href":"http://instagram.com/p/yXrMS-I-V9/","title":"","rel":"","anchorType":0}]},{"name":"c5f0","type":1,"text":"Jose Valim, Chris McCord, and all the members of the Elixir-Lang core team and Phoenix core team have, and continue to put in the work that needs to be done for the Elixir community to thrive.","markups":[]},{"name":"97ad","type":3,"text":"Friends, the web is about to under-go a transformational change","markups":[]},{"name":"006e","type":1,"text":"Lets face it. CRUD apps are a commodity these days. The next: AirBnB for Renting Ketchup probably isnt going to survive.","markups":[{"type":2,"start":63,"end":90}]},{"name":"6159","type":1,"text":"The people who will win are going to be the ones who embrace changes in technology. The fact that WebSockets, processes, and concurrency in Phoenix and Elixir are cheap, without sacrificing developer happiness is an absolute game-changer.","markups":[]},{"name":"3345","type":1,"text":"I totally love Ruby on Rails. It completely changed the way that people thought about building web applications from 20052014.","markups":[]},{"name":"515f","type":1,"text":"I expect Elixir and Phoenix to have a similar impact from 20152025.","markups":[]},{"name":"e3d4","type":1,"text":"If you want to start building web applications with Phoenix and Elixir, check out this tutorial, I built.","markups":[{"type":3,"start":72,"end":95,"href":"http://phoenix.thefirehoseproject.com/","title":"","rel":"","anchorType":0},{"type":1,"start":72,"end":95}]},{"name":"f849","type":3,"text":"If you found value in this article, it would mean a lot to me if you hit the recommend button!","markups":[{"type":2,"start":0,"end":94}]}],"sections":[{"name":"b51d","startIndex":0,"backgroundImage":{"id":"1*tdLleNZLHbx2zfZBUCLqTw.png","originalWidth":1165,"originalHeight":541},"textLayout":4,"imageLayout":9},{"name":"0100","startIndex":2}]},"postDisplay":{"coverless":true}},"virtuals":{"createdAtRelative":"a year ago","updatedAtRelative":"8 months ago","acceptedAtRelative":"","createdAtEnglish":"January 31, 2015","updatedAtEnglish":"August 11, 2015","acceptedAtEnglish":"","firstPublishedAtEnglish":"January 31, 2015","latestPublishedAtEnglish":"February 23, 2015","allowNotes":true,"snippet":"And why you should too, unless you want to become a maintenance programmer.","previewImage":{"imageId":"1*tdLleNZLHbx2zfZBUCLqTw.png","filter":"","backgroundSize":"","originalWidth":1165,"originalHeight":541,"strategy":"resample","height":0,"width":0},"wordCount":1593,"imageCount":3,"readingTime":6.561320754716981,"subtitle":"And why you should too, unless you want to become a maintenance programmer.","usersBySocialRecommends":[],"latestPublishedAtAbbreviated":"Feb 23, 2015","firstPublishedAtAbbreviated":"Jan 31, 2015","emailSnippet":"Background: Ive spent the past 6 years building web applications in Ruby and the Rails framework. Ive flirted with new programming languages as they came out, but Elixir is the first language that has been able to captivate me. ¶\n\nRuby Crushed It! ¶\n\nThe ruby language and the Rails framework completely changed the way web applications were built; it started a religion of values that the community cared about.","recommends":761,"socialRecommends":[],"isBookmarked":false,"tags":[],"socialRecommendsCount":0,"responsesCreatedCount":15,"links":{"entries":[{"url":"https://www.youtube.com/watch?v=V7g9amBX92A","alts":[{"type":2,"url":"vnd.youtube://www.youtube.com/watch?v=V7g9amBX92A&feature=applinks"},{"type":3,"url":"vnd.youtube://www.youtube.com/watch?v=V7g9amBX92A&feature=applinks"}]},{"url":"http://instagram.com/p/yXrMS-I-V9/","alts":[{"type":2,"url":"instagram://media?id=907383810942035325"},{"type":3,"url":"https://www.instagram.com/p/yXrMS-I-V9/"}]},{"url":"http://instagram.com/p/yJ5JskI-ZK","alts":[{"type":2,"url":"instagram://media?id=903504555241891402"},{"type":3,"url":"https://www.instagram.com/p/yJ5JskI-ZK/"}]}],"version":"0.1"},"isLockedPreviewOnly":false},"coverless":true,"slug":"why-im-betting-on-elixir","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"why-im-betting-on-elixir-7c8f847b58","previewContent":{"bodyModel":{"paragraphs":[{"name":"b51d","type":4,"text":"","layout":10,"metadata":{"id":"1*tdLleNZLHbx2zfZBUCLqTw.png","originalWidth":1165,"originalHeight":541}},{"name":"dcd7","type":2,"text":"Why Im betting on Elixir","markups":[],"alignment":1},{"name":"e035","type":3,"text":"And why you should too, unless you want to become a maintenance programmer.","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"https://medium.com/@kenmazaika/why-im-betting-on-elixir-7c8f847b58","approvedHomeCollectionId":"","newsletterId":"","webCanonicalUrl":"https://medium.com/@kenmazaika/why-im-betting-on-elixir-7c8f847b58","mediumUrl":"https://medium.com/@kenmazaika/why-im-betting-on-elixir-7c8f847b58","migrationId":"","type":"Post"},"collaborators":[],"footerPromo":{"promoId":"read_next_sign_in_tnt","isDismissable":false,"imageId":"1*OlgaspZ00W78xQY-HE9Wsg.png"},"collectionUserRelations":[],"mode":null,"references":{"User":{"18c72d00861":{"userId":"18c72d00861","name":"Ken Mazaika","username":"kenmazaika","createdAt":1375921518763,"lastPostCreatedAt":1461256879753,"imageId":"0*sLJSyB3q7Q-67HVG.jpeg","backgroundImageId":"1*EOcWgdHBARjqatcAAe8KZA.jpeg","bio":"","twitterScreenName":"KenMazaika","socialStats":{"userId":"18c72d00861","usersFollowedCount":67,"usersFollowedByCount":853,"type":"SocialStats"},"social":{"userId":"lo_bdb4da6902e9","targetUserId":"18c72d00861","type":"Social"},"facebookAccountId":"10102167262485419","allowNotes":1,"type":"User"}},"Social":{"18c72d00861":{"userId":"lo_bdb4da6902e9","targetUserId":"18c72d00861","type":"Social"}},"SocialStats":{"18c72d00861":{"userId":"18c72d00861","usersFollowedCount":67,"usersFollowedByCount":853,"type":"SocialStats"}}}})
// ]]></script></body></html>