オブジェクトの広場は株式会社オージス総研グループのエンジニアによる技術発表サイトです

レポート

CRCカードでチームが協働して設計する

UMTPモデリング技術部会主催技術セミナー参加レポート
オージス総研
水野 正隆
2018年3月14日

チームメンバーみんなで協働してハイレベルの設計をすることができるテクニックがあります。CRCカードを使った設計モデリング。UMLモデリング推進協議会(UMTP)主催のセミナーで開かれたCRCカードのワークショップで学んできました。講師はオブジェクトの広場の編集員でもある藤井拓です。本記事では、セミナーで行われたワークショップの様子をお伝えしつつ、CRCカードを使った設計の概要を紹介します。

UMTPのCRCカードワークショップ

2018年2月に、UMLモデリング推進協議会(UMTP)主催の技術セミナーがありました。今回は「CRCカード ワークショップ~賢いクラスとそれらのコラボレーションをモデリングしよう」という内容で、オブジェクトの広場の編集員でもある藤井拓が講師をしました。

ワークショップの配布物 ワークで配られたもの:CRCカードの進め方と、ユースケース、講義スライドを印刷したもの。

CRCカードは、1988年に初期の設計アイデアを考える手段としてWard CunninghamとKent Beckによって生み出されたものです。XP(エクストリームプログラミング)においてCRCカードはクラス設計の重要なツールとされています。最近ではアジャイル=スクラムと誤解されていることが多く、XPを耳にすることが減りましたが、2000年頃にXPが脚光を浴びていた時はその名前をよく聞いたものです。すっかり聞かなくなってしまったCRCカードのワークショップを藤井がするというので、その開催を知った瞬間に参加申し込みをしていました。

そのワークショップで学んだことを私の視点でまとめました。

CRCカードってなに?

CRCカードのCRCは、クラス-責務-コラボレータ(Class-Responsibility-Collaborator)の頭文字をとったもので、その名が示す通りクラスごとの責務と責務を全うするために連携する他のクラス(コラボレータ)を指します。CRCカードは、クラスごとの責務とコラボレータを下図のフォーマットで書いたものです。

CRCカード CRCカードのフォーマットと例:注文情報をまとめる注文クラスの例

CRCカードを初めて見る方でも、特別な説明がなくても内容が理解できるかと思います。クラスを設計するときに最低限考えるべき内容に絞った項目でカードが構成されているところがポイントです。本質的なことに集中するので設計の生産性を高められるのです。

CRCカードと後述の設計モデリングの方法については、書き足りないことがあるので(全部書くと、ワークショップ参加レポートを超えてしまう…)、オブジェクトの広場として別途記事を出したいと思います。

設計モデリングの進め方

まず、次のものを準備します。

  • 設計する対象のユースケース(今回のワークショップでは「ユースケース」を用いましたが、設計のインプットは「ユーザーストーリー」でもOKです)
  • 情報カードたくさん(B6サイズのものが良いと思います)
  • 書きやすいペン
  • 付箋
  • 会話のトークンに使う何か(下の写真ではアメフトボールのおもちゃ)

準備するもの 準備するもの:インデックスカード、ペン、付箋、会話のトークンに使う何か。

CRCカードを使った設計モデリングは、複数の人が集まり、それぞれクラスになりきってクラスの相互作用をロールプレイして進めます。そのときにCRCカードを活用します。ロールプレイしているときにクラスの責務や必要な相互作用が発見されたり修正されたりすれば、随時CRCカードの情報を書き換え、時にはカードを破棄して新しいカードを作ります。すごくクリエイティブで、楽しいワークですよ。

具体的な進め方を下に示します(UMTPのワークショップで紹介いただいた方法をほぼそのまま転載しました)。

  1. モデリング対象のユースケースを1つ選ぶ
  2. そのユースケースを実現するクラスを考える
    • 思いついたクラスの候補は情報カードの表側にどんどん書き出そう!
    • 可能であれば、そのクラスの目的も書いてみよう
  3. 定義したクラスの担当者を決める
  4. ユースケースを実現する責務とコラボレータを考えよう
    • 起点となるクラスを決め、そのクラスの担当者がカードに責務を書き込み、さらに呼び出すコラボレータを記入する
    • クラスのコラボレーションは、クラスの担当者の間でボールを受け渡して表現する
  5. モデリング対象のユースケースを増やしながら、クラスがより賢く、適度の責務が分散するようにクラスの構成、責務、コラボレーションを見直す

このときに注意することがあります。

  • カードに記入する人を一人に集中させないこと
  • クラスを担当する人はそのクラスの気持ちになって自分の役割(責務)が簡単すぎるとか、複雑すぎるとかを考える

チームが協力して設計モデルを作れる強力なツール

上で示した進め方と注意事項を守り、5名程度のグループでそれぞれモデリングするユースケースを決め、モデルを作っていきました。途中、ブレイクを取って進め方の振り返りをしたり、他のグループの途中結果を軽くシェアしたりしながら、グループワークを進めました。

ワークの様子1 ワークの様子1:それぞれのクラスの気持ちになってロールプレイする人たち

今回のワークショップに集まったのは、ソフトウェア開発の現場でUMLモデルを頻繁に使い、活用している人たちばかりではありませんでした。むしろ、その方が少数派で、UMTPの資格をお持ちの方も少なく各テーブルに1~2名程度でした。また、どのグループも初顔合わせの人たちばかりの構成でした。

そのような初めて出会った人たちで作った即席のグループでも、課題に対する初期のモデルを作ることができました。もちろん、CRCカードを初めて使う人たちばかりです。CRCカードは敷居が低くて特別なトレーニングをすることなくすぐに習得できるということを実感しました。また、CRCカードが素早く初期の設計モデルを作成することができるツールであることも分かりました。

また、それぞれがカードを持ち自分の役が回ってきたときに発言するルールなので、グループ全員に発言の機会があります。実際のソフトウェア開発の現場では集まったとしても経験豊かな誰か一人だけが一方的に話をして、設計を済ましてしまうことが多いのではないでしょうか。これではチームメンバー全員の設計力がなかなか上がりません。特定の人しか設計ができないのはチームにとって問題です。CRCカードを使うと、全員の発言の機会と他のメンバーの意見が聞きやすい場が作られます。CRCカードはチーム全体の設計のスキルを底上げするツールにもなるでしょう。

ワークの最後に参加者全員に意見を聞いたときに、「他の人の考えが聞ける点が良い」「(グループで行う)CRCカードワークショップの可能性を感じた」という主旨の発言がありました。チームで設計をするツールであるCRCカードの強力さを私以外の参加者も感じておられる様子でした。

良い設計へと導く工夫がたくさんある

ワークの様子2 ワークの様子2:進め方の振り返りをしながらワークをやったので、Tryを書いた付箋が混じっています。

CRCカードを使ったモデリングは責務駆動にクラスを考えクラスの責務を明確にして設計を進めるので、同じ責務が複数のクラス散らばりにくく、凝集度の高いクラスに自然となってきます。さらに、ワークの参加者がクラスの気持ちになってロールプレイしながら設計を進めるので「忙しすぎる」クラスに気づき、責務を「委譲する」動機が生まれます。これには、たくさんの責務を1つのクラスが抱え込むことを防ぐ効果があります。

そもそも、物理的なカードには書き込める量に制限があります。書ききれなくなった時がクラス分割の機会であることが明確にわかるので、小さな責務のクラスになっていきます。

また、ユースケースが実現できるかを常に考えているので、UMLのクラス図起点で設計構造を考えたときの「振る舞い図で動作するかを確認していないクラス図を持ってきて、設計できましたと宣言する問題」が防げるなと思いました(残念ながら、私はいまだによく遭遇します)。

ワークの手が止まるハマりポイントがある

ワークをしていて、CRCカードワークショップにもハマってしまうポイントがあることがわかりました。

最終形を考えると手が止まる―ユースケースが実現できるかを少しずつ確認していくので、最初から最終形のクラスを考えることはできません。しかし、ついつい目の前のユースケースを実現する以上のことを考え、「(最終形として)正しいか?」マインドになってしまうことがありました。するとたちまち手が止まり、議論が止まり、素早くモデルを作ることができなくなりました。常にリファクタリングしていくような気持ちで臨まないとCRCカードの素早さが失われると思いました。

一番最初から正しくカードに書こうとすると手が止まる―情報カードは書き直したり、捨ててもよいと思っていても、ためらいが消えませんでした。一番最初にある程度確からしい「クラス候補」を考え出し、そしてカードに書こうと考えてしまいます。普段から書き捨てることに慣れている付箋の方がやりやすさを感じました。私個人の気持ちの問題ですが…。最初のクラス候補は、グループで思いついたことを付箋にどんどん書き出して、さっと整理した後で情報カードに書いた方が、素早くワークができると私は感じました。

まとめ

CRCカードはチームが協力して設計モデルを作れる強力なツールでした。初めて顔を合わせた即席のチームが意見を述べ合ってハイレベルの設計モデルを作ることができました。ツールの特徴を生かせばチームの設計スキルの底上げができるでしょう。

また、CRCカードを使ってモデリングをすると、凝集度の高い単一責務のクラスが導かれやすいと感じました。カードの物理的な面積を生かして、クラス分割のタイミングを明確に知ることができるのも良い点です。

CRCカードは日本ではあまり流行ることはありませんでした。役立つのにも関わらず失われてしまったテクニックです。アジャイル開発が浸透してきた今、チームが協働できるライトウェイトな設計ツールは必要だと感じています。記事中にも書きましたが、今後オブジェクトの広場でもCRCカードを説明する記事を出そうと思っています。

参考)セミナー詳細

  • 名称:UMTPモデリング技術部会主催技術セミナー
  • 主催:特定非営利活動法人 UMLモデリング推進協議会
  • 内容:CRCカード ワークショップ~賢いクラスとそれらのコラボレーションをモデリングしよう
  • 講師:オージス総研 藤井 拓
  • 日時:2018年2月7日(水)14時00分~17時30分
  • ウェブサイト:https://umtp-japan.org/event-seminar/7259
  • 場所:株式会社オージス総研 東京本社(品川インターシティA棟)12F