Different things work for different people a lot of the time, sometimes if you don’t feel like something makes sense you need to try a few approaches to learning it (look at the same parts in several books, check other courses, ask questions on forums like this). In general there are a few things that are going to make a huge difference learning a language irrespective of which language it is (and most would apply no matter the previous experience).
-
Work through the learning material at the computer, don’t just read it or listen to it. By this I mean type out every example (don’t copy paste it from the downloadable version) and try to make it run, if you make a mistake try figure it out, when you get it working try changing it in various ways to see what happens, if it breaks try to work out why that might be, if your change works does it do what you expect? why or why not?
-
Dedicate learning time regularly and consistently. Spending 10 hours one day working on it then coming back a week later and trying to pick up where you left off is extremely hard and it won’t have sunk in very effectively, you are much better to spend half an hour or an hour every day making gradual progress and quickly going over anything you need to revise.
-
Use the documentation as you’re learning. When a book or course introduces something take a moment to look at the documentation that goes with it, in many cases you will see a bunch of additional useful functions that you may want to take a little bit of time to explore deeper but at the very least you will get a sense of what is there and where to look for it. Every once in a while you should try to use some of the things you find in the documentation so you are familiar with how it describes different kinds of features and are comfortable using the information you find to write some code.
-
Try to solve problems you run into. This is a pretty tricky balance, you will learn so much more every time you figure out why something doesn’t work than when you get it right first time or when someone tells you / you look up the answer. However you don’t want to drive yourself to frustration, so try work it out, if you’re getting frustrated take a little break and give it another try, if you’re still struggling see if you can look it up or ask somewhere like here.
-
Use the community. Particularly here there is a great community who are in general very helpful, there are also several bookclub threads discussing topics and issues people are having as they work through books. As well as that you can read a lot of threads where you can find out how people are solving different types of problems in real projects, you can see many projects people are working on and you can get insight from people working on the language and major libraries about how they are designed. So browse topics and ask questions.
For an absolute beginners introduction to Elixir that doesn’t assume experience with some other language, the only one I have heard of is Joy of Elixir (which you can read online here: Table of Contents - Joy of Elixir). I’m not sure if there are any others. With pretty minimal experience and a will to spend some additional time looking up some terms the Elixir & OTP course from pragmatic studio (Developing With Elixir and OTP Course | The Pragmatic Studio) is really really good, this course gradually builds out a web server with various features from scratch so you will learn a lot of things about Elixir and the ecosystem, how to build things up into an actual project, how web servers work and the essence of what a web framework like phoenix does. At a fairly similar point Programming Elixir (Programming Elixir 1.6: Functional |> Concurrent |> Pragmatic |> Fun by Dave Thomas) is also a great book that again is a bit much to come into cold as a new programmer but doesn’t require large amounts of experience if you have some will to work through it. I found both of these to be very complementary to work through together and to cross reference. In both cases though you will find that they are intended for people coming from other languages so they will make reference or occasionally comparisons to concepts that many with an OOP background will find useful, so you might have to look up the term or just not worry too much and focus on the wider explanation. Another book that could be considered is Learn Functional Programming with Elixir (Learn Functional Programming with Elixir: New Foundations for a New World by Ulisses Almeida), I’m inclined to think that it could be a slightly better choice of book but I have not read it.
After going through these you would be in a pretty solid position to work through pretty much any other material depending on which parts were more interesting, you could consider Elixir In Action for more OTP stuff, Programming Phoenix for getting into more web stuff or browse through the many other titles that might catch your interest.
Sorry not really, I learned C# mostly at work and read a couple of books to fill in the gaps but that was 7 years ago and since then I have mainly kept up to date through official docs, release notes and some language feature tutorials so I am extremely far removed from what material is good for learning the language right now and even more so when trying to apply that to a beginners perspective. Given the vast difference between the styles of language you would want a book that is not just describing the language itself but also teaching the concepts of imperative and object oriented programming (an absolute beginner book really, there are plenty I just don’t know which ones are best).
A few things that I often take into consideration:
- Is this language well suited for what I want to do?
- How does this fit into career / job opportunities? This could be that there are many jobs in that language, that there are jobs of particular interest in that language or perhaps that it will involve a different way of thinking that adds to the overall perspective. It could also be fine to just do it for hobby projects/interest, but that should be a conscious decision.
- What does this language bring to the collection of language I know? By this I mean will it allow me to do something I currently can’t (e.g. maybe learning Swift because it is the main language for iOS), perhaps maybe it offers some concepts not found in other languages that are really interesting to learn from, perhaps it is modelled completely differently (if I only know OOP then maybe learning a functional language) that means I learn to think in completely different ways and can take those lessons across languages.
In general though, I would suggest a new programmer does not try to learn many languages in the first year. Focus on one, learn it well, learn the concepts well, explore some of the libraries and frameworks, learn essential engineering practices like automated testing, how to deploy an app somewhere etc. Later learn a completely different language, again pretty well, think about the differences, think about what each is better for, think about the design decisions and how they are approaching the same fundamental problems each has to over come. After a few years and a good foundation in a couple of languages you can easily start to jump around learning parts of some things that interest you or learning something more in depth to reach a goal. If you jump between things at the start you will end up going nowhere. So I think the main thing with the first language is choosing one that you can stick with, usually that means one that is good for the projects you initially are interested in exploring.