ダグ・ローゼンバーグ インタビュー

ICONIXプロセスのダグ・ローゼンバーグのインタビューが出ていました。

ビジネス要求の急激な変化に対応する開発プロセスとは?

ちょっと、タイトルが内容をうまく表していないのがなんなんですが、
いいことを言っています。

私は、自身のキャリアの15年をコードを書くプログラマとして過ごしました。そこで、自分が要件をすべて完璧に理解するとコードはすぐに完成することを発見しました。課題は常に要件を完全に理解することであり、コーディングはルーティンと化しました。

そこにソフトウェアシステム開発における重要なジレンマがあります。そして、私はここでそれについて説明したいと思います。私は、次の声明の両方が本当であると信じています。

  1. 要件を理解せずに、私たちは詳細な設計を試みるべきではありません
  2. 何らかの設計をせずに要件を理解するのは、不可能です

要件を理解しないで、詳細な設計をしてはいけない。
でも、何かを設計しないと要件に深く入り込めない。

ICONIXプロセスの真髄でもある、ロバストネス分析を入れることで、要件に「一歩踏み込んで」要件の理解を深めていく。
みなさんは、要件を理解しないまま最後まで進んだために、とんでもないものができたり、起こったりしたことはありませんか?
私はあります。

でも、「要件の理解度が完璧」だったために、「コーディングがルーティンになる」という経験もあります。
これは、ものすごく気持ちのよいものです。ICONIXプロセスを実践することによって、こんな経験が増えていくといいですね。

Getting Real

前々からうわさには聞いていたのですが、Basecamp37Signalsが出している、「Getting Real」を読んでみました。
日本語に翻訳されているおかげで、すらすらよめます。まったく、ありがたい限りです。

Getting Realには、Basecamp37Signalsが考えている、ソフトウェア開発に関するさまざまなノウハウや考え方が記述されています。

耳の痛い内容、目からうろこの内容の宝庫なのですが、まずは、37Signalsのコンセプトでもある、

「シンプルさ」

について書いてみようと思います。

このGetting Realでは、一貫してソフトウェアを「シンプル」に作るよう書かれています。

私も彼らと同じで、インターネットサービスを保守・運用・開発している立場なのでよくわかります。

たとえば、ユーザや営業担当は「機能比較表」を本当に作りたがります。
ユーザは自分自身、正しいサービスを選んだのだと納得したい。
営業担当は、「機能的に多機能だから間違いない」とユーザに勧めたい。
だいたいそういう動機で機能比較表は作成されます。
そして、競合他社のよりもたくさんマルがつくように作成され、自社製品にバツがついている機能は、作るようにリクエストがくるものです。

ですが、一貫して「シンプル」を貫いているGetting Realにはこんなことが書いてあります。

  • 「より小さな」規模

→ムダがないほど変化しやすい

  • コードをできるだけシンプルにする

→危険を顧みずにコードを追加し続けてしまうと、気づかないうちに、恐怖の混乱(Big Ball of Mud:アンチパターンのひとつ;ス パゲッティーコード)を作り上げてしまいます。

  • 先駆者の猿真似をしない

→同じ土俵の上での優越の話をするのではなく、競合他社がまだ話をしていない、異なった視点からのアプローチが重要

  • 皆を喜ばせようとすると、誰も喜ばない

→あなたの作ったアプリケーションを本当に必要としている人は誰かを知り、彼らに喜んでもらえるように。

詳しくは、Getting Realを読んでみることをお勧めします。
「機能競争をしない」こと、「むやみやたらに作らない」ことの大事さが分かると思います。

「猿真似をしない」「皆を喜ばせようとすると、誰も喜ばない」もすごく大事なこと。
でも、実際にこういうことをする本人はそう思っていないケースがほとんどなので、タチが悪いんですけどね。

最後に、Getting Realの「はじめに」に引用されている文章です。

<コラム> すばらしいソフトウェアを作るには…

素 晴らしい文章は無駄がない。文章に不要な言葉が入らず、段落にも不要な文章が無い。同じように、図面も無駄な線を極力なくし、機械にも無駄なパーツをつけ ないものである。これにより、作り手は、詳細を全て短くし、もしくは省いて、骨組みだけの形に仕上げるのではなく、全てを伝えることができるのだ。
—From “The Elements of Style” ウィリアム ストランクJr.

肥大化はもうたくさん

古いやり方:長すぎて、官僚的で、やるべきといわれたことをこなすだけのプロセス

→ありがちな結果:肥大化して、忘れられやすく、考えなしに崩されていくソフトウェア。なんてこった。

「すばらしいソフトウェア」に対するメタファとして「すばらしい文章」を当てはめるのは、とてもいい感じだと思いませんか?
また、安易な機能追加やカスタマイズは、ソフトウェアが「肥大化して崩されていく」ことにつながるということは、是非世の中に知らせたいですね。

データベースの不吉な臭い

近頃はドメイン駆動に興味の中心があるせいか、RDBの論理設計についての話をあまり聞かなくなってきた。

では、みんなよい設計ができるようになったのか?いやいやそんなことはない。よくひどい設計に当たったりもする。

よいデータベースの論理設計って何か?という問いに対しては、「データベース・リファクタリング」の「データベースの不吉な臭い」がとても参考になる。今まで見てきたひどいデータベース設計のほとんどがこのアンチパターンに入っているように思います。

  • 複数の目的に使われるカラム
    データベースリファクタリングで挙げている例は、顧客の場合には誕生日を、従業員なら雇用開始日を格納する開始日付項目。「そんなことしないよ」と思われるかもしれませんが、経験上、この手は以外に多い。
    たとえば、テーブルにありがちなシステム管理上の「データ作成日時」を、運用上一致するからといって「申込日」といった業務上の日付として扱ったりするようなパターン。身に覚えがありませんか?(複数の目的に使われていること、わかりますか?)
  • 複数の目的に使われるテーブル
    データベースリファクタリングでは、Customerテーブルに個人と会社の両方の情報を格納している例を挙げている。これもなかなか多いパターンで、以前は本当によくありました。ひとつのフォーマットに複数のデータを混ぜたがる人がいるんです。特徴は、データの種類ごとにNULLになるカラムが決まっていることです。
  • 冗長なデータ
    データベースリファクタリングでは、他のシステムとのデータ重複を挙げています。これもよくある話で、むしろシステマティックに上手に解決しているところの方が少なそうです。
  • カラムの多すぎるテーブル
    これも多い。データベースリファクタリングでは、「凝集度が低いしるし」と書かれています。細かく切り刻みすぎなテーブル設計はあまり見ませんが、こちらの方はよく見ます。先ほど出てきた、「複数の目的に使われるテーブル」なんていうのも大抵カラムが多すぎます。
  • 行の多すぎるテーブル
    これはどちらかといえば、性能の問題です。中にどのくらいのデータが入るのか全く意識しないために想定外のデータ量が入ってきてしまうというパターンですね。設計するときに、どのくらいのデータがはいるのかぐらいはある程度想定しておこう。(せいぜい数十件レベルなのか、万単位のデータが入りそうなのかぐらいは区別できるはずです。)
  • 「スマート」カラム
    これは最近はあまり見なくなったのですが、かつてはよくありました。たとえば、固定長コードの上4桁が店舗コードで、その次2桁が分類を表し、その後4桁が連番とか。でも、汎用機をいじっていたころは、みんなこんなコード設計をしていましたね。RDBでは、こういうものはちゃんとカラムに分けて、個別に扱えるようにするのが基本です。
  • 変更の恐怖
    で、みんなビビッてます。実は当然で、以前は「DBのスキーマを変更する必要がある案件」=「工数がかかる案件」ということになっていた気がします。

いろいろと「データベースリファクタリング」から「データベースの不吉な臭い」について書いてみましたが、RDBの論理設計は、実はこれだけ気をつけて設計すれば、案外いけるのではないかなあと思っています。