私たちの身の回りの多くはソフトウェアによって制御されているものが数多くあり、そのソフトウェアの構造は年々複雑化の一途を辿っていっています。
TVにしろ、カーナビにしろ、エアコンにしろ、ゲームにしろ、Webサービスにしろ、全てがその製品があり続ける限り多機能化され、モデルチェンジやバージョンアップによって新しい処理が加わっています。
TVのリモコンを見るたびに使っていないボタンの多さに戸惑い、自分が望むものはどの操作をすれば解決するのかわからず悩みます。
自分が欲しいものはもっとシンプルなものだ!といったところで、それに反するものが世の中にあふれるのは何故なのでしょうか。
シンプルなものは満足されない
モノがあふれる時代では、あるものに特化したごくシンプルな機能というのは、それにかなりの強みやメリットが無い限りなかなか満足されません。
スマートフォンは、もはや元の携帯電話の型から逸脱していますし、単に電話ができればよいというシンプルな機能だけでは満足されません。
らくらくホンといった電話の機能だけに特化したニッチな製品もありますが、それが多数派となっていない以上、少なくとも携帯電話が通話だけの機能でよいと考えている人は少ないのでしょう。
単に自分のつぶやきを140文字で投稿するというシンプルなTwitterでも、サービス開始以降に公式のリツイート機能が実装されたり、フォロワーをグループ化できるリストや、他人の行動を確認できるアクティビティ、(誰が何のために使うんだと思う)自分のつぶやきのダウンロード機能などが加わっています。
単に地図を表示するというシンプルな機能であったGoogle MAPもストリートビューやコミュニティの機能が加えられたり、写真を投稿するシンプルなアプリであるInstagramも写真の加工機能やフィルタが多種多様に追加されていっています。
こういったソフトウェアのバージョンアップは、便利だと思うものも多くある中でそれと同じぐらいに自分には不要と思うものがあったりします。
こういった経緯の中で、自分の中でシンプルでわかりやすく取り扱いやすいものと思っていたものが、複雑でとっつきにくいものへと変貌していくのでしょう。
しかし、一方で単にシンプルだったものに飽きがきてしまうこともあります。
単純だから好きというものが単純すぎると感じられるようになったり、あとこの機能があればいいのにという欲が出てきて似たような別の製品やサービスに心変わりしてしまうのよくあることです。
今のユーザーの心理としては、無いよりはあったほうがマシ、あって邪魔なら無視すればいいだけのこと、と考える人の方が多いからかもしれません。
ソフトウェア開発に纏わる複雑化の要因
ソフトウェアを開発する上で、その最初はシンプルだった機能がどんどん複雑化する要因はどんなものがあるのでしょう。
1つは、先ほど書いたようにシンプルな機能だけでは強みが無く、例えニッチだとしても少数派を取り込み差別化を図りたいというものがあるかと思います。
要はシェアを獲得するためには多くのユーザーが必要であり、その獲得のためには広く満足してもらうための機能が必要だという観点です。
世の中、似たような製品があるわけで競争に勝つためには、他に無い機能をどんどんと取り入れていかないといけないわけで、その過程でソフトウェアは複雑化していきます。
2つ目は、下位互換によって機能が残されるというものがあったりします。
新バージョンではその機能は別のものに取って代わっているのに、旧バージョンから引き継ぐためにその機能を残さざるを得ない状況です。
いきなり無くすのはユーザーへの影響度をから乱暴だと考え、段階的に廃止するためにしばらくの間、下位互換としてその機能が継続されることはよくあったりします。
ただし、すっぱりなくなくるということの方が稀だったりもして、何時までもその機能を引き継ぎメンテナンスせざるを得ないソフトウェアも数多く存在します。
3つ目は、ステークホルダーとの関係によるものだったりします。
株主などそのサービスに投資している人がいて利益拡大のためにサービスを常に拡張しつづければならなかったり、そもそもユーザーからの声というものが機能追加の後押しとなったりします。
実はサービスや製品を複雑化しているのは私たちの意見からくるのかもしれません。
場合によっては、権威ある人からの鶴の一声で要らぬ機能が追加されるということもあるでしょう。
4つ目は、ソフトウェア開発コストの低下に伴う使い捨ての思想によるものがあります。
ソフトウェアは複雑化しても単機能としての開発コストは下がっているので、リリースして使われなければ捨てればよいという発想があったりします。
シンプルな機能で良いといっても、そのシンプルという定義は人によって異なるので、多機能なものを与えてその人に取捨選択してもらうほうが楽だったりします。
なので、数打てば当たると言わんばかりに、多くの機能をスクラップ&ビルドしていくわけですが、一度作ったものはなかなか取り下げることが難しく、スクラップするはずのものがそのまま残されていったりもします。
5つ目は、関連するソフトウェアの多さによるものです。
技術の発展により、ソフトウェアの開発コストは下がり、簡単に万能なインフラがすぐに構築できる環境であっても、そこには数多くのソフトウェアが存在しています。
例えば、仮想化の技術によってより多くのOSが1つのハードウェアの中に集約できたとしても、その上で起きたソフトウェアの問題は、アプリケーションによるものなのか、OSによるものなのか、ハイパーバイザーによるものなのか、ファームウェアによるものなのかの切り分けが非情に難しかったりします。
ソフトウェアがソフトウェアと関連するたびに、その複雑さは単純に増していくことになります。
まとめ
ということで、ソフトウェアの複雑さは単にその制御の仕組みだけでなく、ユーザーのニーズや心理であったり、サービスの強みによるものだったり、開発手法であったり、と様々な要因によって複雑化していっているのではないでしょうか。
一昔前なら、こんな機能があるなんて夢のようだといわれたものが今や付いてて当たり前という時代になってたりもします。
しかし当然ながら、それを制御するソフトウェアというものはその機能の数以上に存在しており、それらを制御するためにはかなり難易度の高い処理をしなくてはなりません。
こんな機能、誰が使うんだという感情はそれを使うユーザー以上に、それを作るエンジニア自身が持っていたりするのかもしれません。