「formal and casual」をテーマにした とちぎ Ruby 会議 05 が開催されました。
「厳密な仕様を書くということ」に始まり、言語仕様、本の執筆、品質活動、新しい Ruby、モックアップとプロトタイプ、テストの事など様々な事が発表そして話し合われました。
「わたしは見かけから分かるようにオールドプログラマ。というかオールドエンジニアです。」と和やかな自己紹介で酒匂寛さんによる招待講演が始まりました。
テーマは”厳密な仕様を書くということ”。酒匂さんのここ 10 年のテーマである”形式手法”についての講演です。前半の講演、後半の大質問大会、合わせてご紹介します。
ソフトウェア開発のドキドキを取り戻せるすばらしい時間でした。
最初に酒匂さん自身のソフトウェア開発との関わりを振り返ります。
80 年代、酒匂さんはワークステーションのツールを作成する仕事をされていました。「そこでは 35 万ステップ書いて死ぬ様な目にあったんですよ」と語る酒匂さん、この経験から”契約による設計”と出会い、90 年代初頭メイヤーの”オブジェクト指向入門” 1 の翻訳本を出版します。
その後。「ツールもいいんだけど、じゃあオブジェクト指向って何でしょうね?」と考えた酒匂さんは、医療、物流系のソフトウェアをオブジェクト指向の考えを利用して組み直していきます。
そして、90 年代の終わり、マイケル・ジャクソンの”ソフトウェア要求と仕様“を翻訳します。
「やっぱりちゃんと仕様書かなきゃだめっていう話がさらに強まって、今日の話はこの延長線上にあります。」
そして 00 年代、酒匂さんは形式手法に向かっていきます。
なお、ここまで、Ruby の話ができていませんが、00 年代初頭に既存システムのデータのコンバートに Ruby を使用していたそうです。
「ホントは Ruby 会議なので Ruby の話をしたほうが良いのですけど、今日はその話をしないで仕様の話をします。」
今回のテーマは”厳密な仕様をかくということ”、仕様とは何なのでしょうか?
「仕様は課題と設計を繋ぐものです」と酒匂さん。
「つまり、どのような問題があって、それをどう解いたら良いか?を結びつけるところを記述しているものです。」
酒匂さんは”道案内のソフトウェア”を例に説明します。この場合、”道を案内する”というのが課題になります。
「この課題を解決するのにいきなり経路探索を設計するか、というとそうではなくて、そもそも”経路とはなにか?”とか、”探索とはなにか?”とか、”どのような入力と出力がありえるのか?”とか、そこに仕様が当然あって、複数の仕様を組み合わせ、如何に目的に達するかみたいな話があります。」
仕様が課題と設計の間に存在する。仕様と設計の間のトレーサビリティ(仕様からテストケースを作成するなど)は最近になり、実際の開発現場でも使用できるようになってきているとも酒匂さんは語っていました。そして、仕様を形式化することの大事さを語ります。
「問題をいかにうまく”仕様”という形で形式化するにはまだやらなければならない課題がいっぱいあります。 (世の中には)事実があります。事実というのは私達には手出しができません。法律、理論、原則などです。その変えられない世界の中に要求が生まれます。 要求というのは、提案、改善、企画、欲望、想像、課題です。大事な事は、私たちは何か価値を生み出さなくてはいけない。 なにかを作ることでなにかうれしいことが起きなければならない。それらを実現するのに仕様をどう作れば良いか、それを切り出してから設計をしましょうね、ということです。」
そして話は現場での仕様に関するよく耳にする話に移っていきます。
「(開発の現場では)仕様はいったい何なんだとか議論がよくあります。仕様が曖昧だと色々困ったことが起きますね。課題、問題の世界では欲望が渦巻いています。そしてこれをアーキテクチャ、コンポーネントといった設計に落とす。ここに仕様が挟まっている。しかし、多くの仕様書は曖昧、矛盾があったり、そもそも書いていなかったり。個人メモであったり、それぞれの人が違う解釈をしている。本来、ある課題がトレースされて仕様に繋がって、実際には設計に落ちている。これが理想的な世界です。しかし、仕様がないと、対応付けが良く分からない、このモジュールはどっから来たのかなどのが議論しにくくなる、そもそも誰が決めたんだとか。(仕様)を書かないとその間の関係が分からない。」
確かに開発現場でこういった話はよく耳にします。それでは、仕様を完全に決めてから、設計すれば良いのでしょうか? それってうまくいくものなのでしょうか?
酒匂さんはこう続けます。
「こういう話をすると、仕様を全部書いて(決めて)から、次に設計するんですか、ウォーターフォールなんですかとか仰る方もいられます。実際にはある種の要素が課題の領域で起きて、それがパラレルに仕様と設計に反映される、これらは同時に起きても良いのです。どのような手順で(それらを)追いつめていくかによって色々な方法論があるのです。ここを全部やって(仕様を決めて)、ここを全部やって(設計して)とやると、ウォーターフォールになるし、ある種の特定の所だけプロトタイピングして、フレームワークを決めて行うといった方法もあります。(どのような方法論を用いるかは)問題の性質、時間などといった様々な制約により(我々が)決定すれば良いのです。いずれにせよ、解かなきゃいけない問題と解き方と、その間をつないでいる”仕様”が存在する構造は変わりません。」
それでは仕様をちゃんと書けるとなにがうれしいのでしょうか?
「仕様をちゃんと書くと、仕様そのものをテストすることができます。」と酒匂さん。
では、仕様をテストできると何がうれしいのでしょうか。
1 つは仕様を検証できるということです。
「ふつうの場合、仕様をテストするということはどういうことかというと、人間がレビューすることになる。実際には単体テストやったり、総合テストをやったりして、その段階で仕様に問題があることが分かったりする。その時、正しい仕様って何だったの?という話になる。ここ(仕様)をちゃんと書いて早い段階で検証しましょう、それによって随分先々楽になるんですよ。」
検証を行うタイミングも変わってくるようです。酒匂さんはこう続けます。
「要求を出す側が、そうそう、私が欲しいのはこういうことなんですよということを早く言えるようになる。もちろん、完全に言えるわけでは無いのですが、プログラムが実際できてからこれ違うんじゃないのという話よりも、もっと早い段階で言いやすくなる。」
もう 1 つは、仕様を検証したことにより生成された成果物を再利用できるということです。
「それから、仕様の段階で検証するため、仕様自身をテストすることができる。テストをしたということはせっかくだから、そのテストケースを実装のテストでも使うことができますよね。テストケースの生成、流用もできる。仕様を検討している段階で様々な有用なテストケースが想定されている訳ですけれども、それを実装のテストで使わないのはもったいないですよね。」
さらにこう続けます。「もちろん、仕様と設計の間のやりとりだけを観てみても、設計者が、この仕様どうなってるんですかね?という疑問により良く答えることができるようになります。」
ここから講演は例題を交えた形式手法の話題に移ります。
「形式手法とは何かというと、仕様を厳密な構文と、意味を持つ手段で記述して、検証( Verification )、妥当性( Validation )、確認、文書化、設計といった開発活動の品質を向上させる手法です。」
今回の講演の例題では VDM というツールを使いました。VDM ( Vienna Development Method ) はその名の通りヨーロッパ生まれの手法でツールは無償で提供されています。我々が普段目にするプログラミング言語の様な実装言語ではなく、仕様を書くための言語、仕様記述言語です。
では仕様を具体的にどのように書くのでしょうか?機能仕様を以下の 3 要素に分けて考えます。
この中でも VDM は構造と機能に関する記述が得意そうです。
「検証可能な記述をすることで、品質を評価することができる。」と酒匂さん。
例題として休日の定義とはなにかを考えるため、国民の休日に関する法律の文章を形式手法言語で置き換えてみます。そして、さらに具体例として、指定した日付から N 営業日後の日付を求める関数の仕様を考え、形式的に書くことで何がうれしいのかまとめてくれました。 「集合演算と関数を駆使することによって、見通しの良い、コンパクトな記述を実現できます。短い記述、論理的な記述だけに着目することによって、議論がしやすくなる。仕様を書く際に手続きではなく、性質を宣言的に綴ることで仕様の質が高まります。」
最後に酒匂さんは講演をこの様に締めくくりました。
「形式手法は銀の弾丸でもない数学でもない、ただ、開発対象をより厳密に書き留め解析を行う単なる工学的手法です。」
ここからは後半戦、酒匂さんへの大質問大会です。
先ほどの基調講演を踏まえ、繰り出された数々の質問の中から抜粋して紹介します。
「多分、やっている人達が自分たちが適用するのには熱心であったが、普及に熱心ではなかったのではと、やや反省している。(今後は)分かりやすい例題、教材などを提供したい。本質的な議論を聞いてもらえれば興味は抱いてもらえるはず。」
「オブジェクト指向は流行ったんですが、これは実装言語として流行った訳ですよね。じゃあ、皆さん、メイヤーの言うところの PreCondition、PostCondition をちゃんと書きましたかっていう話です。本当はそこが本質なんですけども、何となくモノが動いちゃうから、動かす方にみんな熱心にいってしまうわけです。オブジェクト指向自体は大変有効な技術だし、私も随分関わっていますから分かるんですけども、そもそも、”これはなぜこういう仕様になっているんですか”という話になったとき、実はここ(仕様)をちゃんと考えなきゃいけない。職場で一度ならず”ここの仕様はどうなってるんだ”という話はしているはず。(仕様)をきちんと作っておくのは非常に大事なのです。」
「そこは発展途上です。実は願望が一番もやもやしている。宣言的なフラグメントを作り出して、(課題と仕様の間の)トレーサビリティを確保するように書いていくのが大事かな。そうやって決意をしないとトレーサビリティは確保されない。」
「漏れを検出しやすい訳ではなくてですね、漏れというのは何をやっても検出できません(笑)ただ、形式手法記述言語を使うことによって何が書かれていて、何が書かれていないかがはっきりするだけです。やっぱり書かれていないことは分かんないんですよ、残念ながら。書かれていないことを発見するのに今までの経験から一番分かりやすいのはテーブルです。表に書かれていると対称性が崩れてしまうので、ここが無いねっていう話になる。私は今日、形式手法の話をしている訳ですけど、もちろん(道具は)それだけでは無い訳です。」
「それは私が思うに図で書いているからです(笑)。UML の図をメンテナンスしても何もうれしくない。図は説明に使えばよろしい。図は使い捨てで良いんです。」
自然言語、プログラミング言語を通しての実装、設計を発表していただきました。
プログラミング言語が「コンピュータに命令を伝える道具」でもあり「人が読んで仕様、設計を理解する言語」でもある事を再確認させてもらえる内容でした。
また、資料にもあるような「スピリチュアル!?」な件もあり、会場を笑いの渦へ巻き込んでくれるネタは今回も健在でした。
書籍を書くまでにどうノウハウや経験を貯めて、アウトプット:「パーフェクト Ruby」するかを発表していただきました。
これから、本を書こうとする人向けの話だけでなく、これから Ruby を始める人にとっても有益な「Ruby の学び方」を教えていただきました。
クックパッドの品質活動を通じて、感じたことを発表していただきました。
他の業界でも言われている「リーンスタートアップ」や「自工程完結」は今後、IT業界にどう関わってくるのか興味深いですね。
また最後に「自工程完結をどうやったら実現できるのか?」の参加型質問コーナーとなり、会場が盛り上がりました。
どうやったらテストと実装と品質改善などを効率よく(サイクルを)回していけるのか?考えていきたいですね。
残念ながら発表時間が足らず全て聞けませんでしたが、2.1 の新たな展望を発表していただきました。
※資料から残りの発表されなかった部分を見る事が出来ます。
また、資料を読んでいて、ほぼ全て英語で書かれているのですが英語が苦手なレポート係でも「読める」事に気が付きました。
簡潔にまとまっている資料は言葉の壁を超えるのだと感動しました。
ご自身の経験上「モックアップとプロトタイプ」を通して様々な場面での定義を 発表していただきました。
「1 px のズレが…」では会場内で「苦笑い」が聞こえてきた事から(自分もですが)味わった人達が多かったのではと感じました。
「仲間を増やしたい:一緒に考えてくれる人、仕事をしてくれる人を募集します。」は決して他人事ではなく何かアイデアがあれば提供していきたいものですね。
仕様が厳密に決まってないと、「どのように苦戦」し「どういう対処」が必要なのか?貴重な体験談でした。
今回のテーマであるカジュアルとフォーマルに沿ってのテストへのアプローチを発表していただきました。
発表の中に Turnip の紹介があり、ご自身が書かれた記事(るびま) や ソースコード(github) のURL を教えていただきました。
興味のある方は読んでいただければと思います。
発表はまだまだ途中でしたが、設計や実装に関する「?性」の話をしていただきました。
simple と easy は日常生活では同じように見えるのですがプログラミングとなると違うという事に気付かされました。
「客観的」と「主観的」は確かに違うのでコードの設計をする時は是非意識してやりたいものです。
残りは別の機会に話した頂けるそうなので、楽しみですね。
とちぎ Ruby 会議の開催母体となっている toRuby でいつも行っている勉強会を行いました。
toRuby では現在「さまざまなデータとアルゴリズム」の朗読、写経を行っています。
今回は著者の 1 人である arton さん本人による朗読を交えた勉強会となりました。
朗読の合間の、どうしてこういうことを書いたのか?など、書籍の行間を埋めるような発言の数々は、著者ご本人による朗読ならでは。また、会場の様子を見てもらうと分かるのですが、写経をペアプロで行う方も多かったようです。
余談ですが、このような勉強会で写経に使う本を忘れると参加できないんじゃないかと思われる方がいらっしゃいますが、それは違います。隣の席の方とのペアプロのチャンスとポジティブに受け止めましょう。
実は筆者も忘れてしまった一人です。しかし、忘れ物をしてもネガティブにならない。
これは arton さんも本を持ってくるのを忘れてしまっていたことがしっかり証明してくれています。
形式手法に始まり、思いやり、品質、モックアップ、テスト、simple とeasy、そして Ruby! と非常に話題は多岐に渡りました。
そこには、今回のテーマである”formal and casual”が散りばめられており、とちぎで今しか味わえない極上の Ruby 会議であったと思います。
次回 06 も楽しみです。
そうそう、06 が待ちきれない方には朗報です。
とちぎ Ruby 会議 05 の主催である toRuby は毎月第 1 水曜日 18:30 から西那須野公民館にて開催しています。 とちぎな方もそうでない方もご参加お待ちしています!
2 冊あります。 ↩