This plan is meant to keep you busy for at least four weeks, but feel free to go at your own pace. You definitely don't need to complete the whole plan in that timeframe, and it'd be better to take it slow than to rush through it all and only gain a surface level of understanding.
Once you've completed your first week of practice, send me an email and share your progress with me. We will revisit the plan from there and tweak as needed based on what you found interesting, challenging, etc. We'll then repeat that process on week 2 and week 4 of your studies.
How to practice
You will be working through reading materials, exercises, and a realistic project.
Spend about equal time on each of these three activities, but keep in mind that your project is most important, followed by exercises, and then by reading. It can be tempting to do more reading and less coding, because it's "easier" -- make sure to avoid that temptation.
Use whatever challenges you run into in your project to help you decide which exercises and reading materials to give the most attention. You want to get a good mixture of 'learning the big picture' and 'learning to solve a particular problem', but if in doubt, the latter is more valuable.
Don't set goals on how far you should progress in a day, week, etc. Instead, focus on putting the hours in and practicing as carefully as you can while you are practicing. Not every session will feel productive, and that's OK, as long as you're putting the effort in.
Finally, keep in mind that learning is not a linear process. Go back to things you've studied earlier if you think you've missed something, or think that you'll benefit from looking at something you worked through earlier now that you have some new insights and experiences. If you keep good notes and organize your solutions to exercises well, you'll be able to go back to them easily and revisit the topics in your own words.
This sounds like a lot of work, and it is. But keep in mind that 'dedicated practice' is not something you do all the time, so it's alright to be a little bit more rigorous while you are doing it. There is always time for fun (in coding and away from the keyboard) outside of your practice sessions!
Reading materials + exercises:
Carefully read and take notes on the following chapters, and complete the exercises. Make sure you have easy access to your computer while reading so that you can try out ideas and code samples as you read, but minimize distractions by staying away from email, twitter, reddit, HN, etc. while you read. If at all possible, schedule time specifically for your practice, so that you won't be interrupted by other things during that time.
Quality of your reading is more important than quantity. If you find a section boring or irrelevant, make a note of it and then just skip over it and come back later if you need to.
- Chapter 5: Records and Maps
- Chapter 6: Error Handling in Sequential Programs
- Chapter 7: Binaries and the Bit Syntax
- Chapter 10: Compiling and Running Your Program
- Chapter 11: Real-World Concurrency
- Chapter 12: Concurrent Programming
- Chapter 13: Errors in Concurrent Programs
- Chapter 14: Distributed Prrogramming
When working on exercises for the above chapters, spend a little bit of time on each one. If you get stuck on something, write down some notes on what you know and don't know about the problem, and then set it aside to return to later. Revisit this list of 'hard exercises' once a week or so, and pick one or two exercises to try again. Don't be afraid to search the web or ask others for hints to move things along.
In addition to the above, Skim Chapters 8 and 9, but don't worry about studying them closely unless you find something important in them for your project). Pick and choose chapters from Part IV based on what you might need for your project.
Chat server project
First, build a 'walking skeleton', i.e. something that is as simple as possible but can be built on top of. For example, build the necessary functionality to allow a single client to connect, join a single chat room, and then disconnect.
Add new features one-by-one into your project, starting as small as you can. (i.e. allow multiple clients to join one room as a second feature, multiple clients joining multiple rooms as a third feature, before progressing to more complex features like sending messages, running custom commands, etc.)
Each time you complete a new piece of functionality, read through your whole program and see if there are ways to improve it, especially if you've learned some new things recently.
Find out where to get help for your Erlang related questions, and where to get feedback on your projects and exercises.
Most likely this means locating the IRC channel and mailing lists commonly used by Erlang programmers, and making good use of Stack Overflow.
Make good use of these resources for whenever you get stuck, and also for when you think there might be a way to do something better, but don't know what to search for.
You can also ask me for help, but keep in mind I'm not an experienced Erlang programmer.