【質問#71】Scala をはじめたいのですが

質問・悩み相談の回答です。

質問

30代後半のエンジニアで、最近は業務でプログラムを書くことはほとんどなく、管理業務が多いです。
ですが、急に業務でscalaを使う必要性が出てきまして、どのように学んだものかと思案しています。
言語の知識としては、30くらいまではasp,java,rubyなどを使っており、以降はDB開発やバックエンドのサーバやshellなどが多いです。プライベートでは javascript やnode.js なども軽くなら扱えるくらいの知識です。
管理者様は scala 使いと存じますが、ある程度開発言語が分かる、けど scala の知識がない人間が scala を開発するにはどのような方法が一番良いとお考えでしょうか。オススメの方法などあれば是非教えていただきたいと思います。

回答

私が実際にやってきてよかったと思うことを列挙してみます。

ドワンゴの研修資料を読む

ドワンゴで新卒エンジニア向けに使っているScala研修資料が公開されています。

「私が実際にやってきたよかったことを列挙する」と言っておきながら、いきなりですが私はこれを使って勉強はしませんでした(私が勉強を始めた時は無かったので)。でも、流し読みした感じ非常にわかりやすいので書いてみました。これをベースに勉強を進めると良いかもしれません。

以降の内容はこのテキストとかなり重複がありますが、自分の経験の範囲内で時系列で説明していきます。

IntelliJ IDEA + sbtを使う

まず環境ですが、初心者はIDEを使うことをお勧めします。IDEはScala IDEというEclipseベースのものとIntelliJ IDEAというものがあるのですが、Scala IDEは機能が貧弱なのでIntelliJを使った方が良いです。できればUltimateを。(ちなみにIntelliJはJava開発でも、Eclipseより便利と感じる機能が多いです)

IntelliJを使うと初心者が間違えやすいコード(.get(0)するなら.headした方が良いよ、.drop(1).take(3)するなら.sliceした方が良いよ、など)を指摘してくれます。

ただ、コードの実行とコンパイルはIDE任せではなくsbtコマンドを使い、なるべく早くにsbtを覚えておいた方が良いです。IDEだけでの開発は現実的でなく、遅かれ早かれsbtコマンドを触ることになるからです。

ですから、コードはIntelliJ IDEを使って書き、コンパイルと実行はsbtを直接たたくというスタイルが個人的にベストだと思います。

sbtはOS問わず公式からダウンロードして使うのが良いと思います。sbtの古いバージョンはバグがあったりするので、(他の言語のエコシステムと同じく)なるべく新しいものを使用したほうが良いです。

Lightbend Activator(Typesafe Activator)が便利だよ!と書いているサイトが多数あります(私のブログでも書いた気がしますが)。開発元が推奨している(?)のでついつい使いそうになりますが、Activatorでなくてsbtを使った方が良いと思います。sbt newというテンプレートからプロジェクトを作る機能も追加されて益々便利になり、Activatorを使う意義が薄れました。

慣れてきたらEnsimeというVimやEmacsでコードアシスト的な機能が使えるサーバがありますので、それを使っても良いかもしれません。私はGUI派なのでIntelliJを使い続けています。

省略ルールを覚える

まずScalaの省略ルールを何よりも先に覚える必要があります。何よりも先に、です。この知識が無いとコードを読み解くのが非常に大変になります。

以下のがくぞさんの資料が大変参考になります。

Scala の省略ルール早覚え

Trait, Case class, パターンマッチあたりを覚える

Scalaの特徴的な機能であるTrait, case class, パターンマッチあたりを触ってみましょう。またがくぞさんの資料ですが、以下あたりが大変参考になると思います。

パターンマッチいろいろ
trait と abstract class の使い分け

コレクションを使い分ける

公式ドキュメントのコレクションの使い方を一読しておきましょう。特に、不変/可変の違い、Traversable, Iterableの関係、どんなコレクションがあるのか、あたりに注目してください。

Scala Collections

使ってるうちに覚えるので暗記する必要はありませんが、「こんなのあったな」とコード打ってる最中に思い出せる程度にはちゃんと読んでおく必要があると思います。特に「性能特性」の項は頻繁に参照することになると思いますので、慣れるまで印刷して張っておいても良い気がします。

ラムダ式(クロージャ)、高階関数、Future、並列コレクション、Optionあたりを使う

ラムダ式や高階関数を使ったご経験がなければ(JSやnode.jsをご存じとの事でしたので無いとは思いますが、その他の読者向けに書いてます)、この際に覚えてしまいましょう。近代的な言語では大体これらに類する機能が実装されています。

ラムダ式と高階関数については、一応当ブログでも説明があります。

平凡なプログラマにとっての関数型プログラミング

Futureや並列処理(パラレルコレクション)については、とりあえず動かしてみて簡単な使い方を覚え、実際必要になったときに思い切り取り組んで悩み、玉砕し、成長するという方針で良いかとおもいます(実際の応用が伴わないと理解するのが難しいので)。

for式を使ってみる

高階関数の使い方やFuture、Optionが使えるようになればflatMapも普通に使っているはずです。次はfor式をモナド用の構文として使ってみましょう。「forってループ処理じゃなかったんだ!」とびっくりすると思います。

valとif, match, コードブロックなどの式を組み合わせて使ってみる

ラムダ式や高階関数を使っていれば、このあたりの重要性は言われなくても自然に気づくことでしょう。Scalaではコードブロックやif、matchなどが値を返す式になっているので、valとの相性が非常に良いです。

コップ本を読む

「Scalaスケーラブルプログラミング第3版」という本です(最近第三版になりました)。「コップ本」でググっても出てきます。

私はプログラミング言語はだいたい一切本を買わず、公式のリファレンスや言語仕様、ドキュメント類だけをみて勉強するのですが、Scalaの場合は本を買ったほうが良かったかな?となんとなく思います。公式のScalaドキュメントもかなり詳しく書いているので要らないっちゃ要らないような気もしますが…。あと、XMLリテラルとか「使わんだろコレ…」みたいな機能の解説もありますけど。

本を読むのがかなり後になりますが、それは私がプログラミングの本をあまり読まない人だからです。まず本を買って勉強するスタイルのひとは最初に買ってしまったほうが良いと思います。

FP in Scalaを読んでScalazなどを使う

ここまできたらもう普通にScalaは使えてると思います。それでも不足を感じたり、新たな領域にチャレンジしたい場合はもっと関数型プログラミングの深い部分を勉強していくと面白いかもしれません。

FP in Scalaとは、Functional Programming in Scalaという英語の本なのですが、「Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド」という名前で日本語版が出ています。

関数型プログラミングについては当ブログでもちょっとだけ書いてます。

関数型プログラミング

「型クラスペディア」という資料も大変参考になります。

私はとりあえず\/やValidationを使ったあたりでもうおなか一杯になったので、他の事(機械学習)を勉強してます。色々意見はあると思いますが、私はFP in Scalaで書かれている事まで理解する必要はぜんぜん無いと思います。ただ覚えていると教養が深まる、みたいなイメージです。

以上、ご参考になりましたら幸いです。