2020年10月17日(土) ~ 18日(日)にかけて開催された、アジア最大級のScalaカンファレンス “ScalaMatsuri 2020”。 Visionalからも2名のエンジニアが登壇をいたしました。 本日は「Dotty ではじめるマルチステージプログラミング入門」というタイトルで登壇した鈴木 健一さんにインタビューを行い、その舞台裏に迫りました。

──はじめに、自己紹介をお願いします。

鈴木 健一です。脆弱性管理ツールの「yamory」 の開発をしています。
もともと SIer の出身で、主にアプリケーション基盤やアーキテクチャ設計、開発統括/支援等の業務を担当していました。Scalaに関連するものでいうと、大学院ではプログラム言語理論の分野に取り組んでいました。Extensible Effect や tagless-final 等の第一人者である Oleg Kiselyov 先生と、マルチステージプログラミングのエキスパートである亀山幸義先生と一緒に研究をしていました。研究では Haskell や (BER Meta) OCaml などをメインに使っていました。

──「yamory」ではScalaを利用していると聞いたのですが、どのように利用されているのでしょうか?

「yamory」はアプリケーションのプロジェクトが依存するオープンソースの脆弱性を検知/管理するためのツールで、昨今、注目を集めているサイバーセキュリティ領域における課題解決に取り組むためのサービスです。

「yamory」ではプロダクトのコアの部分に Scala を使っています。マニフェストファイルと呼ばれるパッケージ管理やビルドの定義ファイルをパースして、プロジェクトが依存するライブラリを抽出するのですが、その機能の実装にパーサーコンビネータを利用しています。パーサコンビネータを使うことで、正規表現等の手法に比べて、きめの細かいパース処理が実現できています。パース処理を作る前に、パース対象の形式化をしておくと、仕様がより明確になりパース処理が書きやすくなります。特に、 Scala の sbt プロジェクトのスキャンでは他社ツールよりも精度が高いという結果も出ています。

スキャンに対応する言語 はリリースしてから 1 年でだいぶ増えました。 JVM 言語では Java / Kotlin / Scala、 JavaScript 系では JavaScript / TypeScript、 他に PHP / Python / Ruby / C#、 そしてα版として Go に対応しています。

yamoryのサポート言語・スキャン対象一覧

現在は、オープンソースのライセンスを検知するための開発に取り掛かっています。ライブラリの依存関係に意図しないライセンスが紛れ込んでいたら怖いですし、複数のライセンスが組み合わさってしまっていて、それらの条件が矛盾していると、利用条件を満たさなくなるため、それらのライブラリに対する利用は許諾されないということになりかねません。そのため、「yamory」ではオープンソースを正しく安全に利活用するためのサポートを拡大しようとしています。

──Scala を採用して良かった点はなんでしょうか?

型が強いことと、関数型言語の特徴を活かせることです。特にパターンマッチが強力で、全域性(totality)を確保しやすくバグを作りにくいところはシンプルに助かっています。さらに型を隅々まで浸透させやすいので、仕様変更等のときにも影響範囲を特定しやすく、スピーディーに漏れなく改修できるので安心して開発できます。また Cats や ZIO を使うと副作用のハンドリングがしやすく、テスタブルにできるので、品質の作り込みがしやすいことも Scala を採用してよかったと思う点です。全体的に、品質をコントロールしやすいといいますか、アジャイルな文化で一定品質を保ったまま素早く開発しやすいと思います。

Scala はプログラム言語理論分野のエキスパートな方々が中心に開発をしているので、その分野の多くの研究者たちが研究してきた成果が取り込まれやすいと思います。しっかりした研究成果が土台になっているというのは言語の発展性という意味でも嬉しいです。Scala の次期メジャーバージョンである Scala 3 のように、標準でマルチステージプログラミングをサポートしている言語は他にないのではないでしょうか。

──「ScalaMatsuri 2020」では「Dotty ではじめるマルチステージプログラミング入門」(スライド)というお話をされていましたね。改めて、マルチステージプログラミングの概要と、そのメリットについて教えてください。

簡単にいうと、マルチステージプログラミング(MSP)は、「型安全なコードが生成されることが保証されたメタプログラミングの一種」です。

Java でいうところのリフレクションのような仕組みを使って生成されたコードは、その安全性が保証されておらず、もしかすると不正なコードになっていて、実行時にエラーになる場合があります。しかも、メタプログラミングで生成したコードにバグがあった場合、そのデバッグがとても難しいという問題があります。 MSP ではそのような生成されたコードの安全性が保証されているという点が、一つのメリットです。

MSPのもう一つの特徴として、「予め与えられたパラメータに特化したプログラムを事前に生成して使い回す」ということができます。これによって、汎用プログラムを書きつつ、特定のパラメータや環境に特化したプログラムを生成しておいて、パフォーマンスの高いプログラムを実行できるようになります。抽象度を保ちつつ、パフォーマンスを両立させることができるわけですね。この特性を Abstraction without regret と呼びます。

Specializing with MSP

もし MSP にご興味があれば、発表にもありましたが、tagless-final と組み合わせた独自 DSL のエンジンや、クエリエンジンの開発にご活用していただくと良いと思います。

Abstraction without regret のケーススタディとして面白いのは、“Functional pearl: a SQL to C compiler in 500 lines of code” でしょうか。Scala で書かれた 500行のクエリプロセッサが、MSPを用いて最終的に C 言語で書かれたクエリプロセッサと同等かそれ以上のパフォーマンスを得るというものです。C で低レベルに書くより、Scala で高レベルに書いてパフォーマンスも両立させましょう、ということです。

他にも、ハイパフォーマンス・コンピューティング(HPC)の分野でも行列計算を高速化する等の応用研究や事例があります。また、小さな関数を組み合わせると関数間のデータの受け渡しにそれなりのコストが掛かりますが、そのようなプログラムを「関数間で受け渡しされる中間データ構造を除去したプログラムに変換」する融合変換(fusion)の分野でも応用例があります。

1点苦労したのが、動くサンプルを作る直前になって気づいた、Scalaの GADT 実装がまだ不完全 という問題の回避でした。 現場で GADT を使われるなら、使うケースを限定しておいたほうがよいと思います(特に、内部でアロー型を保持する型は使わないほうがいいと思います)。

──2日目のブースでは「脆弱性対策のための Clean Architecture 〜脆弱性に対するレジリエンスを確保せよ〜」というLTをされていましたね。「Clean Architectureと脆弱性レジリエンスが結びついているんだ」という意外な発見がありました。あの LT に至った背景はどのようなものでしたか?

脆弱性はまず検知できるようになることが大事ですが、その後の対応を素早くやるということも大事です。
依存ライブラリに脆弱性が発見されても、そのライブラリを替えた場合に、依存関係やプロダクトコードへの影響が大きいと、対応に時間が掛かります。しかし、脆弱性の放置は攻撃の温床になるためスピーディーに対応しなければなりません。

Clean Architecture には「決定を遅らせることができる」という性質がありますよね。この性質をうまく使えば、依存ライブラリに脆弱性があったときも素早く対応できます。その意味で、脆弱性レジリエンスに Clean Architecture は相性が良い。そのような背景で、あの LT になりました。
発表内容を一部抜粋・加筆した記事 をyamoryのブログに書いているので、こちらもぜひご覧ください。

ちなみに、脆弱性レジリエンスという言葉は、脆弱性に対する検知力と、その脆弱性に対する対応力を意味しており、システムやサイバーセキュリティでいうところのレジリエンスにちなんで、「脆弱性レジリエンス」と yamory チームで名付けました。

──次の発表予定はありますか?

アジャイルのなかで品質管理と合わせて脆弱性対策を進めていくにはどうしたらよいか、ということで 12月24日(木)に「エンタープライズアジャイル開発における品質管理とセキュリティ対策をyamoryで考える」というテーマでイベントを開催する予定です。

yamory エンタープライズアジャイル開発における品質管理とセキュリティ対策

品質を作り込むためにどのような取り組みをすればよいか、限られたスプリント期間のなかで、要求された機能を作りつつ脆弱性対策までカバーするにはどうすればよいか、具体的な脆弱性やその危険性、効率のよい脆弱性管理方法、といった内容についてお話できればと思います。ぜひイベントにご参加いただき、クリスマス・イブにこれからの開発の在り方についてご一考いただければ幸いです。

──本日はありがとうございました!

こちらこそ、ありがとうございました。

鈴木 健一
鈴木 健一

大手SIerでアーキテクチャ設計や基盤開発、開発プロセス策定等に従事した後、より堅牢な開発を求めてプログラム言語理論(型システム、関数型等)の研究に踏み込む。現在はよりセキュアな世界を目指して、国内初のセキュリティサービス (SCA; Software Composition Analysis) であるyamoryの開発をリード。ソフトウェア開発の効率化や品質の向上と価値創出をつなげることに興味がある。