ソフトウェア設計のための柔軟性とスケーラビリティを考える

ソフトウェア設計のための柔軟性とスケーラビリティを考える

2019/07/15

 

 ソフトウェア設計の目的とは何か。ソフトウェアをお金を儲けるための道具=システムとして作る場合、重要な目的は柔軟性とスケーラビリティである。

 変動し続ける社会環境や、競合によるお金儲けの環境変化に対応するために、柔軟性が必要になる。現実が変わったら収益源のソフトウェアも対応しなければならない。さもなくば、競合に対する優位性が減り売り上げの低下につながる。

 そして、スケーラビリティは自社の市場を広げるために求められる。ここで私が述べているスケーラビリティには二つの側面がある。

  1. ユーザー数が増えて、システムで使うリソースを増やせるようにすること
  2. 市場の拡大に伴って巨大化したソフトウェアの開発と運用が業務として無理なく回るようにすること

巨視的なスケーラビリティ

 システムがサーバーで動いている以上、システムを動かすために物理的なリソースを必要とする。ユーザー数が増えたらサーバーを増やさなければならない。簡単にサーバーを追加できるのならば話は簡単だが、下手な設計をしているとサーバーを増やしてもシステムがスケールしなくなる。

 ここで重要なのは、サーバーが増えても律速しにくい巨視的な設計である。巨視的な設計とは、データベース、アプリケーションサーバー、オブジェクトストレージ、ログ収集機構、メール配信、バッチ処理などの大きな単位でみた部品の結合関係を整理し、あらゆる部品で処理が詰まらないように作ること。

 この設計がなぜ難しいかというと、具体的な実装の細部を無視し、抽象化された部品として整理をしているからである。部品として抽象化するさいに、部品の知識が足りないとシステムはスケールしなくなる。システム全体へ影響を及ぼす重要な特徴を抽象化によって捨ててしまうからである。抽象化は情報を捨てる特徴を持つので、知識の欠如、観点の偏りが決定的なミスにつながる。

 システムをうまく抽象化できたとしても、スケーラビリティを求めるのは終わりがない。factorioisuconで体験できるように、システムを作ると必ずどこかで律速する。律速した場所をチューニングしても、また別のところが律速する。現実的にはどこかで妥協をする必要がある。

機能の複雑化と戦うスケーラビリティ

 二番目の問題。ソフトウェアが巨大化すると言っているが、なぜ巨大化するのか。ユーザーに見せるUIはユーザーの目的に対して一直線に問題を解決するものが理想だ。シンプルに作れるならばそれが一番よい。だが、たいてい複雑化して巨大化している。なぜなのか。

 ユーザーの目的が複数あるケース、これはどうしようもない。開発し始めた当初は大雑把に認識していた目的が実は人によってバリエーションに富んだ目的だった。タスク管理ですら、ユーザーの立場や業種、知識に応じて目的が違うはずである。これがタスク管理システムが乱立する理由である。ともかく、このように大きな領域で仕事を始めると見えていなかった目的が乱立することがある。この場合にはすべての目的を需要に応じた妥協をするとはいえ、リソースの許す限りすべての需要を満たしたくなる。

 それゆえ、画面は複雑化し機能は増え続ける。市場規模、ユーザー数が拡大すると、これは避けられない。何故なら、人間は自分の目的に完璧に合致していなくても、便利な道具があればそれを使うから。システムの意図した目的と人間の目的が完璧に合致するならば、システムに変更は入らないが、少し目的のずれた場合には変更の要求が発生する。最初は心地よく使えていても、日常的に繰り返し使うことによって、この目的のずれが体験の悪さとなって現れる。なので、ユーザーを増やさなければならない資本主義の仕組みに乗る以上は、ユーザーの目的が多様化することを避けられない。よって、システムは複雑化してしまう。

 本来ならば、機能が増えすぎたらそれを整理して圧縮するのが望ましい。機能ごとに利用頻度の統計をとるのもよいだろう。だが、似たような目的を複数の機能で実現しているシステムはあまりに複雑化しすぎている。ここで、機能を統合して減らす決断が必要になる。たいていの人は機能、コード、部品を増やすことは簡単にできる。だが、減らすのは難しい。増やすことによって発生する責任は軽いが、減らすことによる責任は重い。確固たる思想を持って、このシステムの本質的な目的は何なのかを見定めておく必要がある。

 また、管理画面の機能が増え続ける問題もある。ユーザー数が増えると、サポートやお金の管理、監査、データ収集などの管理画面を使う社内の人間のための機能が増える。これらは自動化されていることが望ましい。それが会社の利益率に直結するからだ。こちらもユーザー数が増えるにつれて機能が増えて複雑化する。規模が小さいうちはラフなデータを出力して、人間が加工をすればよいが、組織の拡大とともに規模が大きくなると、専用の自動化が必要となる。

 

 以上観たように、広い意味でのスケーラビリティを完璧に満たすのは難易度の高い設計が求められる。管理機能まで含めた全体を見渡す立場の人がいれば、まだましだが、機能ごとに担当者、チームが別れていると全体の調和を目指すのは難しくなる。こうしてコミュニケーション能力が求められる。人間のコミュニケーションが増えると、それもそれで組織のスケーラビリティを阻害する要因となる。これはまた別の話ができるだろう。

 

まとめ

  • お金儲けのためのシステムは、会社が存続し続けるために柔軟性とスケーラビリティを備えたシステムを作る
  • スケーラビリティは巨視的なスケーラビリティと機能の複雑化と戦うスケーラビリティがある
  • 巨視的なスケーラビリティは開発者にとってお馴染みのシステム構成の話で、抽象化の漏れが致命的になる
  • 機能の複雑化は市場の拡大によって確実に引き起こされる
  • システムを運用するための社内の組織、システムを運用するためのシステムが増える
  • 人間がシステムを作る以上、人間と人間のスケーラビリティも視野に入る

おまけ

 つまり、システムの設計とは何なのか、何をしているのか。これはお馴染み問題解決能力と同じもので、「目的と制約を明確に認識して、目的を満たす最小コストの方法を見つける」ことである。目的は法人の場合は法人の維持、つまり利益率の維持、よってお金儲けであり、制約はソフトウェア技術、ハードウェア、人間の能力、法律などである。

 規模の拡大は外部からの要請によって求められる。投資家や株主など。資本主義は投資対象が毎年成長することを求めるシステムなため。

 柔軟性とはスケーラビリティを満たすために必要な性質なのではないか、この疑問も出てくる。おそらく正しい。柔軟性はシステムの目的でありスケーラビリティのための手段でもある。これを考えるには柔軟性も詳しく分解していく必要がある。素描しておくと、

  1. 柔軟なところと変わらないところの区別
  2. 変わりやすさを見抜く未来予知の話
  3. 未来予知に必要な広い教養の話

あたりだろうか。