読者です 読者をやめる 読者になる 読者になる
おもに Groovy やアジャイル開発について勉強していることを書き散らしてます。
わたしのひとりごとが、だれかのお役に立てればと…

Scala はじめました #scala_kansai_beginners

 
12/22 に「Scala 関西ビギナーズ 第1回」に参加してきました。
スタッフのみなさん、よい機会を提供いただきありがとうございました。

Scala関西ビギナーズ 第1回 : ATND


参加するまで

参加に至った動機はこんな感じです。

Scala を一度触ってみたかった
関数型言語を勉強してみたかった
・3連休だし1日くらい家を留守にしても大丈夫かな

Groovy を使えるようになってきたので、Scala にも手を出してみたいってところです。
関数型言語とはどういうものか、Scala の特徴はどんなところか…を自分の中で整理できれば参加目的は達成というイメージでした。

Scala は当日の朝、インストールしました。
事前予習なしで参加でしたが、ついていくことはできました。

セッション&演習

@aa7th さん、@mumoshu さんのセッションはお二方とも、Java から Scala へのステップアップを意識されており、
Before/After で Scala の特徴を比較して理解することができました。

セッションのあとは各自演習。@daiksy さんから演習課題が提示されました。
Project Euler」というサイトに、プログラミングで解く数学的な問題がまとめられているということで自分のペースで Scala で解いてみましょうという流れです。

Project Euler


Project Euler - PukiWiki


問題がたくさんあって、アルゴリズムなどを勉強する題材としてはおもしろいなあと感心しました。
私は数学が好きではないので一歩退く感じですが、理系肌な人にはピッタリですね。

ここでいきなりの自習タイムに突入ということで、ちょっと戸惑いました。
数学の問題は目の前にあるけれど、Scala をどうやってステップアップして勉強していいかの指針がなかったので。

とりあえず、Scala っぽさは無視して(つまりほとんど Java で)解いてみて、あとで Scala っぽくリファクタリングする作戦をとりました。

結局、1時間半くらいで解いた問題は2問だけ。数をこなすことはあきらめました。
Scala っぽく書くことに集中しました。

Scala っぽくかく


2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である.
では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか.

いちばん時間をかけた Project Euler の問題です。Problem 5 です。

前述のとおり、問題を解くことはあきらめているので
「2520 は 1 から 10 の数字の全ての整数で割り切れる数字である」をプログラミングで証明してみました。

最初に作ったコードはこんな感じです。とりあえず。

def check(x:Int):Boolean = {
    x % 2 == 0 &&
    x % 3 == 0 &&
    x % 4 == 0 &&
    x % 5 == 0 &&
    x % 6 == 0 &&
    x % 7 == 0 &&
    x % 8 == 0 &&
    x % 9 == 0 &&
    x % 10 == 0
}

for (i <- 1 until 10000) {
    if (check(i)) {
        println(i)
    }
}

Scala は break 文がないので、while の無限ループでひとつ目見つけたら break 戦法が使えないということで有限のループ。
(最近のバージョンでは break っぽいことはできるらしいですが、煩雑なのでやめました)

次に関数型言語っぽく、イミュータブルを目指しました。変数を極力使わない。
質問したり調べたりした努力の結果、だいぶスッキリしました。

for (i <- 1 until 10000) {
    if ((1 to 10).forall(i % _ == 0)) {
        println(i)
    }
}

forall() は引数の条件にすべて合致するかを返します。これ便利ですね。
ですが、今のままでは最小の結果だけでなく、複数の値が println で出力されます。
どうやら、最初のひとつだけを取ってくるメソッドがあるというヘルプをいただきましたので…

println((1 until 10000).find(x => (1 to 10).forall(x % _ == 0)))

find() を使ってみました。1行で書けてスッキリ。

なぞの呪文のようですが、一度わかってみると下手に大量コーディングするより明瞭です。
バグが混入する余地もだいぶ少なそうです。

トレーニングは大切だという気づき

Scala をやりながら、実は Groovy のことを考えていました。
Scala っぽい API は Groovy にも存在します。リスト操作の GDK など、類似のものが多い気がします。

とはいえ、まだまだ GDK を使いこなせていないのが現状で、Groovy のコードをもっと減らすことができるという感触を得ました。

今回は Scala でいかにコード量を減らすか、Scala っぽい文法で書けるかというのを意識しました。
Groovy でも同じことが言えるはずです。もっと Groovy っぽく書ける余地はあります。

実際に仕事でコーディングしていると、そういったトレーニングする余力はなかなか見つかりません。
ショートカットキーを覚えるといったトレーニングも同様です。

今回の大きな気づきはそういったトレーニングする機会を定期的にもつべきだということです。
「ものをつくる」をいったん離れて、「いかにつくるか」を突き詰める。そういう機会は必要ですね。

Scala との今後

ScalaJava と文法がよく似ていますし、Groovy をやっていたのが大きなアドバンテージで、障害なく触り始めることができました。

Scala を主たる言語として使っていくことはないと思います。
ただし、関数型言語を勉強するといったコンテキストでは Scala は自分にとって触れやすい存在です。
Groovy の勉強が一段落したら Scala かなという位置づけです。