Blog
Principles of Reactive Programmingコースに参加している話 Week.1
紹介
こんにちは!15年新卒のフィです。
最近RubyistがScalaを勉強する話のシリーズを書きました。まだ読んでいない方は是非読んでいただけると嬉しいです!
RubyistがScalaを勉強してみた(ActiveRecordパターンの実装)
RubyistがScalaを勉強した話(続き)Duck Typing
RubyistがScalaを勉強した話 (演算子オーバーロード)
現在、ScalaとReactiveのコンセプトを深く理解するために、Courseraの有名なコースで勉強しています。今回のシリーズでは、参加しているコースの内容、勉強したことについて紹介していこうかと思います。
コースの紹介
courseraのことをご存知でしょうか。
スタンフォード大学コンピュータサイエンス教授Andrew NgとDaphne Kollerによって創立された教育技術の営利団体である。世界中の多くの大学と協力し、それらの大学のコースのいくつかを無償でオンライン上に提供している。
コースの名前は「Principles of Reactive Programming」(リアクティブプログラミングの基礎)で、無料です!
講師も素晴らしい方々が揃っています。
-
Martin Odesky: Scalaの生みの親
-
Erik Meijer: 関数型言語の有名な研究者
-
Roland Kuhn: Typesafeのakkaチームリーダ
この3人の名前を聞くだけでワクワクしますね!
このコースの目的は、Reactiveのソフトウェアを概念的に把握して、高負荷に耐えられるソフトウェアを作れるコツを学ぶことです。
コースは全て英語で、7週連続で講義があります。毎週5-7時間の学習時間が必要です。
Week.1 の紹介
Week.1の内容ですが、主に以下のことが勉強になりました:
-
基礎知識(Functionとパターンマッチング、コレクション)を振り返る
-
関数型言語での乱数生成についての紹介、そしてscalacheckの紹介
-
Monadsの話
1.は基礎ですので、2.と3.を紹介します。
関数型言語での乱数生成 (Function Random Generators)
汎用的な乱数生成の方法を学びました。
まず、なぜ汎用的な乱数生成方法が必要かと言うと、ドメイン別に汎用的な生成手法ができれば、ランダムなテストセットを生成することができ、そこでテストカバレッジを上げることで、予期しないバグを防ぐことができます。
どうやって実現するかと言うと、Tのタイプのジェネレーターは、以下のtraitのような汎用的なインターフェースが用いられます:
1 2 3 |
trait Generator[+T] { def generate: T } |
そのインターフェースを用いて、Integerのジェネレーターはどう作るでしょう:
1 2 3 4 |
val integers = new Generator[Int] { val rand = new java.util.Random def generate = rand.nextInt() } |
また、integersの乱数ジェネレーターを用いて、booleanの乱数ジェネレーターも作れるでしょう:
1 2 3 |
val booleans = new Generator[Boolean] { def generate = integers.generate > 0 } |
integersの乱数ジェネレーターを用いて、整数のペアの乱数も生成できます:
1 2 3 |
val pairs = new Generator[(Int, Int)] { def generate = (integers.generate, integers.generate) } |
また、flatMapとMapをうまく使うことで、より複雑なデータ構造(List, Tree, Heapなど)も簡単に生成することができます。それらが全て揃っているScalacheckというライブラリが存在します。コースの中でもScalacheckが紹介されていて、また乱数生成方法についてのもっと深い話も学べますので、興味がある方は是非コースに参加してください!
Monadの紹介
Monadは結構難しい話ですが、第一回で学ぶということから、このコースのハードルの高さに驚きます。
なお、Martin Odesky氏の説明がとても実用的で、分かりやすかったです。
簡単にまとめると、Monadsは「いくつかの代数ルールを持つデータ構造」です。ルールは
– flatMapとUnitの実装を持つ
そのflatMapとUnitの実装を用いて、以下の三つのルールに従わないと行けません:
1 2 3 4 5 6 |
//Associativity m flatMap f flatMap g == m flatMap (x => f(x) flatMap g) //Left unit unit(x) flatMap f == f(x) //Right unit m flatMap unit == m |
実際によく使われているMonadsは Set, Option。そして上で紹介したGeneratorもMonadの一種です!コースの中で紹介されたGeneratorのソースコードを見れば、GeneratorがMonadであることを分かると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
trait Generator[+T] { self => def generate: T def single[T](x: T): Generator[T] = new Generator[T] { def generate = x } //unit def map[S](f: T => S): Generator[S] = new Generator[S] { //map def generate = f(self.generate) } def flatMap[S](f: T => Generator[S]): Generator[S] = new Generator[S] { //flatMap def generate = f(self.generate).generate } } |
Monadがなんで必要なのかと疑問を持っている方もいるかもしれませんね。
Monadはややこしい処理を簡単に組み立てるようにするものです。Monadをうまく活用することにより、処理のフローなどがキレイに書けるし、処理も組み立ても簡単にできます。
宿題
今回紹介しているコースは普通に大学で教えられているコースでもありますので、もちろん宿題もあります!宿題は教師が準備したsbtプロジェクトがあり、それをダウンロードして、直接編集しながら宿題を解きます。解いた宿題をsbtのコマンドラインでサブミットすることができ、そしてサブミットしたものが自動的に採点されます。コースの後でいい点数が取れればなんとMarktin Odesky氏のサインする電子版Certificateがもらえます!(最高)
第一回の宿題ですが、Scalacheckを使ってBinominal Heap(二項ヒープ)の実装ミスを見つける、という宿題でした。内容は難しそうですが、ちゃんと理解したら全然難しくなかったです。コード20行ぐらいで解ける宿題でした。是非挑戦してみてください~
まとめ
まだWeek.2のところで、まだまだ先が長いのですが、個人の感想はこのコースを参加してとても良かったなと思っています。内容も非常に深いし、講師も世界のトップレベルのエンジニアなので、誰でも学べる点が多くあります。また、宿題もあったりして、授業の中にときどき簡単な質問があったりして、より深く理解できたかなと思います。
Author