こんにちは
私の名前はGolovach Ivanです。私はScalaに切り替えた10年以上のプログラミング経験(Java EE、J2ME、C、C ++、M言語、Delphi)を持つJavaテクニカルリードプラクティショナーです。
私は、通常のプログラミングコース(
Java Core + Junior Java Developer )と特別なコース(JVMのマルチコアプログラミング(
1つおよび
2つ ))の両方を準備し、読みました。
現時点では、
Scalaの特別コースを開始しています。このトピックでは、最も興味深く有益な資料を共有したいと思います(コースは1年以上準備されました)。
コースプログラム材料:「その他」マテリアル:Scalaでのオブジェクト指向プログラミングマテリアル:Scalaでの関数型プログラミング材料:高級な種類材料:パーサーコンビネーターマテリアル:メタプログラミング/リフレクション材料:メタプログラミング/マクロ材料:スカラズ材料:網材料:アッカ材料:フィナグル材料:ズーキーパー資料:金融業界でのFPの使用コースプログラム
Scala特別コースの目的
1.マクロ、パス依存型、上位のジェネリックなどの「ダークコーナー」を含む言語を詳細に研究する。 内部および外部DSLの作成方法を学びます。 なぜ関数型プログラミング言語が金融業界でこれほど人気があるのかを理解するため。
2.関数型プログラミング言語(特にScala)でコードを記述するときに、代数とカテゴリー理論を参照する数学ライブラリがよく使用される理由を理解します。
3.なぜ最近のスタートアップ(TwitterやLinkedInなど)がScalaでインフラストラクチャを作成するのかをご覧ください。
特別コースは2015年2月27日に始まり、2〜2.5時間の16のウェビナーで構成されます。 期間3か月(週1〜2レッスン)。 すべての講義はビデオに記録され、学生に提供されます。 必要な資料はすべて電子形式で提供されます。 私はウェビナー中とそれ以外の時間の両方で質問に答えます。 Scalaを並行して学習している他の15〜20人の学生とコミュニケーションを取る機会があります。
- モジュール#1(4回の講義):基本的なScala
このモジュールのタスクは、Scalaで「毎日の」タスクを解決する構文と方法を検討することです
- 「その他」
- ローカル型推論、統一型
- 構造型、タプル
- ジェネリック:分散、上限/下限、存在タイプ
- 遅延値、DelayedInit特性、アプリ/アプリケーション
- 暗黙的、ビュー、ビューの境界
- シーケンスの理解
- 注釈、例外
- XMLを操作する
- Scalaのコレクションライブラリ、配列
- オブジェクト指向プログラミング
- クラス、オブジェクト、特性
- 型メンバー、抽象型
- 明示的に型指定された自己参照
- Mixinクラスの構成、複合型、階層線形化
- ケーキ柄
- 関数型プログラミング
- 機能タイプ、匿名関数、ネストされた関数、カリング、部分適用
- メソッド/関数、演算子(プレフィックス、インフィックス、ポストフィックス、結合性)、ゼロビット+非ビット書き込み
- 名前によるコール/値によるコール、名前付きおよびデフォルトのパラメータ
- パターンマッチング、ケースクラス、抽出オブジェクト
- モジュール#2(4回の講義):高度なScala
モジュールのタスクは、JavaにはないScalaの機能を詳細に調べることです。
- 依存型
- 上位の種類
- パーサーコンビネーター
- メタプログラミング=リフレクション+マクロ
- モジュール#3(4回の講義):Scalaのタイプアクロバティックライブラリ
モジュールのタスクは、(タイプと言語機能のシステムを使用するという意味で)最も高度なライブラリ、それらの記述方法、それらで何ができるかを検討することです。
- Scalaz-ちょっとしたカテゴリー理論(モナド、適用ファンクター、カタモフィズムなど)
- Shapeless-型クラスと依存型ベースの汎用プログラミングライブラリ
- Algebird-またはTwitterが代数を使用する方法(モノイド、グループ、ハーフリング、...)
- モジュール#4(4回の講義):マルチスレッド、ネットワーク、および分散プログラミング
モジュールのタスクは、JVMで最も一般的なネットワークライブラリを検討することです。これは、多くの場合、大規模な分散システムの「ビルディングブロック」です。 TwitterがScalaで書かれている理由を理解してください。
材料:「その他」
Scala入門記事
これらの記事は、言語の簡単な概要です(15〜20ページ)。 彼らはイデオロギー的/歴史的である可能性が高い-著者自身(Odersky)が彼の発案を見ているので、彼はそれを最も重要/独特/特徴と考えています。
Scalaスタイルガイド
主要なScalaの記事
これらの記事は、言語の基本的な特徴を明らかにし、明確にします。
- スケーラブルなコンポーネント抽象化 、Odersky + .... 再利用可能なコンポーネントを構築するための3つのプログラミング言語の抽象化を識別します。 抽象型のメンバー 、 明示的なセルフ タイプ 、およびモジュラーミックスイン構成です。 これらの抽象化により、静的プログラムパーツの任意のアセンブリとそれらの間のハードリファレンスを再利用可能なコンポーネントのシステムに変換することができます。
- 「オブジェクトおよび暗黙的としての型クラス」 、Odersky + ...、 型クラスは、もともとアドホックなポリモーフィズムに対する規律のある代替手段としてHaskellで開発されました。 型クラスは、ソフトウェアエンジニアリングやプログラムの遡及的拡張などのプログラミング言語における重要な課題に対する型安全なソリューションを提供することが示されています。 また、 概念ベースの汎用プログラミングの優れたメカニズムとして認識されており、最近では型レベルの計算のメカニズムに進化しています 。 このホワイトペーパーでは、 CONCEPTパターンと暗黙的 (型指定の暗黙的なパラメーター受け渡しメカニズム)を使用したジェネリックを使用した、オブジェクト指向(OO)言語の型クラスへの軽量なアプローチを示します。
- 「パターンとオブジェクトのマッチング」 、Odersky + ...、 Caseクラス / Extractorとの栄光のパターンマッチング +より古典的なソリューションとの比較( Visitor 、 Type-Test / Type-Cast 、...)
Scalaコース/コレクション
小さな本の資料に到達するが、本には到達しない。 「クラシック」から。
はい、
Courser自体はScalaで書かれています。
本
Scalaには多数の書籍(約20冊)が市場に出回っていますが、私は次の4冊が一番好き
マテリアル:Scalaでのオブジェクト指向プログラミング
マテリアル:Scalaでの関数型プログラミング
Scalaの関数型プログラミングは、Scalazの貢献者の1人による強力な本です。
材料:高級な種類
材料:パーサーコンビネーター
Scalaには、EBNFに近い形式でScala外部DSL文法を記述するためのツールを提供するパッケージ(
scala.util.parsing )が含まれています。 つまり 「外部DSL」を作成するための「内部DSL」です。
Scalaでは、パーサーはモナドとして実装されます。したがって、パーサーのコンビネーターの定義は、シーケンス、交替、またはその他の合成操作を実装するモナド変換にすぎません。
多くのサブジェクト領域で、いくつかのプリミティブ要素(この場合はパーサー)の形式でAPIを構築し、これらの要素を特定の方法で結合する方法(コンビネーター)を作成できます。 この場合、言語のコアには、外部DSLを構築するために必要なものがすべて含まれています。
マテリアル:メタプログラミング/リフレクション
マクロの特に興味深い点は、パッケージscala.reflect.apiで提供されるScalaのランタイムリフレクションにも使用される同じAPIに基づいていることです。 これにより、ランタイムリフレクションを利用するマクロと実装間で汎用コードを共有できます。
2.10まで、Scalaには独自のリフレクション機能がありませんでした。 代わりに、JavaリフレクションAPIの一部、つまり、クラスとオブジェクトを動的に検査し、そのメンバーにアクセスする機能を提供するものを使用できます。 ただし、スタンドアロンのJavaリフレクションではScala固有の要素の多くは回復できません。Javaリフレクションは、Java要素(関数、特性なし)および型(存在、高種類、パス依存、および抽象型なし)のみを公開します。 さらに、Javaリフレクションは、コンパイル時に汎用であるJava型のランタイム型情報を回復することもできません。 Scalaのジェネリック型のランタイムリフレクションに引き継がれる制限。
Scala 2.10では、新しいリフレクションライブラリが導入され、Scala固有およびジェネリック型に関するJavaのランタイムリフレクションの欠点に対処するだけでなく、Scalaに汎用リフレクション機能のより強力なツールキットも追加されました。 Scalaタイプとジェネリックの場合...
材料:メタプログラミング/マクロ
マクロの特に興味深い点は、パッケージscala.reflect.apiで提供されるScalaのランタイムリフレクションにも使用される同じAPIに基づいていることです。 これにより、ランタイムリフレクションを利用するマクロと実装間で汎用コードを共有できます。
マクロのフレーバーは、タイプセーフと豊富な構文を組み込むように適合されたLispマクロを連想させます。 悪名高いC / C ++プリプロセッサマクロとは異なり、Scalaマクロ:1)本格的なScalaで記述されている、2)生の文字列ではなく式ツリーで動作する、3)Scalaの構文を変更できない [
ここ ]
マクロは、コンパイル中にコンパイラーによって呼び出される関数です。 これらの関数内で、プログラマはコンパイラAPIにアクセスできます。 たとえば、コードを生成、分析、およびタイプチェックすることができます。 マクロの詳細については、ドキュメントをご覧ください。 [
ここ ]
Defマクロは、バージョン
2.10.0以降、Scalaの
実験的な機能として出荷されてい
ます 。 完全な仕様が保留されているdefマクロのサブセットは、Scalaの将来のバージョンの1つで安定するように暫定的にスケジュールされています。
実験的な機能 -また、マクロは実験的で高度な機能と見なされるため、マクロを記述するためにはマクロを有効にする必要があります。 ファイルごとにscala.language.experimental.macrosをインポートするか、コンパイルごとに-language:experimental.macros(コンパイラスイッチを提供)でインポートします。 ただし、ユーザーは何も有効にする必要はありません。マクロは通常のメソッドのように見え、コンパイラの切り替えや追加の構成なしで通常のメソッドとして使用できます。
材料:スカラズ
材料:網
Netty-メンテナンス可能な高性能プロトコルサーバーおよびクライアントを迅速に開発するための、非同期でイベント駆動型のネットワークアプリケーションフレームワーク。 Nettyはjava.netを使用するためのデファクトスタンダードです*、NIOおよびNIO.2(AkkaとFinagleはNettyを使用し、ZookeeperはNIO / NIO.2の「内部」で直接使用されます)。
Reactor /
Proactor /
Asynchronous Completion Token /
Acceptor-Connector非同期メッセージ処理テンプレートを直接実装することはできますが、これには多くのテンプレートコードが含まれ、サブジェクト領域の機能がわかりにくくなります。 Nettyの利点は、宣言型コードと、ライブラリがプロトコルコンストラクター(http、ftp、smtp、websockets、...)であるという事実の両方です。
材料:アッカ
Akkaは、JVMのマルチスレッドおよび分散アクタベースアーキテクチャの事実上の標準フレームワークです。
Scalaバージョン2.10.0から、Akkaはアクターのネイティブ実装に取って代わりました 。
材料:フィナグル
Finagle-高並行性サーバーの構築に使用される、JVM用のプロトコルに依存しない拡張可能なRPCシステム。 twitter.comで作成および使用。 基本原則は
「ローカルでプログラミングし、グローバルに通信する必要がある」です。
Twitterスタックの一部(ダチョウ、Zipkin、Mesos、Iago、ZooKeeper、Scaldingとともに)。 Finagleには、負荷分散、接続プーリング、タイムアウト付きの呼び出し、監視、統計収集が含まれます。
材料:ズーキーパー
Zookeeperは、構成情報、ネーミング、分散同期、および
Twitterスタックの一部である他のグループサービスを管理するためのフェイルセーフの集中型サービスです。 キュー、ロック、バリアなどの基本的なデータ構造(クラスター)を作成するために使用できます。 2フェーズコミット、リーダー選出などの分散アルゴリズムに適しています。
資料:金融業界でのFPの使用
多くの理由(コンビネーターの言語で主題分野を記述する能力)のために、彼らは金融業界で関数型プログラミング言語を使用することを好み、それはニューヨークとロンドンで「関数型」の需要を生み出します。
- 契約の作成:金融工学の冒険 、Simon Peyton Jones + ...は、Haskellでの金融契約の導入に関するHaskellの基本的な記事です。 「このようなコントラクトを正確に記述することができるコンビネーターライブラリと、そのようなコントラクトの価値を示す構成的表示のセマンティクスを紹介します。 Haskellのコンビネーターライブラリの実装をスケッチします。 興味深いことに、遅延評価は重要な役割を果たしています。」 「金融業界には、金融契約の典型的な組み合わせ(スワップ、先物、キャップ、オール、スワップション、スプレッド、ストラドル、キャプション、ヨーロッパのオプション、アメリカのオプションなど)の専門用語の膨大な語彙があります。」 「当社のコンビネータを使用して契約を説明できますが、契約を処理することもできます。 特に、契約の価値を見つけたいと考えています。 セクション4では、コンビネータに抽象的な評価セマンティクスを与える方法について説明します。 このセマンティクスの基本的に重要な特性は、構成的であるということです。 つまり、複合コントラクトの値は、そのサブコントラクトの値を組み合わせることによって与えられます。
- 「商業用途:エキゾチックな取引で機能する」 -バークレイズで金融商品を扱うために使用されるDSLの説明(Haskell)。 「Functional Payout Framework(fpf)は、組み込みのドメイン固有の機能言語を使用して、エキゾチックな金融派生商品を表現および処理するHaskellアプリケーションです。 エキゾチックなデリバティブの価格設定のためのスクリプト言語は銀行では一般的ですが、fpfは複数の解釈を使用してそのような取引の価格を設定するだけでなく、ライフサイクルサポートなどを提供するスクリプトを分析します»
- 「EDF Tradingのスカラ。 Scalaでのデリバティブ価格設定のためのドメイン固有言語の実装。」 -「DIESELは、モンテカルロの価格設定と分析を容易にするためにエネルギーデリバティブを表すための言語です。 DSLは、コンビネーターパーサーライブラリと代数データ型とケースクラスで構成されています。
- 「商業契約の構成仕様」
- 「金融商品を記述するための言語の代数的仕様」 -「銀行環境で適用される言語の開発中に、正式な方法とサポートツールを使用することについて報告します。 RISLAと呼ばれるこの言語は、銀行が提供する利息商品の性質を定義するために使用されます。 RISLA記述は、製品から生じるキャッシュフロー(特定の日付で出入りする金額)を修正します。 「この言語は代数的仕様を使用して開発されており、その役割について説明します。」
- 「ドメイン固有の言語とオブジェクト指向フレームワーク:金融工学のケーススタディ」 -「ドメイン固有の言語を使用すると、そのドメインで読みやすく保守可能なアプリケーションを簡単に開発できます。 あるいは、オブジェクト指向フレームワークを設定することで同じ目的を達成できます。 金融工学の分野では、オブジェクト指向フレームワークとドメイン固有の言語の両方が独立して開発されています。 この機会を利用して、これら2つを比較し、違いを強調し、相互利益の機会について話し合います。」
- 「金融工学とソフトウェア工学の冒険」
- 「金融分野固有の言語リスト -豊富な種類の金融API / DSL
PSご質問にお答えします
スカイプ:GolovachCourses
メール:GolovachCourses@gmail.com