<div dir="ltr"><i style="font-family:Arial,Helvetica,sans-serif;font-size:13px">In a relevant language, create an array of 1000 numbers. Initialize all of the values in the array to zero. Create two threads that run concurrently and which increment each element of the array one time.</i><br>
<div><i style="font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></i></div>Sometimes the framing of the problem is the problem. In Erlang, which has no shared memory (except maybe ETS? But that's an entirely different issue), and no mutability, you would make two processes with lists of 1000 0's, which would map them into 1's. Maybe if they all need to be 2's, you might have a pipeline/chain of processes, each receiving messages and incrementing by 1. The issue is really the framing of the problem doesn't make sense in Erlang.<div>
<br></div><div><ol style="font-family:Arial,Helvetica,sans-serif;font-size:13px"><li style="margin-left:15px;line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">The tools are, well frankly, garbage. Sorry, in 2014 to be pushed back to coding with VIM and makefiles is primitive. Rebar is crytptic and just the pet project of a guy on GIT. Compared to Gradle, Maven and even (though I don't care for it much) SBT, rebar is ... lacking. I want to spend time working on my business logic, not fighting tools. There are plugins for eclipse and intellij but they have minimal functionality and i keep reverting back to vim. </span></li>
</ol><div><font face="Arial, Helvetica, sans-serif">This is really just a matter of familiarity. Yes, rebar could be better, I know because I use it every day. However, you might be surprised at how mature the OTP ecosystem is (it has 10 years on Java, by the way). IDEs are not the way to go with Erlang generally, but Emacs has support for Wrangler which does automated refactoring and Distel which lets you fire up and interact with Erlang nodes directly from the editor (including debugging!), and much more. Dialyzer lets you introduce gradual typing into your program so you can find many bugs, a thing I've grown attached to lately.</font></div>
<div><font face="Arial, Helvetica, sans-serif"><br></font></div><div><font face="Arial, Helvetica, sans-serif">It seems you are just comfortable in your IDE. </font><span style="font-family:Arial,Helvetica,sans-serif">When you started doing Java or Scala were you immediately familiar with all the tools in its ecosystem? I doubt it. Any new language ecosystem will have its own ramp-up time.</span></div>
<ol style="font-family:Arial,Helvetica,sans-serif;font-size:13px"><li style="margin-left:15px;line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">Much harder to staff than Scala because it is not Java based. </span></li>
</ol><div><font face="Arial, Helvetica, sans-serif">Actually we have found this to be an advantage. Yes, it's harder to find *any* programmer, but *good* programmers will try out new things because they have an interest in learning and are adaptable. Head-count isn't always the answer. One of our best Erlang devs at Basho came from a shop where he did mostly Clojure. I think our CTO Justin Sheehy said it more eloquently here: <a href="http://basho.com/erlang-at-basho-five-years-later/">http://basho.com/erlang-at-basho-five-years-later/</a></font></div>
<ol style="font-family:Arial,Helvetica,sans-serif;font-size:13px"><li style="margin-left:15px;line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">Fewer general purpose libraries and no major central repositories. I don't want to write code to create JSON, that isnt part of my business scope. I will pick that one of the shelf If i can. </span></li>
</ol><div><font face="Arial, Helvetica, sans-serif">Erlang/OTP contains most of what you need, but there are also plenty of libraries for mundane things like JSON codecs, etc, and often the top Erlang projects use them already! Many times a quick search on Github or Google will help you find what you need.</font></div>
<ol style="font-family:Arial,Helvetica,sans-serif;font-size:13px"><li style="margin-left:15px;line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">Records as the only structured data type is ... annoying. </span></li>
</ol><div><font face="Arial, Helvetica, sans-serif">Records aren't "structured data types", they're a compile-time syntax sugar over tagged tuples. I suspect this criticism comes from your background as an OO programmer.</font></div>
</div><div><font face="Arial, Helvetica, sans-serif"><br></font></div><div><font face="Arial, Helvetica, sans-serif">I hope you won't dismiss Erlang for the wrong reasons. Yes, it is a totally different world from JVM projects, but it's one I have enjoyed working in for a long time.</font></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jan 30, 2014 at 10:26 AM, Aaron France <span dir="ltr"><<a href="mailto:aaron.l.france@gmail.com" target="_blank">aaron.l.france@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">Then what about Clojure?</p>
<p dir="ltr">You can stay on the jvm, use Java  code and it has a focus on concurrency.</p>
<p dir="ltr">Whilst it fails hard on fault tolerance it could be an escape hatch for those stuck with the jvm</p>
<p dir="ltr">Aaron</p>
<div class="gmail_quote"><div><div class="h5">On 30 Jan 2014 17:22, "kraythe ." <<a href="mailto:kraythe@gmail.com" target="_blank">kraythe@gmail.com</a>> wrote:<br type="attribution"></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5">
<div dir="ltr"><span style="font-family:Arial,Helvetica,sans-serif;font-size:13px">Ok right up front, I'm a Java Guru, not a Scala or Erlang one. What that means is that I know more than most debs about the core java language, but enough to know where the problems are. And certainly java has many issues but it also has massive momentum. I think one of the issues with Java can be expressed in one little programming puzzle I came across recently: </span><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


<br></div><blockquote style="font-family:Arial,Helvetica,sans-serif;font-size:13px;margin:0px 0px 0px 40px;border:none;padding:0px"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><i>In a relevant language, create an array of 1000 numbers. Initialize all of the values in the array to zero. Create two threads that run concurrently and which increment each element of the array one time.</i></div>


</blockquote><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


Interesting? The solution in Scala that I came up with is the following. </div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></div><blockquote style="font-family:Arial,Helvetica,sans-serif;font-size:13px;margin:0px 0px 0px 40px;border:none;padding:0px">


<div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">def mtmap[A](data : List[A], threads: Int, f: (A) => A) = {</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">  import scala.concurrent.{ExecutionContext, Future, Await}</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">  implicit val executor = java.util.concurrent.Executors.newFixedThreadPool(threads)</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">  implicit val context =  ExecutionContext.fromExecutorService(executor)</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">  val futures : Future[List[A]]= Future.traverse(data)(x => Future{f(x)})</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">  import scala.concurrent.duration._</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">  import scala.language.postfixOps</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">  val results : List[A] = Await.result(futures, 1 minute)</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">  results</font></div>


</div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline"><font face="courier new, monospace" style="margin:0px;padding:0px;border:0px;vertical-align:baseline">}</font></div>


</div></blockquote><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


Just thinking of doing this in Java will bring up some of the big problems with Java; I will leave it as a mental exercise for the reader. The problem is that Scala inherits some of them from the JVM and that has made me look into Erlang. The goal being to select a language for the development of a concurrent TCP/IP based application with thousands of users interacting in a small space. </div>


<div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


So far I think the contenders I have are Scala with Akka or Erlang. And yes, I know there are evangelists to both and I will post this to an Scala list to get their feedback as well (or something similar). Now, right up front I am not peeing on either language. They both rock or they wouldn't be on the list. The question is which should win the prize. There is no going back once development is 1000 hours down the road. </div>


<div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


<u><b>Scala:</b> </u></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><b>Pros:</b> </div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


<ol><li style="line-height:17px">Based on Java Ecosystem so easier to staff because good Java devs can convert to Scala. <br></li><li style="line-height:17px">Decent tools (which are getting better). Many libraries. </li>


<li style="line-height:17px">Static typing with type inference. </li></ol></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><b>Cons:</b> </div>


<div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><ol><li style="line-height:17px">Based on Java Ecosystem and inherit the problems of that ecosystem (i.e. immutable is a function of the design of a class, not of the language so it can't be guaranteed.), Also library code under the hood is not as rigorous as scala code in enforcing immutability so at some point you are rolling dice here. </li>


<li style="line-height:17px">Scala is also more heavyweight than Erlang when it comes to spawning thousands of processes. Erlang was built from the ground up to do concurrency. For Scala its an Akka bolt on can carries the Java threading nightmare (shared memory, etc). <br>


</li><li style="line-height:17px">Scala is not as fast. My server will be doing billions of vector math calculations per day and they have to be in the terms of milliseconds of latency. It has to be that if I have a user R in the server at position V where V is a vector, I need to calculate all other actors within 50 units and get that answer in milliseconds so that only the network latency is the bottleneck. Some of this can be helped with algorithms like spatial grids and so on but still we are looking at a couple of hundred vector math calls per second. </li>


<li style="line-height:17px">Scala is harder to hook up to dozens of nodes and move actors from node x to node y than Erlang, mainly because that was one of the design goals of Erlang.</li></ol></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


<br></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><u><b>Erlang:</b></u></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


<b>Pros:</b>  </div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><ol><li style="line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">Built for concurrency. Can handle dozens of hardware nodes, build massive applications of the kind I am trying to deploy. Think of 100k users connecting to the cluster with a TCP connection and interacting over that connection which interacts with any or all of the other 100k actors. </span></li>


<li style="line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">Built from the ground up with immutability in mind. Immutability is a language feature, not compromisable. Its not JVM based and so is not under the same issues as Java is. </span></li>


<li style="line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">There is merit in the thought that static typing is sometimes a hinderance to a language. </span></li>


</ol></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><b>Cons:</b> </div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


<ol><li style="line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">The tools are, well frankly, garbage. Sorry, in 2014 to be pushed back to coding with VIM and makefiles is primitive. Rebar is crytptic and just the pet project of a guy on GIT. Compared to Gradle, Maven and even (though I don't care for it much) SBT, rebar is ... lacking. I want to spend time working on my business logic, not fighting tools. There are plugins for eclipse and intellij but they have minimal functionality and i keep reverting back to vim. </span></li>


<li style="line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">Much harder to staff than Scala because it is not Java based. </span></li><li style="line-height:17px">


<span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">Fewer general purpose libraries and no major central repositories. I don't want to write code to create JSON, that isnt part of my business scope. I will pick that one of the shelf If i can. </span></li>


<li style="line-height:17px"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;line-height:normal">Records as the only structured data type is ... annoying. </span></li></ol><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline">


<br></div></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">The problem I have is I can't find the perfect solution. Erlang is compelling but also is Scala. </div>


<div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></div><div style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Arial,Helvetica,sans-serif;font-size:13px">


Opinions?</div></div>
<br></div></div>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Sean Cribbs <<a href="mailto:sean@basho.com" target="_blank">sean@basho.com</a>><div>Software Engineer</div><div>Basho Technologies, Inc.</div><div><a href="http://basho.com/" target="_blank">http://basho.com/</a></div>

</div>