新卒が2ヶ月弱Scalaを用いたWebアプリケーションを開発していて気付いた事など

More than 1 year has passed since last update.

こんにちは。@momotas210 です。

Scala Advent Calendar という事でネタを考えたのですが、当初考えていたplay-slickを使ったCRUD処理は割とググったらすでに存在していて、
かといって何かアプリケーションを作って「作りました」的な記事にしようにも仕事でガッツリScalaを書いていて時間の関係上できそうになかったので、身の上話を踏まえつつ2ヶ月弱ほどプロダクトの開発にフルコミットをしていて躓いたことや勉強した事や情報収集源などを紹介したいと思います。(特に情報収集源では何か良いのがあったら教えてくださいm(__)m)

前提として自分はプログラミング歴は9ヶ月程で、新卒で入社して7ヶ月はPHPを使って既存のシステムの改修や追加開発などを行っていました。
そして11月からScalaを使って新規プロダクトの開発をしています。
Javaは触った事ありません。
他にはPythonはStreamingAPIを使ってデータ収集し、時系列解析をちょこっとした程度です。

最初の勉強

これは性格に依存するかもしれないですが、自分は文法の勉強よりもまずは何でもいいから 動くアプリケーションを作りたいというタイプです。なのでサンプルを漁りまくったのですが、その中で 動くアプリケーション がちゃんと作れるなと感じたのは以下のリポジトリです。
https://github.com/bizreach/play2-hands-on

ここで最初に

  • Scala2.11.7
  • Slick3.0
  • Play2.4

の(雰囲気を)学びました。

開発環境

PHPの時はAtomを使っていたのですが、Scalaで開発を始めると共にIntelliJに切り替えました。もともとIDEは学習コストが高く、軽量エディタのほうがシンプルで良いだろうと思っていたのですが、全然そんな事はありません(断言)。今ではIntelliJがないと開発効率は落ちます。
役に立つのはマウスオーバーで型を教えてくれる機能と、補完機能だと思います。
詳しくは以下のリンクにも書きました。
http://qiita.com/momotas210/items/d389f5cc68f7077407d4

強烈な型縛り

当時使っていたPHP5系では型の指定が出来なかった事もあり、あまり型を意識する事なく実装していたのですがScalaで開発を始めてからはtype mismatch でよく怒られます。

def findById(id: CustomerId) = {
    val query = for {
      (customer, store, item) <-customers.soft.filter(_.id === id) join
       stores.soft on (_.id === _.customerId) join
       items.soft on (_._2.storeId === _.id)
    } yield (customer, store, item)
    db.run(query.result.headOption) map {
        case Some(result) => Some(result._1.copy(customerId =result._3.id))
        case _ => None
    }
  }

例えばこのslick(正確にはplay-slick)ですが、CustomerId という型を与えてApplicative joinsをした後に db.run.headOption をする事によって Option で取得するなど、どの部分でデータがどんな型になっているのかを逐一把握しないと(まあ最悪はインプットとアウトプットがどんな型かを把握しないと)methodを作れないし、method をつなげる事ができません。

エラー文があまり親切じゃない

基本的にエラー文があまり親切じゃない&同じエラーでも原因は同じとはかぎらない現象が多いので、とにかくエラーはメモして解決したら対応策も残しておくようにしてます。
こんなのとか

http://qiita.com/momotas210/items/742069dce168bf56535f

とはいえ、最近は見せれない型なども出てきているので基本的に社内ドキュメントにまとめていますが、とにかくメモを取る事はおすすめできます。後学にもなるし。

おすすめ本

僕はこの2冊をデスクに置いてわからない時はまずこの本を見てました。
Scala逆引きレシピ
Scalaスケーラブルプログラミング第2版

役に立つ資料

これは時間をとってじっくり読んでおいたほうがいいと思った資料です

ゆるよろ日記(Scalaのカテゴリー)
http://yuroyoro.hatenablog.com/archive/category/scala
Scala関係でググると上位表示されている方のブログ

Scalaドキュメンテーション(日本語)
http://docs.scala-lang.org/ja/overviews/
公式サイトが一番良いと思う

Hatena-Textbook
https://github.com/hatena/Hatena-Textbook
これは冬休みの課題にしたい

ウォッチしておきたいところ

githubのScala trend
https://github.com/trending?l=scala
scalaを使って開発されたリポジトリが分かる

Scalajp-public(gitter)
https://gitter.im/scalajp/public
ここは常に見ておいたほうがよさそう

Scala(Qiita)
http://qiita.com/tags/Scala

余談ですが、特に成長しているサービスは情報が多いので1からググるよりもサービス内検索のほうが有力な情報にたどり着ける事もあるのでおすすめです。

最後に

Scalaは興味本位で気軽にやれる言語じゃないと思います。やるならガチで長期的にやらないと意味がないです、、