I feel that I've been procrastinating a lot in my free time and it's time to learn something new.<p>I see the hype around Go and Rust and I believe I'm missing a lot in my professional development. I'm involved with my start-up and I am facing a lot of challenging data analytics and software development problems during the day. I am using Java/JavaScript/R on a daily basis, but these are mature languages that have been around for a while and I have a hard time learning new frameworks that are beyond my work scope.<p>So what (hot) languages/frameworks are you learnin/using now, that give you the warm feeling that you get a lot of useful knowledge out of them, that's widely applicable?
Elixir. While Rust and Go get way more exposure lately, they're mostly designed for systems programming. Many more of us do web development, and it's really amazing how fast Elixir has become a very cool and <i>mature</i> environment for developing great web apps.<p>Elixir is a really cool language, and also a great way to learn functional programming. But more than that, it gets all the non-languagy stuff right. The build system is amazing, your code hot-reloads out of the box, dependency management is <i>very</i> well done (source-only, git-friendly, project-local, etc), the community is very friendly and going <i>fast</i>.<p>And code scales <i>by default</i>. I might exaggerate here, but sometimes it feels like need to <i>really try</i> to write code that's hard to spread across servers. If you consider it's non-trivial to even use all your CPU cores on Node.js, the Erlang VM will blow your mind.
<a href="http://elm-lang.org" rel="nofollow">http://elm-lang.org</a> is a functional and reactive client-side (js target) language that is still young and getting great very fast. <a href="http://pragmaticstudio.com/blog/2014/12/19/getting-started-with-elm" rel="nofollow">http://pragmaticstudio.com/blog/2014/12/19/getting-started-w...</a> The idea of combining Elm with Elixir or Yesod (Haskell) on the server side seems exciting.<p>Another interesting project is Snabb Switch. If you want to learn networking at the lowest level and highest speed possible in software, Snabb a great platform for experimentation.<p>Finally, I'll throw in <a href="http://terralang.org" rel="nofollow">http://terralang.org</a>. It's not networking related. But, I think it's terribly interesting and not getting any attention.
The hype for Go/Rust is really just on HN.<p>If you are involved in data analytics then you could always immerse yourself in the Hadoop stack e.g. Cascading, Spark, Mahout etc. It's a platform that is increasingly become a fixture in enterprise companies and plenty of new technologies. For me the future will be "container driven development" where everything will be deployed as a container and dynamically wired together. Loads of new technologies e.g. Docker, Consul and plenty of challenges still around.<p>None of what I wrote is around languages/frameworks though mainly because I think that the majority of them won't be really used in 5-10 years.
If learning is going to be a hobby, then learn something different (because that gives you perspective), but also something that has some connections to what you already know (because if you learn something part-time, then it's good if you don't need to re-learn all tools, environment, etc.).<p>I would not care of the 'hot' stuff too much - frameworks come and go.<p>I'd try some Clojure (you're familiar with the JVM and IDEs, but one should learn a bit of Lisp once in life). Or Scala.
Elixir!<p>On one hand it has a simple ruby-ish syntax and a solid MVC framework (Phoenix).<p>On the other hand it has immutability, concurrency through processes and message passing (which is awesome!) and a bunch of other functional goodies.<p>I'm not sure how widely applicable it is now, as it's still in its infancy, but it's the first "hipster" language I've used in a while that felt like it had legs.
Kernel is hands down the most interesting language I've used.<p>The Kernel language is small and simple, yet offers a huge contrast to how you would think about programming in most other languages - namely because other languages have reduced their model of computation to reduction.<p>Kernel is influenced by the Lisp family, but offers somewhat of a duality to it. In lisp, everything is passed implicitly reduced unless explicitly quoted, then they are passed verbatim. In Kernel, everything is passed verbatim unless explicitly evaluated - the callee then, has complete control over how something is evaulated, rather than the caller. (And consequently, it's trivial to simulate lisp's computational model in it)<p>Reduction then, is just a special case of a much more general computational model - passing arguments around. Other languages have coupled the idea of argument passing with reduction, such that they need to invent compiler hacks like macros or code generation when it turns out that reduction is not what they want. Or in some cases, we've created languages specifically for template-based programming, where we want to splice bits of code into an otherwise static block of text. Such templates are trivial to do in Kernel.<p>Another nice feature of Kernel is that of encapsulation types. One can define a new type which consists of a constructor function, eliminator function and a predicate to test for the type - and combined with the powerful information hiding that can be achieved through Kernel's environment model, one can implement sophisticated type systems using very few primitives, and without special compiler support.
Whoa! Noone mentions elm (elm-lang.org)?!<p>There is much brewing in language land. Rust brings a set of ideas that other languages will borrow (pun intended). But..<p>Elm restarts programming, treating events as lists, and this is how programming will change over the next 5-10 years in a most fundamental way.<p>Taken together programming is climbing out of the miserable non-composable mess that having been stupid bread-and-butter bit-fuckers have put us in. Elm just leads the pack.<p>You may not understand its ways, that is exactly because you think being a bread-and-butter bit-fucker is a feature, while it most definitely is not. It is a bug and it infests the code you write, up to the point where unlearning is an unsurmountable effort.<p>When elm's wave is through, the computer will replace you, and with it children will design much better programs than you do. Please stop making sense now.
If you don't know python and you're interested in analytics you should solve that.<p>IMHO you'll become a far better developer if you devote the majority of your time to learning advanced algorithms, ml, and ai as opposed to the new hot framework.
It's good to hear that a lot of people are experimenting with functional languages like Haskell and Erlang, but I think we should step back a little and take a look at C++ and its development over the years.<p>As you probably know C++11 is already around and majority of
compilers already support it. What most people don't know is that C++14 is ready to kick some ass too! It introduces for the first time in C++'s history functions as first class objects and allows you to pass them around as function parameters!
I think this is really exciting and I also encourage as many people to take a look at this new and very promising developments of C++ language.<p>On the other hand, Apple's Swift looks promising too - functional elements, type inference, speed, good compiler and so on. Not to mention it's being used with tons of great frameworks Apple provides for iOS and OS X development. It sure doesn't hurt to take a look into it too.<p>All in all, it really is an exciting time for us developers. There are really tons of cool tools and languages that allow us to get things done at the speed never imagined before.<p>Now, we should also look back at the fundamentals and ask ourselves could we design, not only program? That's not the skill you can pickup in couple of days reading bunch of tutorials and forums about your next cool language. I think, learning how to think about particular problem and how to approach it is more important than barely know how to code the first solution that comes to your mind in the new ultra fancy language.
Think about it...
Git is not the final word in DVCSes... Take a look at Mercurial, in particular, the Mercurial Evolve feature. It's an innovative way to collaboratively polish commits. Imagine pull requests that could be rewritten with the history of the rewrites being easily accessible as you see them, well, <i>evolve</i>. Evolve is basically a way to record and use distributed meta-history of the editions of your commits. It's like a beefed-up git reflog.
Reading these replies just makes me sad. There's plenty of value in and plenty to learn from older technologies like Lisp, Scheme, Smalltalk, and Forth.<p>Sure, there's a lot of hype around newer technologies. There's never a shortage of hype. But the glow around virtually all of them will fade, probably sooner rather than later.<p>Ruby and Python are no longer considered hot and new, but not so long ago they were. Java and Perl had their share of hype back in the day, but the luster has certainly wore off by now.<p>Too many people involved in the tech field are endlessly chasing the next shiny thing.
Just as a side comment, the reason languages/tools are fun to learn is because it's usually quite easy to do so. You say you know R, but the depth of packages available for R is insane, and most of it requires a level of math that few possess.<p>I'd punt on learning a new language and instead master a new skill - up your stats knowledge, force yourself to learn how some algorithm works, whatever,.. these things are all infinitely reapplicable skills, whereas a pretty compiles-to-JS language or prettier-C-derivative generally aren't so much.
If your self-admitted problem is that you "have a hard time learning new frameworks that are beyond my work scope", it probably means your experience is deep but narrow.<p>If that's the case, you don't need to learn a hot/new technology, you need to cast a wide net and get a better grasp on today's software ecosystem in general, until picking up new things is no longer hard.<p>You could nonetheless kill two birds with one stone if you hacked on something current but wide. Docker and its ecosystems come to mind.
Give Lua some love. Learn the language, learn the VM. Learn to integrate it with a set of libraries and so on. Lots of bleeding edge stuff runs on Lua and its a fantastic stack of technology to learn ..
Nobody's mentioned Julia?! I love this language. I do scientific research and high performance computing and have been exploring this language extensively over the past year. Combined with something like iJulia (iPython), it's a very versatile tool for analyzing and processing data.<p>It's got a few quirks, but the language designers are improving it rapidly and the number of libraries available for it is increasing drastically.<p>To name a few features I really like about the language: multiple dispatch, flexible type system (use it if you need performance; ignore it if you want pretty code), powerful macro system, extensive debugging system (instantly view AST, LLVM, and native assembly output to optimize), easy parallelizability/vectorization, and just an overall beautiful language design (unlike C++ or Matlab for instance).<p>Things I dislike about Julia, but that should be changed soon: unintuitive automatic memory allocations (<i>everything</i> seems to allocate new memory by default which is a pain for tight loops because you have to write layers of functions that all take tons of "output variable" parameters), incredibly slow start-up times, and documentation that leaves a lot to be desired in terms of details (I normally have to call methods() in a REPL to figure out exactly what I need to pass into functions). Also, the module system seems a little more confusing than it needs to be.
I'd recommend learning how to learn. Making learning and curiosity a part of your every day existence will have more of an impact that the latest hot language or framework.
"There is no wind that blows right for the sailor who doesn't know where the harbor is."<p>Decide and have clear what is the question, then look for the answer.<p>---<p>For the fun of learn, pick anything you can do and put some time of it. If you are like me, you will read some info about X and and if it pick you interest go ahead.<p>But without a direction, you will waste time. You will dismiss things that are good and double-focus in things that not..<p>----<p>"I am facing a lot of challenging (which ones?) data analytics and software development problems during the day (which ones?)"<p>"Data analytics (and his not-famous cousin reports)" is far more about re-shape and clean data than do cool algorithms. The last mille is the easy and the 909% (yep, 909%, not a typo!) is the hard, in opposite to normal development.<p>Having a clean, well defined schema/database/warehouse/etc is the thing here. Run your super-fancy mathy-thingy on it? Others have solved that!<p>Most likely, non-normal-dev will have a bigger impact on this kind of jobs, so not just focus in tech.. (and I don't drink the fallacy that your selection of tools not matter. But is also a mistake think that are the only thing that matter).
Get yourself a Raspberry Pi, Arduino, and/or a Beaglebone.<p>You wouldn't believe how much playing around with these units will help to influence your design and development decisions in other areas.
I don't know that it's particularly new or hot, but I've been learning F# and I really like it. With Microsoft open-sourcing .NET Core and Mono getting a lot of improvements from it, I'd love to see this become a viable platform for doing web development on Linux with F# in the future.
Don't know how well you know Java, but look into Reflection and Annotations, it could simplify your development a great deal.<p>Also: <a href="http://blog.paralleluniverse.co/2014/05/01/modern-java/" rel="nofollow">http://blog.paralleluniverse.co/2014/05/01/modern-java/</a>
Rust is awesome if you want to follow along and see how the bread is made. One of the best things about being involved in Rust since it was announced is being able to recount all the different paths it's taken and the reasoning behind them. It has taught me a lot about good language design, validated and sometimes destroyed some of my ideas about programming concepts and overall provided a great environment for questioning how things work.<p>I come from a C background however which is a little closer to Rust than Java/Javascript/R but I don't think you would hvae that much trouble if you put your mind to it. Java is a similarly large language if a bit removed from the metal.
It's not a hot technology ( read as overhyped ), but if you're in the analytics space and not using Python/PyData tooling then definitely check that out. It's certainly as mature, if not more so than R.
The thing that I am studying in my spare time are Agda and Haskell.<p>Haskell gave rise to bunch of strongly typed DSLs both for front-end and backend development.<p>Agda is sort of derivative of Haskell, and gives you powers to reason MUCH MUCH clearer about your code and what you want it to do.<p>I have wet dreams of using those languages on my everyday development. Esp Haskell.<p><a href="http://learnyouahaskell.com/" rel="nofollow">http://learnyouahaskell.com/</a>
<a href="http://learnyouanagda.liamoc.net/" rel="nofollow">http://learnyouanagda.liamoc.net/</a><p>When I catch some time I will fiddle with Elixir also mentioned here in comments.
If you're into analytics and data processing and want to learn something new, I would recommend Clojure[0]+Incanter[1].<p>Also, check out Cascalog[2]. Data processing on hadoop clusters has never been this simple and fun. Much better than Pig/Cascading/etc.<p>[0] <a href="http://clojure.org/" rel="nofollow">http://clojure.org/</a>
[1] <a href="http://incanter.org/" rel="nofollow">http://incanter.org/</a>
[2] <a href="http://cascalog.org/" rel="nofollow">http://cascalog.org/</a>
OpenStack seems to be trending, if you are into the whole cloud thingy.<p>I've only been in contact with TaskFlow, the state and workflow management library that OpenStack uses, and I'm very impressed how well-engineered it is.<p>On a related note, OpenStack uses RabbitMQ, and that seems to be trending too. Not a huge hype, but a steady adoption by both open source community and enterprises. And if not RabbitMQ, then being familiar with some kind of asynchronous messaging framework certainly wouldn't hurt.
ClojureScript, along with Reagent (or some other React.js wrapper like Om or Quiescent - I currently prefer Reagent, which has been gaining lots of traction recently), Figwheel and a browser REPL, has really had a lot of impact on how I view GUI development.<p>I do Winforms development in my day job and I hate it. The feedback loop I have from changing something in the code to viewing it in the application can be a matter of 1-2 minutes (need to compile, start up, login, setup everything to the correct state, etc). Going from that to being able to grow the application in real-time, without ever having to restart/refresh, is amazing, and makes me feel infinitely more productive. Combining it with Cordova to make mobile web apps, where I can deploy once to my phone and then have changes be applied over wifi as I type them into my text editor, is super sweet.<p>Getting everything set up can be a bit tricky, but <a href="https://github.com/plexus/chestnut" rel="nofollow">https://github.com/plexus/chestnut</a> makes it a whole lot easier.
I'm learning Haskell right now and it's great. I don't know how widely used it is in production, but it's introducing me to tons of ideas that are applicable in lots of other languages (e.g., how to do functional programming effectively, how to effectively use a strong type system, how to separate out functions with side effects).
I think that functionnal programming is a good candidate. You can learn about it in different situations/languages. It opens the mind about the code and its design by exploring other patterns.<p>- <a href="http://scott.sauyet.com/Javascript/Talk/FunctionalProgramming/" rel="nofollow">http://scott.sauyet.com/Javascript/Talk/FunctionalProgrammin...</a> explain how procedure <i>ahem</i> function composition leads to better/more readable code<p>- datalog is a DSL for querying (recursive/linked data) <a href="http://www.learndatalogtoday.org/" rel="nofollow">http://www.learndatalogtoday.org/</a><p>- The introduction to Reactive Programming you've been missing <a href="https://gist.github.com/staltz/868e7e9bc2a7b8c1f754" rel="nofollow">https://gist.github.com/staltz/868e7e9bc2a7b8c1f754</a>
> that's widely applicable<p>Other than Laravel (PHP), Python and Erlang (then Elixir), there's not much to try that's applicable. You'll be pleasantly surprised to see that your Erlang implementations are orderS of magnitude smaller (codewise) than your Java implementations, with different performance hurdles. Try new dbs like Redis or new messaging primitives like ZeroMQ. Find a basic analytics package like Munin or RDDTool.<p>I'm disappointed by the suggestions on this list, which is an ear full of bad advice. elm, kernel, julia? At least Lua is something that you will run into as an option, from time to time. That being said, you don't need to practice it. It's easy to treat it like a dumber version of javascript and you're fine.
I'd pick a type of project then pick a language/framework to learn. I'm not a big believer in learning something something just to learn it. You only get so far. I've got my own library of Haskell, Scala, and Lisp books but until I have something interesting to build, it's hard to maintain momentum.
My two current projects are a Go web app hosted on Digital Ocean: <a href="http://thespanishsite.com" rel="nofollow">http://thespanishsite.com</a><p>And I'm learning Swift to incorporate into my iOS apps. I've accumulated over 300 urls for anyone who wants to learn Swift: <a href="http://www.h4labs.com/dev/ios/swift.html" rel="nofollow">http://www.h4labs.com/dev/ios/swift.html</a>
I've always taken the approach to decide on a new concentration to study, and then learn the languages appropriate for that. First time I did this, the concentration was databases, so I set about learning SQL and data design and relational algebra. I wanted to learn more about front end development, so I focused on JavaScript, DOM, and single page applications. Other examples abound. But having a distinct idea of an application I want to build before learning a particular language has always worked out better for me than trying to find an application after reading a language's documentation.
For someone that just started learning how to program about 6 months ago, I decided on Python and R and can write all the basic stuff, but can't write a complete application yet. I've also decided on learning Angular too, but I've not made any serious attempt. And that was after evaluating all the other JS frameworks out there - Ember, Meteor, etc.<p>Now from reading these comments, it looks like Elm and Elixir are good to learn too.<p>So the problem facing someone that's just starting out, is what to learn? Where do you start? The options are many and can be confusing.
I recommend Nim <a href="http://nim-lang.org/" rel="nofollow">http://nim-lang.org/</a> (the website docs don't look too good at the moment, but this has been fixed for the next version that will be out in a few days).<p>Nim is an incredibly good language that compiles to C, is fast, and has very easy bindings creation to any C library you want. For me, it's the best of both worlds between a Python look (indented, clean) and a fast typed compiled language that helps you instead of hindering you.<p>You might be interested in checking it out.
Consider Scala or Clojure. You'll be able to leverage the same libraries you've been using in Java (pretty trivially), while having access to a completely new way of thinking (functional).<p>I personally prefer Scala as I like strongly, statically typed languages, but I've played about with Clojure and it's very nice, too. A vast number of benefits come from having a rich immutable collections library.
Not a specific language, but you should try learning about functional programming (eg. Java 8, Clojure, Scala, Haskell).<p>Also, if you want a brief overview of different paradigms you should check "Seven Languages in Seven Weeks" (<a href="https://pragprog.com/book/btlang/seven-languages-in-seven-weeks" rel="nofollow">https://pragprog.com/book/btlang/seven-languages-in-seven-we...</a>)
On the engineering side, I think you should learn concepts such as asynchronous programming, actor based programming and functional programming, and pick a new language (Swift, Scala, Go, Rust, etc.) and learn it.<p>On the more practical side, I think data science is a very useful tool, so learn everything there is to do with data today, from machine learning and data mining in small scale to big data processing.
Cloud Foundry.<p>(I'm biased, I'm currently seconded from Pivotal Labs to Cloud Foundry development in the buildpacks team).<p>It's an opensource PaaS. A full, all-the-stuff-you-need-is-in-there PaaS. You can take it and run it in a private datacentre.<p>For large companies, this is A Big Deal. Right now, in most F500s, deploying an application takes anything from days to months.<p>Except if they've installed Cloud Foundry, where deployment time drops to seconds to minutes.<p>For startups, it will soon be a big deal, because Cloud Foundry gives you a smooth path from just-playing-around (deploy on public cloud with Pivotal Web Services or IBM Bluemix) through to running on AWS (with the opensource distribution or a commercial derivative like Pivotal CF) through to running on your own hardware in your own datacentre.<p>CF is still evolving fast. The execution core is being rewritten currently and will probably hit feature parity early in 2015, carrying along with it the ability to natively allocate, mount, manage and monitor Docker and ACI container images.<p>It gets very little buzz on HN, because what interests us is building our own stuff out of cool, smaller components. Plus the main organisations driving development (Pivotal and IBM) have focused their marketing and sales at big companies, not startups.<p>Systems of this reach and influence basically appear once in a generation. I'd hop on while it's fresh, if I was you.
What's recommended for an experienced "back-end" developer who wants to dabble in front end and web development, but never spent much time in it? It seems like there are a million options for web stack components, and a lot of tutorial resources are geared towards total non-developers.
well since you're using Java/JavaScript/R on a daily basis
I would recommend Dartlang. It has futures, awaits/async, enum, SIMD. Works in client and server side. Its also really fast. www.dartlang.org
As a sub-question, I would be interested if the answer was restricted to frontend frameworks (eg. Backbone/Ember/etc.) for 2015. Thanks in advance.
Learn Nodejs/Meteor then join the product and help contribute relational database support. Please. Nodejs and persistent connection is a hugely important technology by my estimation which will become popular. Meteor is interesting because it is a full stack of interlocking parts that work together quite well, to lend an interesting new perspective on web development as a whole. However currently it doesn't support relational databases.
I haven't been as excited about anything in awhile as I am about Mesos. Program against the data center. Distributed by default. Fault tolerant everything. Lower your AWS bill.
You said Javascript but didn't mention Node.js. I would recommend learning Node.js if you haven't done that already, just because it's so darn useful.