SlideShare ist ein Scribd-Unternehmen logo
1 von 5
Scala 開発事例
    2013/3/2
    株式会社システムアート
    益子健一
    System Art, Inc.
    Kenichi Masuko

    kenichi-scala-conference-2013@sysart.jp
クラウド就業システム
                                 Time Recording Cloud System
•   2010 年に開発開始。初期投資が一巡し、数ヶ月前から営業が行われている。
    The project started in 2010. The initial investment has completed, and the system is being introduced to the customers now.

•   クラウドと名前が付いているが個社別のカスタマイズが多い。
    Even though the word “cloud” suggests that the system provides a uniform service to all the customer organizations, in
    reality there are heavily customized business logics and web pages for each organization.

•   カスタマイズは個社別にパラメーターを制御するパッケージ方式では対応しきれないため、個社別にロジックを
    記述するコストを最小限にする方式。ここで Scala DSL が生きる。
    Because there are so many ways to handle timesheets, the customizations are implemented by custom code for each
    organization rather than parameter settings. However, the cost of implementing them must be minimal, hence Scala DSL.

•   難しいと言われる病院・大学を含む 10 社へ導入済み。社食で何を食べるかを勤務予定で登録して集計し給与シス
    テムへ連携するなど、予期外のカスタマイズも結構ある。また 100 年以上歴史がある法人だと、あちこち
    が・・・変わってる。
    The system has been deployed to 10 organizations, including university and hospital, which are said to have complex
    requirements. An example of customization: employees submit what they eat for lunch (provided by organization), as a
    part of attendance plan.

•   現在のコードは10万行。 Java で同じ機能を再現したら 3 倍以上にはなるはず。
    The system has 100,000 lines of code. If we write the same system in Java, we feel it would require more than 300,000
    lines.

•   現在までのプロジェクト規模は開発だけで約 90 人月。
    The development has consumed roughly 90 man-month so far.

•   Scala 2.8 から 2.9 へのバージョンアップは簡単だったが 2.9 から 2.10 は尐し手間がかかった。 Java に比べると後
    方互換性が低く、長期プロジェクトでは不安が残る。
    The migration from Scala 2.8 to 2.9 was trivial, but 2.9 to 2.10 needed some work. Backward compatibilities are weaker
    than Java and it might be difficult to explain the migration cost when Java doesn’t have the cost.
クラウド就業システム ロジックの実装例
       Sorry, no English. Our DSL is in Japanese since our customers don’t get along well with English.
  一番シンプルな就業の日次集計ロジックの実例:
日次集計
  計算ク ス
     ラ      ベース       項目                                                      計算式
 労働基準法           法定労働時間      8時間
                 深夜          2 時 ~ 翌日5
                              2       時
 非管理職      労働基準法 所定勤務        (勤務日+勤務形態の所定勤務開始)~(勤務日+勤務形態の所定勤務終了)
                 在社          実績の開始~実績の終了
                 欠務          育児欠務の合計-休憩欠務の合計
                 休憩控除無し実勤務   在社-欠務
                 休憩控除        勤務区分が出勤または休日出勤、   かつ休憩無し でない、かつ休憩控除無し   実勤務が5 時間を 超えたら (
                                                                                    、 休憩控除無し実勤務 ∩ 所定勤務)の頭から 時間
                                                                                                            1
                 実勤務         休憩控除無し  実勤務-休憩控除
                 所定内残業       日付区分が所定勤務日なら (、 実勤務時間 ∩ 所定勤務) -勤務形態の所定勤務時間、    ただし を
                                                                                0 下回ら ない
                 所定内勤務       日付区分が所定勤務日なら (、 実勤務時間 ∩ 所定勤務) -所定内残業
                 所定内休憩       日付区分が所定勤務日なら 休憩欠務の合計 ∩ 所定勤務
                                           、
                             日付区分が所定勤務日なら 休憩欠務-所定勤務-深夜
                                           、
               所定外休憩
                             勤務区分が休日出勤なら 休憩欠務の合計-深夜
                                          、
               深夜休憩時間        休憩欠務の合計 ∩ 深夜
                             日付区分が所定勤務日、  かつ勤務区分が出勤、  かつ実績の開始と 実績の終了があるなら 実勤務の頭から 時間-勤務形態の所定勤務時間、
                                                                             、          8                ただし を
                                                                                                             0 下回ら ない
               法定内残業
                             日付区分が所定勤務日、  かつ実績の開始と  実績の終了があるなら 実勤務の頭から 時間-所定勤務
                                                               、          8
                             勤務区分が出勤または年休午前または積立休暇午前または振替指定休暇午前または看護休暇午前なら 実勤務-深夜-法定労働時間、
                                                                                      、                ただし を
                                                                                                          0 下回ら ない
               B 残業(法定外残業)
                             勤務区分が休日出勤なら 実勤務-深夜-勤務形態の所定勤務時間、
                                          、                        ただし を
                                                                      0 下回ら ない
               C 残業(深夜残業)    実勤務 ∩ 深夜
               D 残業(振替指定差分) 勤務区分が休日出勤なら 実勤務と
                                          、     勤務形態の所定勤務時間の小さ   い方
                             勤務区分が年休1日またはフ シュ プ
                                            レッ アッ 休暇または夏期休暇またはアニバーサリ     ー休暇または年末年始休暇または年次有給ボラ     ンティアまたはボラ ンティア休暇または出産休暇または公務
               有給取得時間        休暇または転任休暇または罹災休暇または交通途絶休暇または忌引休暇または結婚休暇または出産付添休暇看護休暇または臨時休暇積立休暇なら 勤務形態の所定勤務時間    、
                             勤務区分が年休午前または看護休暇午前または積立休暇午前または年休午後または看護休暇午後または積立休暇午後なら 勤務形態の所定勤務時間 - (在社 ∩ 所定勤務)
                                                                                                、
                             勤務区分が休日出勤、  かつ実勤務が3 時間以下なら 1
                                                        、 /2
               振替指定休暇取得日数
                             勤務区分が休日出勤、  かつ実勤務が3 時間を 超えたら 1
                                                         、
 ラ ン長
  イ      非管理職  法定内残業         0時間
               B 残業(法定外残業)   0時間
               D 残業(振替指定差分) 0 時間
 時給      非管理職  法定内勤務時間       実勤務と 法定労働時間の小さ い方
               法定内残業         勤務区分が出勤または休日出勤なら 実勤務の頭から 時間-勤務形態の所定勤務時間、 を
                                                、        8                    0 下回ら  ない
               B 残業(法定外残業)   勤務区分が出勤または休日出勤なら 実勤務-深夜-法定労働時間、 を
                                                、                  0 下回らない
               D 残業(振替指定差分) 0 時間
               有給取得時間        勤務区分が年休1日または夏期休暇または年末年始休暇または交通途絶休暇または忌引休暇なら 勤務形態の所定勤務時間
                                                                                   、
               振替指定休暇取得日数 0   日
 時給(パート 時給
       )       所定勤務          実績の開始 ~ 実績の開始+勤務者の所定労働時間+1    時間
               所定内勤務         日付区分が所定勤務日」 、なら 実勤務と 勤務者の所定労働時間の小さ   い方
※ 計算ク スはベースの計算ク スの項目を
     ラ          ラ      引き継ぎ、上書きし ます。
※ 計算式に該当する条件がない場合は0  になります。


  1.     就業規則は法人によって違いが大きい
  2.     計算クラスが Scala クラスになる(ベースが継承元)
  3.     項目が Scala メソッドになる
  4.     計算式は Scala DSL
          1.  「が」や「なら」というメソッドが実装されてる (単純な Token Rewriting へ移行予定)
  5.     青字はページからの入力、紫は対象勤務者のマスター項目
  6.     一番複雑な実例はこの5倍弱だった(病院)
PDF署名タイムスタンプサービス
                           PDF Timestamp Service (PAdES LTV)
•   元々は Java で実装されていたシステム。機能追加・改訂毎に対象部分を Scala へ移行。
    The system was originally implemented entirely in Java. As new features are added, the involving classes have been
    migrated to Scala gradually.

•   Spring などのフレームワークや JPA などのライブラリが組み込まれているが Scala へ移行しても全く問題が出てい
    ない。(ある意味当たり前・・・)
    The system is partly based on Spring framework, and employs a number of libraries such as JPA. However, replacing Java
    classes with Scala classes have never caused a problem. (No wonder)

•   銀行/ 証券 / 保険 / 総合電機などが顧客にあり、品質保証が厳格に行われているシステム。
    Customers include bank / fund / insurance / manufacturer, and the system undergo a sequence of strict quality assurances.

•   コードレビューは Java しか読めない電子署名専門家のために Scala の説明をはさみながら進めている。
    Code review has been done with small Scala lectures for digital signature specialists who can only read Java.
その他
                                                        Misc.
•   社外の Java 熟練者に Scala プロジェクトに参加してもらった際、だいたい 1, 2 週間で Scala コードを読めるように
    なり、 2, 3 週間で業務コードを書けるようになった。
    When external Java veterans join our Scala projects, they can read the Scala code in 1-2 weeks, and write business code in 2-
    3 weeks.

•   C から C++ へ移行した時の経験が生きる。例えばオペレーターオーバーローディングは勝手に作っては駄目と
    か。
    The experience when we migrated from C to C++ is valuable. For example, operator overloading is forbidden unless I am
    convinced.

•   Java の言語としての進化が足踏みして C# に抜かれている感じだったが Scala で Java 実行環境が息を吹き返したよ
    うに見える。
    It appears to me that the innovations of Java language has been somewhat stagnated, and those of C# might have gotten
    ahead, but Scala renewed the significance of Java Runtime environment.

Weitere ähnliche Inhalte

Mehr von scalaconfjp

Scalaに対して意識の低いエンジニアがScalaで何したかの話, by 芸者東京エンターテインメント
Scalaに対して意識の低いエンジニアがScalaで何したかの話, by 芸者東京エンターテインメントScalaに対して意識の低いエンジニアがScalaで何したかの話, by 芸者東京エンターテインメント
Scalaに対して意識の低いエンジニアがScalaで何したかの話, by 芸者東京エンターテインメント
scalaconfjp
 

Mehr von scalaconfjp (20)

Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
 
Scala ♥ Graal by Flavio Brasil
Scala ♥ Graal by Flavio BrasilScala ♥ Graal by Flavio Brasil
Scala ♥ Graal by Flavio Brasil
 
Introduction to GraphQL in Scala
Introduction to GraphQL in ScalaIntroduction to GraphQL in Scala
Introduction to GraphQL in Scala
 
Safety Beyond Types
Safety Beyond TypesSafety Beyond Types
Safety Beyond Types
 
Reactive Kafka with Akka Streams
Reactive Kafka with Akka StreamsReactive Kafka with Akka Streams
Reactive Kafka with Akka Streams
 
Reactive microservices with play and akka
Reactive microservices with play and akkaReactive microservices with play and akka
Reactive microservices with play and akka
 
Scalaに対して意識の低いエンジニアがScalaで何したかの話, by 芸者東京エンターテインメント
Scalaに対して意識の低いエンジニアがScalaで何したかの話, by 芸者東京エンターテインメントScalaに対して意識の低いエンジニアがScalaで何したかの話, by 芸者東京エンターテインメント
Scalaに対して意識の低いエンジニアがScalaで何したかの話, by 芸者東京エンターテインメント
 
DWANGO by ドワンゴ
DWANGO by ドワンゴDWANGO by ドワンゴ
DWANGO by ドワンゴ
 
OCTOPARTS by M3, Inc.
OCTOPARTS by M3, Inc.OCTOPARTS by M3, Inc.
OCTOPARTS by M3, Inc.
 
Try using Aeromock by Marverick, Inc.
Try using Aeromock by Marverick, Inc.Try using Aeromock by Marverick, Inc.
Try using Aeromock by Marverick, Inc.
 
統計をとって高速化する
Scala開発 by CyberZ,Inc.
統計をとって高速化する
Scala開発 by CyberZ,Inc.統計をとって高速化する
Scala開発 by CyberZ,Inc.
統計をとって高速化する
Scala開発 by CyberZ,Inc.
 
Short Introduction of Implicit Conversion by TIS, Inc.
Short Introduction of Implicit Conversion by TIS, Inc.Short Introduction of Implicit Conversion by TIS, Inc.
Short Introduction of Implicit Conversion by TIS, Inc.
 
ビズリーチ x ScalaMatsuri by BIZREACH, Inc.
ビズリーチ x ScalaMatsuri  by BIZREACH, Inc.ビズリーチ x ScalaMatsuri  by BIZREACH, Inc.
ビズリーチ x ScalaMatsuri by BIZREACH, Inc.
 
sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策
 
The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論
 
Building a Unified Data Pipline in Spark / Apache Sparkを用いたBig Dataパイプラインの統一
Building a Unified Data Pipline in Spark / Apache Sparkを用いたBig Dataパイプラインの統一Building a Unified Data Pipline in Spark / Apache Sparkを用いたBig Dataパイプラインの統一
Building a Unified Data Pipline in Spark / Apache Sparkを用いたBig Dataパイプラインの統一
 
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディングXitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
 
What's a macro?: Learning by Examples / Scalaのマクロに実用例から触れてみよう!
What's a macro?: Learning by Examples / Scalaのマクロに実用例から触れてみよう!What's a macro?: Learning by Examples / Scalaのマクロに実用例から触れてみよう!
What's a macro?: Learning by Examples / Scalaのマクロに実用例から触れてみよう!
 
Introduction to Spark SQL and Catalyst / Spark SQLおよびCalalystの紹介
Introduction to Spark SQL and Catalyst / Spark SQLおよびCalalystの紹介Introduction to Spark SQL and Catalyst / Spark SQLおよびCalalystの紹介
Introduction to Spark SQL and Catalyst / Spark SQLおよびCalalystの紹介
 
Solid and Sustainable Development in Scala
Solid and Sustainable Development in ScalaSolid and Sustainable Development in Scala
Solid and Sustainable Development in Scala
 

Scala 開発事例

  • 1. Scala 開発事例 2013/3/2 株式会社システムアート 益子健一 System Art, Inc. Kenichi Masuko kenichi-scala-conference-2013@sysart.jp
  • 2. クラウド就業システム Time Recording Cloud System • 2010 年に開発開始。初期投資が一巡し、数ヶ月前から営業が行われている。 The project started in 2010. The initial investment has completed, and the system is being introduced to the customers now. • クラウドと名前が付いているが個社別のカスタマイズが多い。 Even though the word “cloud” suggests that the system provides a uniform service to all the customer organizations, in reality there are heavily customized business logics and web pages for each organization. • カスタマイズは個社別にパラメーターを制御するパッケージ方式では対応しきれないため、個社別にロジックを 記述するコストを最小限にする方式。ここで Scala DSL が生きる。 Because there are so many ways to handle timesheets, the customizations are implemented by custom code for each organization rather than parameter settings. However, the cost of implementing them must be minimal, hence Scala DSL. • 難しいと言われる病院・大学を含む 10 社へ導入済み。社食で何を食べるかを勤務予定で登録して集計し給与シス テムへ連携するなど、予期外のカスタマイズも結構ある。また 100 年以上歴史がある法人だと、あちこち が・・・変わってる。 The system has been deployed to 10 organizations, including university and hospital, which are said to have complex requirements. An example of customization: employees submit what they eat for lunch (provided by organization), as a part of attendance plan. • 現在のコードは10万行。 Java で同じ機能を再現したら 3 倍以上にはなるはず。 The system has 100,000 lines of code. If we write the same system in Java, we feel it would require more than 300,000 lines. • 現在までのプロジェクト規模は開発だけで約 90 人月。 The development has consumed roughly 90 man-month so far. • Scala 2.8 から 2.9 へのバージョンアップは簡単だったが 2.9 から 2.10 は尐し手間がかかった。 Java に比べると後 方互換性が低く、長期プロジェクトでは不安が残る。 The migration from Scala 2.8 to 2.9 was trivial, but 2.9 to 2.10 needed some work. Backward compatibilities are weaker than Java and it might be difficult to explain the migration cost when Java doesn’t have the cost.
  • 3. クラウド就業システム ロジックの実装例 Sorry, no English. Our DSL is in Japanese since our customers don’t get along well with English. 一番シンプルな就業の日次集計ロジックの実例: 日次集計 計算ク ス ラ ベース 項目 計算式 労働基準法 法定労働時間 8時間 深夜 2 時 ~ 翌日5 2 時 非管理職 労働基準法 所定勤務 (勤務日+勤務形態の所定勤務開始)~(勤務日+勤務形態の所定勤務終了) 在社 実績の開始~実績の終了 欠務 育児欠務の合計-休憩欠務の合計 休憩控除無し実勤務 在社-欠務 休憩控除 勤務区分が出勤または休日出勤、 かつ休憩無し でない、かつ休憩控除無し 実勤務が5 時間を 超えたら ( 、 休憩控除無し実勤務 ∩ 所定勤務)の頭から 時間 1 実勤務 休憩控除無し 実勤務-休憩控除 所定内残業 日付区分が所定勤務日なら (、 実勤務時間 ∩ 所定勤務) -勤務形態の所定勤務時間、 ただし を 0 下回ら ない 所定内勤務 日付区分が所定勤務日なら (、 実勤務時間 ∩ 所定勤務) -所定内残業 所定内休憩 日付区分が所定勤務日なら 休憩欠務の合計 ∩ 所定勤務 、 日付区分が所定勤務日なら 休憩欠務-所定勤務-深夜 、 所定外休憩 勤務区分が休日出勤なら 休憩欠務の合計-深夜 、 深夜休憩時間 休憩欠務の合計 ∩ 深夜 日付区分が所定勤務日、 かつ勤務区分が出勤、 かつ実績の開始と 実績の終了があるなら 実勤務の頭から 時間-勤務形態の所定勤務時間、 、 8 ただし を 0 下回ら ない 法定内残業 日付区分が所定勤務日、 かつ実績の開始と 実績の終了があるなら 実勤務の頭から 時間-所定勤務 、 8 勤務区分が出勤または年休午前または積立休暇午前または振替指定休暇午前または看護休暇午前なら 実勤務-深夜-法定労働時間、 、 ただし を 0 下回ら ない B 残業(法定外残業) 勤務区分が休日出勤なら 実勤務-深夜-勤務形態の所定勤務時間、 、 ただし を 0 下回ら ない C 残業(深夜残業) 実勤務 ∩ 深夜 D 残業(振替指定差分) 勤務区分が休日出勤なら 実勤務と 、 勤務形態の所定勤務時間の小さ い方 勤務区分が年休1日またはフ シュ プ レッ アッ 休暇または夏期休暇またはアニバーサリ ー休暇または年末年始休暇または年次有給ボラ ンティアまたはボラ ンティア休暇または出産休暇または公務 有給取得時間 休暇または転任休暇または罹災休暇または交通途絶休暇または忌引休暇または結婚休暇または出産付添休暇看護休暇または臨時休暇積立休暇なら 勤務形態の所定勤務時間 、 勤務区分が年休午前または看護休暇午前または積立休暇午前または年休午後または看護休暇午後または積立休暇午後なら 勤務形態の所定勤務時間 - (在社 ∩ 所定勤務) 、 勤務区分が休日出勤、 かつ実勤務が3 時間以下なら 1 、 /2 振替指定休暇取得日数 勤務区分が休日出勤、 かつ実勤務が3 時間を 超えたら 1 、 ラ ン長 イ 非管理職 法定内残業 0時間 B 残業(法定外残業) 0時間 D 残業(振替指定差分) 0 時間 時給 非管理職 法定内勤務時間 実勤務と 法定労働時間の小さ い方 法定内残業 勤務区分が出勤または休日出勤なら 実勤務の頭から 時間-勤務形態の所定勤務時間、 を 、 8 0 下回ら ない B 残業(法定外残業) 勤務区分が出勤または休日出勤なら 実勤務-深夜-法定労働時間、 を 、 0 下回らない D 残業(振替指定差分) 0 時間 有給取得時間 勤務区分が年休1日または夏期休暇または年末年始休暇または交通途絶休暇または忌引休暇なら 勤務形態の所定勤務時間 、 振替指定休暇取得日数 0 日 時給(パート 時給 ) 所定勤務 実績の開始 ~ 実績の開始+勤務者の所定労働時間+1 時間 所定内勤務 日付区分が所定勤務日」 、なら 実勤務と 勤務者の所定労働時間の小さ い方 ※ 計算ク スはベースの計算ク スの項目を ラ ラ 引き継ぎ、上書きし ます。 ※ 計算式に該当する条件がない場合は0 になります。 1. 就業規則は法人によって違いが大きい 2. 計算クラスが Scala クラスになる(ベースが継承元) 3. 項目が Scala メソッドになる 4. 計算式は Scala DSL 1. 「が」や「なら」というメソッドが実装されてる (単純な Token Rewriting へ移行予定) 5. 青字はページからの入力、紫は対象勤務者のマスター項目 6. 一番複雑な実例はこの5倍弱だった(病院)
  • 4. PDF署名タイムスタンプサービス PDF Timestamp Service (PAdES LTV) • 元々は Java で実装されていたシステム。機能追加・改訂毎に対象部分を Scala へ移行。 The system was originally implemented entirely in Java. As new features are added, the involving classes have been migrated to Scala gradually. • Spring などのフレームワークや JPA などのライブラリが組み込まれているが Scala へ移行しても全く問題が出てい ない。(ある意味当たり前・・・) The system is partly based on Spring framework, and employs a number of libraries such as JPA. However, replacing Java classes with Scala classes have never caused a problem. (No wonder) • 銀行/ 証券 / 保険 / 総合電機などが顧客にあり、品質保証が厳格に行われているシステム。 Customers include bank / fund / insurance / manufacturer, and the system undergo a sequence of strict quality assurances. • コードレビューは Java しか読めない電子署名専門家のために Scala の説明をはさみながら進めている。 Code review has been done with small Scala lectures for digital signature specialists who can only read Java.
  • 5. その他 Misc. • 社外の Java 熟練者に Scala プロジェクトに参加してもらった際、だいたい 1, 2 週間で Scala コードを読めるように なり、 2, 3 週間で業務コードを書けるようになった。 When external Java veterans join our Scala projects, they can read the Scala code in 1-2 weeks, and write business code in 2- 3 weeks. • C から C++ へ移行した時の経験が生きる。例えばオペレーターオーバーローディングは勝手に作っては駄目と か。 The experience when we migrated from C to C++ is valuable. For example, operator overloading is forbidden unless I am convinced. • Java の言語としての進化が足踏みして C# に抜かれている感じだったが Scala で Java 実行環境が息を吹き返したよ うに見える。 It appears to me that the innovations of Java language has been somewhat stagnated, and those of C# might have gotten ahead, but Scala renewed the significance of Java Runtime environment.