ソフトウェアとは

公開: 2021年7月30日

更新: 2021年9月30日

あらまし

ソフトウェアだけに限らず、法律や飛行機、自動車などを作る場合でも、長年に渡って社会で通用し、使われる「物」を作る時に私たちがよく経験する大きな問題があります。それは、私たちが意識的に作ったりする物や、よく考えて作る「法律」のような「もの」だけでなく、私たちの社会が、自然に作り上げてゆく「ことば」のような「もの」にも起こることです。

私たち「人間」が作る社会では、言葉や法律、利用する物が、時間と共に少しずつ変わってゆく性質を持っています。日本列島で生きていた人々が使っていた言葉でも、縄文時代よりも前の人々が使っていた言葉、縄文時代の人々が使っていた言葉、弥生時代の人々が使っていた言葉、古墳時代の人々の言葉、奈良時代・平安時代の人々の言葉、鎌倉時代から戦国時代までの人々の言葉、江戸時代の人々の言葉、明治時代の人々が使っていた言葉と、私たちが今使っている日本語とは違います。

このような言葉が時間とともに、どのように変わってゆくのかを研究している人々がいます。その人たちの研究から言えることは、今、私たちが話している日本語には、古代から伝わっている言葉の部分と、中国の漢字が入ってきてからの言葉、戦国時代から江戸時代にヨーロッパの国々から入ってきた言葉、明治以後にドイツ語や英語の影響を受けた言葉など、様々な外国から持ち込まれた言葉や文化の影響を受けています。このような過程を経て、日本語も少しずつ変化してきています。

法律も、8世紀の日本で律令制度を確立したときから、武士が治める社会になり、特に、17世紀になり、江戸時代に身分制度が出来上がると、それまでとは大きく変わりました。さらに、19世紀の後半、明治時代になって、武士、農民と、町の人々との区別がなくなり、「国民」と言う言葉が使われるようになり、社会の制度が大きく変わりました。このように、社会的な制度が変わり、使う言葉も変わると、世の中の物や、私たちの生活の仕方も変わります。

明治時代になって、ヨーロッパ社会と同じ時間の制度が日本社会にも入ってくると、人々の働き方や、生活も変わりました。江戸時代までは、朝、日が昇った時から、人々は活動を始め、夕方、陽が沈むと活動を止めました。ですから、夏と冬では、人々の働く時間も違っていたわけです。しかし、明治時代になって、西洋式の時間を取り入れてからは、資本主義の原則に合わせて、一年中、同じ時間の進み方で働くように変わりました。それは、社会制度が変わり、法律も「変えざるをえなかった」ことを意味しています。

このような人間の社会から切り離すことのできない「時間にともなう変化」などの影響は、ソフトウェアにも大きな影響を与えます。特に、物ではないソフトウェアでは、物であれば時間が経つと、寿命が来て使えなくなるという「人間にはどうにもならない」性質がありますが、ソフトウェアにはそれがないため、人間社会に変化が起こるまで、一度使われるようになったソフトウェアは、使われ続ける傾向があります。そのようなソフトウェアでも、社会が変わると、今まで使われていたソフトウェアは、新しい社会の制度に合わせて、「変えなければならない」状態になります。

社会は変化する

20世紀の半ばになって、人類は考えることができる機械を作ることに成功しました。さらに、その考える機械を使って、人間のように考えることができるようなソフトウェアを作る方法も考え出しました。しかし、考える機械も、人間のように考えるソフトウェアも、私たち、人間が作り出さなければなりません。考える機械は、人間の工夫によって、どんどん小さくなり、どんどん早くなりました。今では、人間が生きている間には解くことができないくらい難しい問題も、数時間もあれば溶けるようになりました。

さらに、私たち、人類は、最近、考える機械を使って、私たちと同じように、自分で学ぶことができるソフトウェアも作り出すことに成功しています。例えば、人間が楽しみのために作り出した、囲碁や将棋ができるソフトウェアを作り出し、囲碁や将棋のプロの人々と、対戦して勝つこともできるようになっています。これらの学習能力をもったソフトウェアは、過去の将棋や囲碁の対局を読み込ませて、学ばせることで、将棋や囲碁のプロに近い実力を持たせています。機械は、人間と違って、過去の対局を読み込むだけであれば、短時間に行うことができます。つまり、人間の場合であれば、数時間を必要とする過去の対局の読み込みを、ほとんど数秒で行うことができます。

このような能力を利用すれば、将来は、人間の行動を真似して、コンピュータを設計したり、新しいソフトウェアを考えたりするソフトウェアを作り出すこともできるでしょう。ヨーロッパの哲学者の中には、「将来、人間を働かせるソフトウェアが出現する」と考える人々もいます。特に、人間の運動能力にあまり頼る必要のない活動をする場合、人間よりもソフトウェアを使う方が、間違いを起こす確率も少なくなると思われ、人間社会にとっても、その方が良いであろうと考える人々も少なくありません。例えば、タクシーの運転手よりも、タクシーを自動運転する自動車を作り出す方が、事故や問題の発生も防げると、考えられます。

物を作りだす工場でも、これまでの工場のように多くの労働者が作業するのではなく、コンピュータで制御されているロボットや、ロボットに作業の指示を出す人工知能のソフトウェアが働き、それを見守る数人の監視員しかいない、工場が出現するかもしれません。実際に、自動車を生産する工場では、ロボットを数多く使っている工場が増えてきています。さらに、電子部品を組み立てて作るスマートフォンの生産工場では、既に、大きな工場に数人の監視員がいるだけの工場もあります。

そのような工場では、完成した製品の「出来栄え」を確認したり、完成品を運ぶのもロボットの仕事になっています。生産した製品の表面に「キズ」がないかどうかなども、ロボットがカメラの目で確認して、問題を見つければ、問題のある製品を「不良品」として、はじきます。そのような、かつては、人間の作業者が目で確かめていた「検査」も、人工知能を利用したソフトウェアを使うことで、人間よりも速く、大量に行うことができます。

タクシーの自動運転では、タクシーに乗りたい客は、スマートフォンの画面で、どこから車に乗って、どこで降りるか、何人で乗るかなどを指定して、近くを走っているタクシーを選ぶと、乗車地点で待っていれば、選んだタクシーが来るので、乗り込むだけで良いのです。タクシーに乗り込むと、タクシーは、自動運転プログラムによって、最も安く、最も早く到着する道筋を選び、乗客に提示するので、問題がなければ、それを乗客が承認すれば良いだけです。自動運転なので、衝突事故などは起こらないはずです。

現在、開発されている旅客航空機は、ほとんどが自動操縦で飛ぶことができる飛行機です。飛行機の場合、それでもまだ、パイロットが乗り込んで、必要があれば、安全のために自分で操縦する場合もあります。自動操縦の場合、最も燃料を使わずに、最も早く目的地に到着でき、最も乗り心地の良い飛行ルートを探して飛ぶことができるので、乗客の評判も最も良くなるのが、普通です。パイロットが乗り込んでいるのは、それでもコンヒュータが故障したり、ソフトウェアが思ったような動きをしなかった場合にも、パイロットが飛行機の操縦を手動に切り替えて、操縦することで、乗客を無事に目的地まで届けられるからです。

自動運転のタクシーでも似たようなことは起こる可能性もあるので、無人運転だけで運行できるかどうかは分かりません。自動車の場合、飛行機と違って、自動運転と、人間による運転で、飛行機ほどの乗り心地の違いは出ないので、運転手をのせた方が良いのかどうかは、分かりません。さらに、一部の飛行機で行われているように、人間の操縦士が遠隔地から、操縦をするのと同じように、自動車を遠隔地から運転する方法も考えられるでしょう。それでも、自動車の運転手への負担は軽減されるので、タクシー料金は、現在よりも安くできるでしょう。

しかし、飛行機の自動操縦や、自動車の自動運転は、便利で善いことなのでしょうか。結論から言えば、そうとは言い切れません。初期の飛行機の自動操縦を行うソフトウェアは、大体、数百万行で書かれたプログラムのかたまりでした。そのソフトウェアは、最初の数年間は、大きな問題を起こさずに、飛行機の安全な運行を支えていました。もちろん、そのソフトウェアに間違いが残っていなかったわけではありません。最初の数年間は、そのような間違いを発見し、それを修正しながら使っていました。このような経過を見ながら、飛行機の製造企業は、より高度なソフトウェアを搭載した、新型の飛行機の開発に着手したわけです。

当初の飛行機では、従来の機械式の飛行機を、機械の複雑な部分を、コンピュータとセンサ、そして単純な機械を動かす制御装置に置き換えていました。改良型の飛行機では、コンピュータとセンサ、制御装置をうまく利用して、人間のパイロットよりも高度で、より安全な飛行制御を行おうとしました。例えば、パイロットが、誤って操縦かんを操作しても、飛行機自体が失速して、墜落しないように、操縦かんの動きを「間違い」として直接伝えず、尾翼にある昇降陀の動きに連動させないようにする「働き」の追加などです。これによって、着陸を失敗した直後に、パイロットが操縦かんを急に引いても、飛行機の機首は上を向かないため、飛行機は失速しません。

この設計が、「間違いであった」とは言いにくいのですが、後に、大問題を発生させました。その第一は、以前の飛行機とは異なる動きをするようにしたことです。バイロットにしてみれば、あまり違いがない操縦席の「見た目」から、そのような高度な働きが新型の飛行機に組み込まれたことを、すぐに理解することはできません。第二に、経験のあるパイロットにとっては、機械式の飛行機の操縦と異なる決まりで動く飛行機は、「正常な」飛行機であるとは思えないことです。特に、とっさの出来事が起こった場合、機械式の飛行機で成功していたことが、うまく働かない時、パイロットは「飛行機が故障した」と錯覚し、混乱します。

この飛行機の動きを良くする改良によって、飛行機を動かすソフトウェアの大きさは、それまでの10倍以上になりました。追加されたソフトウェアの中には、乗客がゆったりと飛行を楽しめるようにと考えられた、乗客の好みに合った音楽の再生をできるような音楽ソフトとその再生機能の改良なども含まれていました。飛行機の操縦に関係するソフトウェアも含まれていましたが、それは初期のソフトウェアと比較すれば、2倍程度でした。それでも、短期間でそれほどの規模のソフトウェアの追加は、普通では考えられないほどだったと言えます。この数百万行の追加されたプログラムにも、数千の誤りが残ったはずであると、思われます。

新しいソフトウェアを搭載した新型機が投入されて、少し経った頃、新型機で事故が発生しました。悪天候の中、飛行機は飛行場へ着陸しようとしていました。飛行機が着陸態勢に入って、飛行機の高度がかなり下がった時、飛行機は突風にあおられて、飛行機の姿勢が傾き、不安定になりました。パイロットは、この時点で着陸を諦め、「着陸のやり直し(ゴーアラウンど)」を決心して、その操作を開始しました。操縦士は、エンジンの出力を最大にしようと、スロットルを引き、機首を上に向かせるように操縦かんを引きました。この操作は、従来の機械式の飛行機では、普通の操縦方法でした。しかし、飛行機の機首は上がらず、エンジンの出力も上がりませんでした。

これは、新型の飛行機では、飛行機の安全な操縦を行うように、飛行機の安全な運行に責任を持つパイロットの仕事と、飛行機の細かな操作を行うコンピュータの仕事とを、明確に分けるようにしたことが原因でした。パイロットは、着陸の場合であれば、「着陸態勢に入ったこと」をコンピュータに宣言して、自動操縦で飛行機を着陸させるように考えられています。つまり、パイロットの仕事は、飛行機の操縦ではなく、安全で確実な航行の管理になったのです。これは、船では以前から行われていたことを、飛行機にも応用しようとしたものです。この新しい考えに基づき、パイロットが着陸のやり直しを決めた場合は、「着陸態勢に入ったこと」の宣言を「一旦、解除する」宣言を出し、「高度を上げて、元の位置に戻る」よう指示を出さなければなりません。

このような変化は、経験の豊富なパイロットにとっては、不自然で、十分な訓練が必要でした。過去の飛行機の操縦では、パイロットは、「着陸のやり直し」を管制官に通知して、エンジンのスロットルを引き、操縦かんを引いて、機首を上げます。しかし、新型の飛行機では、「着陸態勢に入った」飛行機の場合、急に操縦かんを引く操作は、パイロットの間違った判断による行為と判断され、その動作は無視され、機首を上げる動きにはつながりません。スロットルを引く操作も、同じ理由で無視されます。パイロットは、機首が上がらず、エンジンの出力も変化が出ないので、飛行機に「故障が起きたのかも知れない」と考えます。

飛行機の操縦を行うコンピュータは、飛行機がどのような気候、環境で飛行をしているのかを理解できません。ですから、パイロットが着陸陸体制に入った後、急に操縦かんを引いたり、スロットルを全開にすると、それらをパイロットの間違った操作と判断します。しかし、それを行ったパイロットにとっては、飛行機が危険な状態に入ったことは明らかで、着陸をやり直すことを決心しています。この人間とコンピュータとの間に生じた、現状理解の差が、大きな問題を発生させる原因になります。飛行機が自分の考えた通りに動きをしていないことを知った時、パイロットは、自分の「操作が正しくなかった」かも知れないと思い、もう一度、同じことをやり直します。それでも飛行機が思ったような動きの変化を起こさなければ、「飛行機が故障した」と考えるでしょう。

飛行機が自分が予想したように動かないことを知ったパイロットは、自分が操縦している飛行機が新型の飛行機であることを思いだし、「着陸態勢に入ったことの宣言」を解除しなければならないことを思い出せば、事故にはなりません。多くのパイロットは、それでもそのことには気づかずに、もう一度、同じことを繰り返すでしょう。その間にも、時間は刻々と過ぎてゆき、飛行機の高度はどんどん低くなってゆきます。そのため、着陸のやり直しを決心した時間が、少し遅ければ、飛行機は地上に激突するでしょう。パイロットが決心を早くしていれば、管制官の助言を受けたりして、着陸態勢の解除を行うことができるでしょう。

この飛行機の自動操縦や、コンピュータを活用した操縦と似たようなことは、すでに自動車でも起きています。自動車でも飛行機と同じように、数千万行のソフトウェアが自動車の制御に使われています。エンジンの制御、アクセル(スロットル)の制御、ブレーキの制御、変速ギアの制御などです。これらの操作は、以前は、全て運転者が手と足で行っていたものです。自動車は、普通の人が運転するので、操作を簡単にすることの利点は多く、この30年間で、自動車ではコンピュータの利用は著しく進んできました。ですから、ブレーキをかける操作は、昔も今も、似たような動作なのですが、タイヤの回転を止める細かな動作と、ブレーキを踏む運転者の操作は、今の自動車では、直結しているわけではありません。

運転者が踏んだブレーキ・ペダルは、タイヤのホイールの内側にあるブレーキ装置に直結されているわけではありません。ペダルの奥に付けられたセンサによって、ペダルが踏まれた量や速さの情報がコンピュータに送られます。コンピュータ上で動いているプログラムでは、そのブレーキの量と速さを計算して、最も良いと考えられるブレーキの締め具合が計算され、ブレーキ装置に伝えられます。この信号によって、ブレーキが動いているわけです。ABS式のブレーキでは、ペダルが速く強く踏まれている時、ブレーキは、強く締める動作と、ゆるめる動作を高速に繰り返します。これは、プログラムで行われています。その結果、自動車は、「急ブレーキがかけられた時、最も短い距離で止まる」ようになっています。このような仕掛けは、ブレーキだけでなく、アクセルでも行われています。

このように、コンピュータを利用することで、運転が得意ではない人でも、得意な人と同じように自動車を運転できます。しかし、それは、それらのことを行っているプログラムに間違いがないことを仮定しているから、成り立つのです。飛行機のプログラムでも自動車のプログラムでも、数百万行の規模のソフトウェアになると、現代の技術では、誤りのないソフトウェアを作ることはできません。つまり、プログラムには、間違いが残ります。その間違いは、機械式の飛行機や自動車の設計の間違いとは違って、間違いがあっても、飛行機や自動車は動きます。バイロットや運転者が思たような動きではなく、予想しなかったような動きになるのです。「ブレーキを踏んだのに、車が止まらない」と言うような問題が起こるのです。

(つづく)