Learning a new technology/language is difficult, and it can seem daunting when getting started. This is the third time in 3 years that I have set out to learn something new and become proficient, so I wanted to share my experience on how I learned Scala and built SubwayTunes.
The code if now available on github.
Cheatsheet / tl;dr
Some of the technology behind SubwayTunes includes the Play Framework, ReactiveMongo, Docker, AWS Elastic Beanstalk, AWS S3.
I have many people who helped me accomplish this task. Here is a list of resources I used to help me learn Scala and Play Framework in no particular order:
- Scala for the Impatient for basic Scala syntax.
- Functional Programming in Scala and the accompanying solutions. A great book that uses exercises to re-enforce concepts in Scala. I recommend reading as much of this book as possible and attempting the exercises yourself first.
- Ebook - amazingly through and yet concise. Great reference for all levels.
- Look at other's code - don't worry about all the setup and just
git clone
and useactivator run
to launch. - Coursera class taught by the master. Coursera classes are not for me but the course offers great sources and I do recommend it.
- NYC Scala Meetup
Why?
Once a doctor graduates from Medical school, he or she has the responsibility to stay up to date with new developments in the field, by reading publications and attending conferences. Similarly, as software engineers, I believe it is our responsibility to stay current with new technology and best practices. You wouldn't build a Flash app for a website, would you?
Idea
When attempting to learn a new technology, the biggest barrier you will face is frustration and becoming overwhelmed. For this reason, it is important to supplement your technical learning with practical application. Doing so will allow you to switch contexts if one task becomes too tedious and help mitigate your frustration.
In my experience, having a tangible project is critical for successful follow-through. Better yet, choose an idea that is relevant to your daily life or your interests. Maybe you hate waking up in the morning...so make an alarm app.
Play
Spend some time setting up your environment and then write some code. There are plenty of resources to help you get started and write something more significant than a "Hello World!". Find a sample project on Github and get it to build. Then start tinkering with it.
The idea behind starting with a sample is to see a finished product in action and whet your appetite. You may not be able to accomplish much else, but thats ok.
Meet
Imagine wanting to be a chef and having Alton Brown show you how to perfect a recipe that he tried last week. That is the power of a good Meetup: being able to speak with some of the top professionals in the industry. Not only are you exposing yourself to the opportunity to network but also absorbing the jargon and best practices relevant to your project.
The biggest risk of attempting to learn something by yourself, is to waste time learning the wrong thing or just figuring out what to learn in the first place. A book can be a great resource, but it can quickly become outdated, especially in the field of software. My advice is to attend a few Meetups on the topic and see if one or two stand out. Then attend regularly for some time. I find myself feeling more motivated each time I attend a Meetup.
Ask
When at a Meetup, don't simply go for the organized talks. Ask people for recommendations on relevant books, tutorials, videos, conferences, and even other Meetups. Chances are, the people you meet have been in the same position as you are and can help you save weeks of guessing. Remember, you want to avoid wasting time as much as possible.
Repeat
Expect to get stuck. It takes years to be an expert at any technology. The goal is not to be perfect, but to keep stepping forward. You are bound to stumble across the finish like eventually! Switch between expanding your technical knowledge and project implementation. After gaining the preliminary knowledge, try your best to break your learning into discrete steps so that each new step helps you accomplish a piece of your project.
You might find yourself getting frustrated trying to achieve perfect implementation. Stop yourself. Just write something that works. I guarantee that regardless of what you write, it will change 2-3 times before the end of the project anyway.