Webプログラマから見た「CWL」の功績と罪過
このエントリは、CWL Advent Calendar 2017 - Qiitaの25日目です。
背景
誰がエモ芸人や
CWL is 何?
異なる処理系の間で同一のワークフローの実行を可能にするために、ワークフローの内容を記述し、実行系の間で交換するための標準形式の策定を目的として Common Workflow Language (CWL) プロジェクトが発足した。
すげーざっくり言うと、バイオインフォのゲノム解析の手順書を統一規格で書こうぜ、という感じのブツです。
実際どうやって使うねん
- CWL User Guide 1: Introduction と 2: First Example をやってみた
- CWL User Guide 3: Essential Input Parameters をやってみた
% cwltool 1st-tool.cwl echo-job.yml
サンプルで、1st-tool.cwl
と書かれているものが、いわゆるワークフローの定義であり、echo-job.yml
というのはパラメータとかサンプルとか呼ばれたりするらしいです。これ、なんで分割されているかというと、
世界のどこかで、とっても良い感じのワークフローを提唱したひとがいたとして、
同じワークフローで別のサンプルで試してみたいと思うひとが出てきます。
ということで、ワークフローの記述と実際のパラメータは分割されている必要があります。
CWLの初期衝動
ところが、論文に載っている手順に従っても、それが「再現」できないという問題が起きます。
この点を解決しようと立ち上がったのが、CWLです(雑)。Repeat/Reproduce/Replicate/Reuseについては先述のinutanoさんのエントリが詳しいです。
CWLの実行エンジン
入力としてワークフロー(.cwl
)とパラメータ(.json
など)を受取り、記載されたワークフローを実行するソフトウェアが必要です。これを公式では「implementation」、日本のコミュニティでは「エンジン」と呼んだりしています。
私もいちおうソフトウェアデベロッパーの端くれとして、manabuishii先輩と一緒に、Go言語でCWLのデコーダとimplementationを実装中です。
- GitHub - otiai10/cwl.go: CWL (and input file) parser for Golang, used by github.com/otiai10/yacle
- GitHub - otiai10/yacle: Yet Another CWL Engine by Golang
CWLの競合
同様の問題意識を持ち始まったプロジェクトは他にも複数あります。
// TODO: 競合のリストがここにくる - WDLとか? - nextflowとか?
CWLのここがよい
第1に、バイオインフォが抱える問題(とは言っても僕自身この分野の新参者なのであまり歴史的な背景とか精通してるわけじゃないんですけど)にスポットライトを当て、それを解決しようと立ち上がったのは、素晴らしいことかと思われます。
第2に、国際学会やカンファレンスで精力的にディスカッションやハッカソンをしたり、GitHubで仕様を管理したり、コミュニティ形成に力を入れており、提言やPull-Reqにたいしてもかなり柔軟に取り入れたりしているのは普及したポイントかなと思います。実際、我々が作成中のGo言語実装:yacleも実装例のひとつとして早くもリストされています。
第3に、実際多くの場面で使われていること。国際的に、ワークフローの共有といったらCWLファイルつくっとくかぁ〜みたいな雰囲気がすでに漂っており、また公開されたCWLで記述されたワークフローをクラウド上で動かすウェブサービスなども出てきております。
以上が、CWLもなかなかいいじゃん、というProsになります。
.....
....
...
..
.
CWLのここが嫌い
そういう上っ面じゃねえんだ、アドベントカレンダーはよぉ!こっからが本題だ。
Webプログラマから見たCWLの罪過、罪過?むずかしい言葉使ってんじゃねえよ!嫌いなところについて!うらみつらみを列挙して行こうと思います。
- まず名前が嫌い
- syntaxが嫌い
- Data Modelが嫌い
- みてくださいこの型!
array<CommandInputParameter> | map<CommandInputParameter.id, CommandInputParameter.type> | map<CommandInputParameter.id, CommandInputParameter>
って!- つまり
[]Model|map[string]string|map[string]Model
ってことです- これCとかGoでどうやってstructにデコードしますかね
- 血涙流しながら怒涛のtype switch書きまくりました!
- これCとかGoでどうやってstructにデコードしますかね
- つまり
- みてくださいこの型!
- 表現方法が嫌い
- 百歩譲って、ある言語でデコードがたいへんなのはその言語のせいだとしましょう。しかしながら、ある1つのことを表現するのに、多くの表現方法があることは、規格として正しいあり方なんでしょうか。
- 表現方法が嫌い・その2
- なんやねん!その2て!!!!!
- Exrepssionsというclauseがあるんですけど、これがマジやっかい
- これねーJavaScriptなんですよ!!(しかもES5!)
- ワークフロー定義の内部がJS要求するっていうのならまだ分かるんですが、ワークフローの記述の表現にある特定のランタイムを要求するのって筋悪すぎじゃないですか
- しかも、あたりまえだけどめっちゃくちゃいろんなこと出来るので、ワークフロー記述規格としての治安が乱れまくる
- 哲学が嫌い
- 上にも書いたように、かなりいろいろディスカッションして、だいたいのものは取り入れちゃってるので、仕様がどんどん肥大化していって、エンジンの実装者が「どの機能をサポートしないべきか」とかまず考えなきゃいけないレベルになっている
- "All is nothing" を地で行ってて最高にクール
- そして、すでにけっこう使われているのが何よりも嫌
- プラットフォームつくりました!という話しても「それ、CWL食える?」みたいな質問が普通に飛んでくるぐらいには普及してしまっている
- 過渡期に、パイ取った感じある
- もう避けては通れない
提言と提案
- ワークフローを記述する規格は
- 我々はバイオインフォマティシャンは*1
- CWL+cwltoolでもいいし、何かほかの方法でもいいが、自分が直面している問題を解決することにフォーカスしたワークフローの記述&実行を心がけるべき
- 銀の弾丸を追わない
- そういった「ぼくのかんがえたさいきょうのわーくふろー大会」をやりましょう!
- painを同じくする仲間が見つかれば、たのしいですね
- CWL+cwltoolでもいいし、何かほかの方法でもいいが、自分が直面している問題を解決することにフォーカスしたワークフローの記述&実行を心がけるべき
雑感
- ちょっと遅くなりましたが、とびきりエモいやつを書きました
- 大口を叩きましたが、今後ともご指導ご鞭撻のほど、よろしくお願い致します
DRY