僕はこれまでまともに学習したプログラミング言語がPerlとJavaScriptしかなくて、静的言語的パラダイムや関数型パラダイムは概念は知っているものの、それがどう役に立つのか、逆にどういう面で課題がありどのように対処されているのか、などといったことを知らなかった。知らなくてもまあ仕事はPerlとJSでやっているので問題ない。しかしすでにこれらの言語から得られる概念的な知識の吸収の速度が鈍化してきていて、このままではエンジニアとしてまずいのではないかという危惧感があった。
そこで静的言語であり、関数型言語であり、また社内でも使われ始めているためサンプルコードがあるScalaの学習をすることにした。
学習するにあたって困ったことは、どういうドキュメントを読み、どのように実践するとScalaの概観をつかめるか分からないということだった。そこで今回は自分の経験を踏まえて、このように入門していくと良いのではということをまとめてみる。
Scalaスケーラブルプログラミング第2版
入門書としてよく言われているのが「Scalaスケーラブルプログラミング第2版」。ただし以下の点でこの本を入門書として使うべきではないのではないかと思う。
- 本の分量が多く、また言語の内部に少し入り込みすぎていて、ひとまずScalaを書くための概観を掴むには読むのに時間が掛かる
- コード例を読み解くのが少しむずかしい
- Scalaを使う時によく使うOptionやEitherなどの話があまりない
もちろん入門した後にもう少し詳しく知りたい時や、リファレンス的に使いたい時には良い本である。しかし個人的には最初に読むには大変だったのでおすすめしない。
Scalaを入門するためのドキュメント
僕の場合はざっとScalaの書き方を学ぶためにスケーラブルで関数型でオブジェクト指向なScala入門 を読んだ。これは2012年と少し古い連載なのだが、Scalaの文法をざっくり学ぶには参考になる。流し読みしておけば基本構文は大体頭に入るので、とりあえず書けるようになる。
また、sbtのドキュメント( http://www.scala-sbt.org/0.13/tutorial/ja/index.html )を読んだ。これを読むと、
- Scalaプロジェクトのファイル配置
- ビルド方法
- ライブラリ依存管理
などを学ぶことができる。
実践しながら学ぶ
勉強するときは実践しながら、それに関係する資料を読み漁っていくというのが自分の学習スタイルだったので、入門の資料を読んだ後は適切な大きさの問題をやってみた。入門する時に適切な大きさの問題を見つけるのが難しいと思うのだけど、はてなから出しているインターンの事前課題がけっこういい感じの大きさなのでこれをやった。
https://github.com/hatena/Hatena-Intern-Exercise2015
この課題は
- 基本的な文法
- objectとclassの使い方
- パターンマッチのやり方
- エラー処理の方法(OptionやEitherの取り扱い)
- case class
- 関数型の概念とそのように書くための手法
- テストの簡単な書き方
などをある程度理解しないと解けないので、この辺の概念を理解しながら手を動かしてみると良い。
エラー処理の方法以外は、@ITの連載で大体学べている。他にもはてな教科書の「Scalaによるプログラミングの基礎」を読んでおくと参考になる。
Hatena-Textbook/foundation-of-programming-scala.md at master · hatena/Hatena-Textbook · GitHub
しかし上の概念の中でエラー処理をOptionやEitherで行う部分に関しては重要な割にどこを見ればよいかわかりづらかった。この概念を学ぶために、以下の資料を参考にした。
まずOptionについては
- http://www.atmarkit.co.jp/ait/articles/1204/20/news139_3.html
- https://github.com/hatena/Hatena-Textbook/blob/master/foundation-of-programming-scala.md#scala-紹介-その4
- ScalaのOptionステキさについてアツく語ってみる - ( ꒪⌓꒪) ゆるよろ日記
辺りを読むと分かる。
Eitherに関しては
- Scalaでの例外処理 - Either,Option,util.control.Exception - ( ꒪⌓꒪) ゆるよろ日記
- ScalaでWebアプリケーションのエラー処理を綺麗に書く - はこべにっき ♨
- ScalaのOptionとEitherで例外処理を行う方法 - $shibayu36->blog;
辺りが参考になる。一つは自分のブログだけど、Scalaでの例外処理がよくわからなかったので勉強程度にまとめた。
その後
ここまでくればScalaの使い方はなんとなく分かっているはずなので、あとはいろいろと作りながら都度調べていけば良い。もし自分で作りたいものがあるのであれば、それを作りながら勉強していけばいずれ書けるようになりそう。あんまりないのであれば、はてな教科書のScala によるデータベースプログラミング、ScalaによるWebアプリケーション開発 の課題とかをやるのがおすすめ。
まとめ
今回は自分がScalaを入門した時に辿った道のりについてまとめてみた。「Scalaスケーラブルプログラミング第2版」を最初に読んでしんどかったとか、OptionやEitherがよく分からなくていろんな資料を読み漁ったけどよくわからなかったとか、そういう失敗をいろいろしたので、道のりが参考になると嬉しい。
参考資料
- スケーラブルで関数型でオブジェクト指向なScala入門
- http://www.scala-sbt.org/0.13/tutorial/ja/index.html
- https://github.com/hatena/Hatena-Intern-Exercise2015
- Hatena-Textbook/foundation-of-programming-scala.md at master · hatena/Hatena-Textbook · GitHub
- http://www.atmarkit.co.jp/ait/articles/1204/20/news139_3.html
- https://github.com/hatena/Hatena-Textbook/blob/master/foundation-of-programming-scala.md#scala-紹介-その4
- ScalaのOptionステキさについてアツく語ってみる - ( ꒪⌓꒪) ゆるよろ日記
- Scalaでの例外処理 - Either,Option,util.control.Exception - ( ꒪⌓꒪) ゆるよろ日記
- ScalaでWebアプリケーションのエラー処理を綺麗に書く - はこべにっき ♨
- ScalaのOptionとEitherで例外処理を行う方法 - $shibayu36->blog;
- Scala によるデータベースプログラミング
- ScalaによるWebアプリケーション開発