相談フォーム信頼の「飲んだくれマーク」をご確認下さい。質問・悩み相談の回答です。質問30代後半のエンジニアで、最近は業務でプログラムを書くことはほとんどなく、管理業務が多いです。急に業務でscalaを使う必要性が出てきまして、どのように学んだものかと思案しています。言語の知識としては、30くらいまではasp,java,rubyなどを使っており、以降はDB開発やバックエンドのサーバやshellなどが多いです。軽くなら扱えるくらいの知識です。開発するにはどのような方法が一番良いとお考えでしょうか。オススメの方法などあれば是非教えていただきたいと思います。私が実際にやってきてよかったと思うことを列挙してみます。ドワンゴの研修資料を読むドワンゴで新卒エンジニア向けに使っているScala研修資料が公開されています。「私が実際にやってきたよかったことを列挙する」と言っておきながら、いきなりですが私はこれを使って勉強はしませんでした(私が勉強を始めた時は無かったので)。流し読みした感じ非常にわかりやすいので書いてみました。これをベースに勉強を進めると良いかもしれません。以降の内容はこのテキストとかなり重複がありますが、自分の経験の範囲内で時系列で説明していきます。sbtを使うまず環境ですが、初心者はIDEを使うことをお勧めします。IDEは機能が貧弱なのでIntelliJを使った方が良いです。できればUltimateを。(ちなみにIntelliJはJava開発でも、Eclipseより便利と感じる機能が多いです)IntelliJを使うと初心者が間違えやすいコード(.get(0)するなら.headした方が良いよ、.drop(1).take(3)するなら.sliceした方が良いよ、など)を指摘してくれます。コードの実行とコンパイルはIDE任せではなくsbtコマンドを使い、なるべく早くにsbtを覚えておいた方が良いです。IDEだけでの開発は現実的でなく、遅かれ早かれsbtコマンドを触ることになるからです。IDEを使って書き、コンパイルと実行はsbtを直接たたくというスタイルが個人的にベストだと思います。sbtはOS問わず公式からダウンロードして使うのが良いと思います。sbtの古いバージョンはバグがあったりするので、(他の言語のエコシステムと同じく)なるべく新しいものを使用したほうが良いです。Activator)が便利だよ!と書いているサイトが多数あります(私のブログでも書いた気がしますが)。開発元が推奨している(?)のでついつい使いそうになりますが、Activatorでなくてsbtを使った方が良いと思います。newというテンプレートからプロジェクトを作る機能も追加されて益々便利になり、Activatorを使う意義が薄れました。慣れてきたらEnsimeというVimやEmacsでコードアシスト的な機能が使えるサーバがありますので、それを使っても良いかもしれません。私はGUI派なのでIntelliJを使い続けています。省略ルールを覚えるまずScalaの省略ルールを何よりも先に覚える必要があります。この知識が無いとコードを読み解くのが非常に大変になります。以下のがくぞさんの資料が大変参考になります。パターンマッチあたりを触ってみましょう。がくぞさんの資料ですが、以下あたりが大変参考になると思います。使い分けコレクションを使い分ける公式ドキュメントのコレクションの使い方を一読しておきましょう。Iterableの関係、どんなコレクションがあるのか、あたりに注目してください。Collections使ってるうちに覚えるので暗記する必要はありませんが、「こんなのあったな」とコード打ってる最中に思い出せる程度にはちゃんと読んでおく必要があると思います。「性能特性」の項は頻繁に参照することになると思いますので、慣れるまで印刷して張っておいても良い気がします。ラムダ式(クロージャ)、高階関数、Future、並列コレクション、Optionあたりを使うラムダ式や高階関数を使ったご経験がなければ(JSやnode.jsをご存じとの事でしたので無いとは思いますが、その他の読者向けに書いてます)、この際に覚えてしまいましょう。近代的な言語では大体これらに類する機能が実装されています。ラムダ式と高階関数については、一応当ブログでも説明があります。平凡なプログラマにとっての関数型プログラミングFutureや並列処理(パラレルコレクション)については、とりあえず動かしてみて簡単な使い方を覚え、実際必要になったときに思い切り取り組んで悩み、玉砕し、成長するという方針で良いかとおもいます(実際の応用が伴わないと理解するのが難しいので)。for式を使ってみる高階関数の使い方やFuture、Optionが使えるようになればflatMapも普通に使っているはずです。次はfor式をモナド用の構文として使ってみましょう。「forってループ処理じゃなかったんだ!」とびっくりすると思います。コードブロックなどの式を組み合わせて使ってみるラムダ式や高階関数を使っていれば、このあたりの重要性は言われなくても自然に気づくことでしょう。Scalaではコードブロックやif、matchなどが値を返す式になっているので、valとの相性が非常に良いです。コップ本を読む「Scalaスケーラブルプログラミング第3版」という本です(最近第三版になりました)。「コップ本」でググっても出てきます。私はプログラミング言語はだいたい一切本を買わず、公式のリファレンスや言語仕様、ドキュメント類だけをみて勉強するのですが、Scalaの場合は本を買ったほうが良かったかな?となんとなく思います。公式のScalaドキュメントもかなり詳しく書いているので要らないっちゃ要らないような気もしますが...。あと、XMLリテラルとか「使わんだろコレ...」みたいな機能の解説もありますけど。本を読むのがかなり後になりますが、それは私がプログラミングの本をあまり読まない人だからです。本を買って勉強するスタイルのひとは最初に買ってしまったほうが良いと思います。Scalaを読んでScalazなどを使うここまできたらもう普通にScalaは使えてると思います。それでも不足を感じたり、新たな領域にチャレンジしたい場合はもっと関数型プログラミングの深い部分を勉強していくと面白いかもしれません。―Scalazコントリビューターによる関数型徹底ガイド」という名前で日本語版が出ています。関数型プログラミングについては当ブログでもちょっとだけ書いてます。関数型プログラミング「型クラスペディア」という資料も大変参考になります。私はとりあえず\/やValidationを使ったあたりでもうおなか一杯になったので、他の事(機械学習)を勉強してます。Scalaで書かれている事まで理解する必要はぜんぜん無いと思います。覚えていると教養が深まる、みたいなイメージです。以上、ご参考になりましたら幸いです。投稿ナビゲーション【質問#70】職場の不満について【質問#72】人工知能は数学の定理を証明できるのか。anopara作者:withpop昼はサラリーマン。頑張れば何でも出来る。