ホーム  >   ブログ  >   Courseraの"Functional Programming in Scala Specialization"を修了した

2017-10-28

Courseraの"Functional Programming in Scala Specialization"を修了した

ここ1年くらい暇を見つけてちまちまと遊んでいたCourseraの "Functional Programming in Scala Specialization" という一連のプログラムを修了した。

4つのコースから構成されていて、(修了証は出ないけど)課題を含めてすべて無料で受講できた。課題はスケルトンコードとデータが与えられて、指定されたメソッドを実装する、というよくある形式。

  1. Functional Programming Principles in Scala
    • 関数型プログラミングの基礎
    • パターンマッチとか高階関数とかImmutableなデータ構造の話とか
  2. Functional Program Design in Scala
    • 発展的な関数型プログラミングの概念いろいろ
    • モナモナしたり、遅延評価したり
  3. Parallel Programming
    • タスク並列化とデータ並列化
    • .par を付けるとできる、Scala の並列コレクションに対する操作いろいろ
  4. Big Data Analysis with Scala and Spark
    • Sparkを使おう
    • RDD, Dataset, DataFrame それぞれの操作

Functional Programming Principles in Scala では、var(と val )を絶対に使わないという強い意志を持って、再帰を駆使してコードを書く。普段ノリでScalaを書いていると気がついたらJavaになっているが、このコースが最初にあったおかげで、始終冷静にScalaが書けた気がする。ハマりどころは特に無いけど、Scalaじゃなくても良いよね感がすごいので飽きる。

Functional Program Design in Scala は講義が苦痛だが、どの資料をあたってもモナドとは常にそういうものである。諦めよう。課題では StreamScalaCheck が出てくる。遅延評価の話と Stream の導入はわかりやすくて良かった。

そして Parallel Programming。ここからがこのプログラムのメイン。まずは Parallel Programming(並列プログラミング)と Concurrent Programming(並行プログラミング)の違いから講義が始まる。受講当時ちょうど The Art of Concurrency を読んでいたこともあって、この点は以前記事にもまとめた:

call-by-nameで引数を評価することの重要性や、再帰的な処理・コレクション操作の並列化など、これまでの『関数型言語としてのScala』の講義を踏まえて教えてくれたのが印象的で、「あーここでその話が出てくるのかー」という体験が多くて良かった。

課題では k-means を実装したのが特に楽しかった。馴染みのある実用的なアルゴリズムが動くと嬉しくなる。

最後のコース Big Data Analysis with Scala and Spark では、その名の通りSparkを学ぶ。Stack Overflowなどの実データ(?)を対象に課題に取り組めるのも嬉しい。

このコースは『なぜSparkか』というところから話が始まる。わかりやすくて納得感があったので、記事でもまとめた:

そして RDD の解説が始まる。キャッシュの重要性を口酸っぱく言われるので、これについてもブログでまとめておいた:

課題になると、Parallel Programming で実装した k-means を今度はSpark RDDを使って実装する。これがかなりハマって、しばらく放置していたら修了まで随分時間がかかってしまった…。

そんな「RDDを効率的・効果的に扱うのは大変だよね?」という文脈から、Catalystによる最適化の恩恵を受けるべく DataFrame が紹介される。そして最後には RDDDataFrame のハイブリッド的存在として Dataset が登場して完結。

まとめ

『関数型言語としてのScala』から『Sparkによるビックデータ解析』までを学べる、楽しいプログラムだった。おすすめ。

もっと効率よく学べる資料も世の中にたくさんあるんだろうけど、課題がかなりよくできていたので個人的には非常に満足度が高い。並列コレクションやRDDのキャッシュを適切に扱えないとタイムアウトやOOMで不合格になるので、あやふやな理解とノリで書いたコードでは通らない。厳しい。試行錯誤の末 Discussion Forum に助けを求めにいったこともしばしば。

  シェアする

このエントリーをはてなブックマークに追加

  カテゴリ

プログラミング

  あわせて読みたい

2017-10-01
Pythonのconcurrent.futuresを試す
2017-05-14
推薦システムのためのOSSたち
2017-04-09
なぜSparkか

  もっと見る

最終更新日: 2022-01-18

  書いた人: たくち

Takuya Kitazawaたくち)です。長野県出身、カナダ・バンクーバー在住のソフトウェアエンジニア。これまでB2B/B2Cの各領域で、Web技術・データサイエンス・機械学習のプロダクト化および顧客への導入支援・コンサルティング、そして関連分野の啓蒙活動に携わってきました。現在は主に北米(カナダ)、アジア(日本)、アフリカ(マラウイ)の個人および企業を対象にフリーランスとして活動中。詳しい経歴はレジュメ を参照ください。いろいろなまちを走って、時に自然と戯れながら、その時間その場所の「日常」を生きています。ご意見・ご感想およびお仕事のご相談は [email protected] まで。

  近況   一杯のコーヒーを贈る

  免責事項

  • Amazonのアソシエイトとして、当サイトは amazon.co.jp 上の適格販売により収入を得ています。
  • 当サイトおよび関連するメディア上での発言はすべて私個人の見解であり、所属する(あるいは過去に所属した)組織のいかなる見解を代表するものでもありません。
  • 当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、個人ブログという性質上、誤情報や客観性を欠いた意見が入り込んでいることもございます。いかなる場合でも、当サイトおよびリンク先に掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。
  • その他、記事の内容や掲載画像などに問題がございましたら、直接メールでご連絡ください。確認の後、対応させていただきます。