先日、公衆電話がうるう年を処理できなくてサービス停止というニュースが流れました。
自己診断プログラムに欠陥があり、次の診断日時を設定する際、うるう年を考慮できなかったことがきっかけで、障害が発生したのだそうです。
こういったソフトウェア──機械的・物理的なもの(ハードウェア)以外の部分──の欠陥は、日増しに増えています。
2005年には証券取引所で単純なプログラムミスで半日取引停止になっていますし、同年にウィルス対策ソフトウェアが障害を起こしてパソコンがまともに動かなくなるなどの症状を出しました。
普通に使われてるパソコンに入ってるOSと呼ばれるソフトウェアも、毎月のように欠陥を見つけては修正を配布しています。
さて、こういった問題はなぜ起こるのでしょうか?
ちょうど先日、NHKのクローズアップ現代でソフトウエア危機〜誤作動相次ぐハイテク製品〜という特集をやっていたこともあり、気になる人も多いでしょう。
今回は少し真面目に、ソフトウェア問題を考えてみようと思います。
スポンサードリンク
ソフトウェアの欠陥はなぜ無くならないのかの続き
そもそもどうしてソフトウェアには欠陥が多いのでしょうか?
それにはもちろん理由があります。
コンピュータの思考、人間の思考
まず、人間なら簡単にできることが、コンピュータには簡単にできない、ということがあります。
たとえば「1月31日の1ヶ月後」は何月何日でしょうか?
たいていの人は「2月28日」か、今年のようにうるう年であれば「2月29日」と答えるでしょう。
ですがこれをコンピュータに判断させようとするとけっこうな手間がかかります。
まず与えられた月日の「1ヵ月後」が何日になるかチェックします。日が1〜28ならそのまま月だけ1を足せばいいように思えますが、元の月が12月だった場合は13月になってしまいます。そのときは1月にして、年を1つ足さなくてはなりません。
29〜31だった場合は、月によって処理が変わります。2月ならうるう年かどうかをチェックしなくてはなりません。
うるう年は次のように定義されます。
- 4で割り切れる年はうるう年
- ただし100で割り切れる年はうるう年ではない
- ただし400で割り切れる年はうるう年
これをコンピュータにわかるようにプログラミングするには、与えられた西暦をまず400で割り切れるかどうかチェックし、次に100で割り切れるかどうかチェックし、最後に4で割り切れるかどうかをチェックします。
場合によっては西暦の下2桁しか与えられない場合もあるかもしれません。数字以外のデータが入り込む事もあるかもしれません。想定した桁数以上のデータが入り込むこともあるかもしれません。
それらを全部チェックしてはじくなり別の処理に割り振るなりしなければなりません。
うるう年であれば29日に、そうでなければ28日になるようにします。
2月以外だと、30日ある月は30日に、31日ある月は31日にするとします。
1〜7月は奇数月が31日あります。8〜12月は偶数月が31日あります。それぞれ処理をわけて、正しい日付になるようにします。
人間なら一瞬で判断できる事ですが、コンピュータにはここまで教えてやらなくては正しく動いてくれません。
ですから「1ヶ月後に再実行」とか「毎月月末に実行」という仕様を作るよりは、「毎月15日に実行」などのような仕様のほうがシンプルでコストが安く作れるわけです。
しかし人間にはなかなかそのようなコンピュータの都合は理解できませんので、お客さんやあまりプログラミングに詳しくない偉い人が「1ヶ月後に再実行」などという仕様を作り、エンジニアに押しつけてしまいます。
もちろんそれが必要なら手間をかけてでも作るわけですが、本当にそれが必要なのかという場面が意外に多いのです。
エンジニアではない人間にはそんなコンピュータの都合はわかりませんから、ついつい人間に命令するのと同じ調子でそのようなコンピュータに都合の悪い仕様を作ってしまうわけです。
もちろんこれはひとつのわかりやすい例です。実際には「1ヶ月後」の判定程度はすぐ作れるプログラマが大半でしょう。
こういった事例で有名なのが、2002年に制定された迷惑メール防止法です。
この法律はインターネットやコンピュータに詳しい人間なら、すぐに「意味が無い」とわかるものでした。実際その後迷惑メールは増える一方で、まったく効果をあげてません。
法律に示されてるように「未承諾広告※」と表示させるにも様々な手段があり、使用してるソフトによって対応がまちまちで、表示されないにしても「表示させるつもりだった」と開き直る事が可能としか思えませんでした。
また「受信拒否をした者への再送信は禁止」という項目も無意味で、拒否通知を出した段階で「生きてる」メールアドレスだと迷惑メール送信者に知らせる事になりますし、そういった「生きてる」メールアドレスのリストは個人情報同様に業者間で高く売買されているわけです。
どう考えても専門家抜きで作られた法律としか思えませんでした。
もちろん「人間様がコンピュータに合わせろなんておこがましい」と考える人も多いでしょうし、実際エンジニアも多くはそう考えています。
ですが、だからこそ複雑なものを作りがちな結果になるのだということは、覚えていた方がいいかと思います。
ソフトウェアに完成は無い
通常、工業製品というのは1度完成したらそれで終りです。あとはひたすら生産するだけです。
ですが、ソフトウェアに完成という文字はありません。
どこまで行っても「これで終り」「これで完成」と言える段階には行けません。
それはどうしてかというと、ひとつの理由には「ソフトウェアは完成形が見えない」というのがあるからです。
工業製品は図面ができる前にイメージイラストなども描きますし、それにそって図面ができ上がった段階で、もう完成形が見えています。
ソフトウェアは「機械的・物理的なものではない」ために、「手にとって見る」ことすらできない。だから完成形がいつまでたっても見えないのです。言い換えれば「やってみなくてはわからない部分が多い」ということです。
もちろん、いつまでたっても完成形が見えないのに、最初から完成形を想定することなど不可能です。
しかしそれでは見積りができません。何をどこまで作ったら完成なのかわからなくては、納品もできません。
ですから仕事上ではどうしても最初になかば無理矢理にでも完成形を提示しなくてはなりません。これもある程度の規模ならば不可能とまでは言えないため、それをあたりまえに考えてる人もいらっしゃると思います。
しかしやはり目に見えないものですから、見積りも難しく、どうしても納期に間に合わない事も出てきます。設計をやりなおす必要が出てくることもあります。
また、ソフトウェア業者はソフトウェアの専門家であって、お客さんの仕事に関しては素人であることがほとんどです。だからお客さんにとっては常識でも、開発者はまったく想定してない事が後から発覚するなんてこともあります。
こうした事が要因で、どうしてもソフトウェア開発は遅れがちになります。
さきほど書いた「1ヶ月後の判定」を、実際にちょっとJavaScriptで作ってみました。
年月日のヵ月後は?
実はこれ、入力値のチェックをちゃんとしてません。めんどくさかったというのもあるのですが、エラーになる状況を見てもらった方がいいのではないかと思ったのでそのままにしています。
ありえない数値や、文字などを入れてみてください。おかしな表示になると思います。
ちょっとしたチェック抜けで、こういうおかしな表示になったり、それが遠因となって誤動作を起こしたりするのがソフトウェアです。
もちろん、ここにあるのはJavaScriptというお手軽言語ですから、重大な誤動作を起こしたりはしません。したとしたらブラウザ側の欠陥でしょう。
しかし仕事で作るようなプログラムでは、そのような誤動作も起こり得るわけです。
また、作ってしばらくたつと不満が出てきたり状況が変わったりして改造しなくてはならなくなることもしばしばです。そういったところからもバグは生まれていきます。
ですからソフトウェアに完成は無いのです。
ソフトウェア業界の罠
冒頭で紹介した「クローズアップ現代」では、ソフトウェア技術者が足りないということを言っていました。また、過酷な業務でうつ病を発症する人も多く、現場を退いてしまうこともよくあるようです。
実際、月の残業が150時間を越える人も、この業界では珍しくないようです。
そういった過酷なソフトウェア業界の事情をネットで語ってくれてる人もいます。
かつてはどれだけ厳しかろうとも「コンピュータが好き」な人たちが続々やってきた夢のある産業だったソフトウェア業界ですが、こうした内情が明らかにされるにしたがい、徐々に希望者も減っているようです。
またこうした人手不足からか、きちんと計算機科学を学んでないエンジニアも多く存在しています。
まだ新しい分野ということもあるのか、独学でもそれなりの適性があればけっこう通用してしまうんですね。
むしろそういった人たちのほうが生産性が高いということすらあります。
しかし基礎が無いため、妙なところでハマってしまったり、基本的な部分が抜けていたりすることもあるようです(これは自分でもよくあります……)。
もちろん上にあげたような過酷な企業ばかりではありません。きちんとやってるところはやってますし、そういう企業のエンジニアはまさに水を得た魚のように楽しそうに仕事をしています。
好きなことをしてるんですから、当然ですよね。
しかし中には仕事を取れず、月いくらで自社のエンジニアを派遣している企業も少なくありません。自分たちで仕事を取るより、その方が儲かるからです。
これでは社内に技術が残りませんし、チームワークも生まれにくい。
けれども経営のためには……
肥大化するソフトウェア
ソフトウェアは日々巨大化しています。「クローズアップ現代」で取り上げられていた昨年10月の自動改札機のトラブルで使用されてたソフトウェアは、実に80万行以上にものぼるそうです。
トラブルの原因は、そのうちのたった1行に存在したミスでした。
この事例がそうだとも限りませんが、残業150時間を越えるような労働環境で睡眠不足と戦いながら納期に間に合わせるために必死に開発をしていれば、80万分の1のミスくらい起こり得るのではないでしょうか。
もちろんそういったミスを逐次発見し修正するための開発手法はいろいろと考案されていますが、まだ若い業界だということもあって普及してるとは言いがたいのが現状です。
また、人手不足の中で巨大化する一方のソフトウェアを開発するには、どうしても社内だけでは足りません。下請けに一部を発注し、またその下請けに発注するといった多重請負なども問題化しています(参考記事)。
下請けの下請けのさらに下請けなんていうところもあるそうです。こういったところではそもそもマージンが抜かれすぎて利益があがりにくいですし、元々の発注者も目が届きにくくなってしまいます。
こういった肥大化の原因は、コンピュータの性能があがってできることが増えすぎたのがひとつの理由でしょう。
昔のコンピュータはそもそもが規模も小さく、できることも少なかったため、作らなければならないものがそう多くは無かったはずです。
今のコンピュータは絵も出れば音も出る。3次元グラフィックは携帯電話でもできるようになりました。
そして多機能。今や誰もがもつコンピュータとなった携帯電話には、実に様々な機能が詰め込まれています。これだけの機能をソフトウェアで実現しているのですから、とうぜんその量はとんでもなく多い。パソコンは言わずもがな。
そしてこの高性能なコンピュータを生かす多種多様なサービスや機能で、企業は競争しなくてはなりません。どうしてもやるべきことが大量に増えていきます。
高性能化が肥大化をもたらしたといってもいいのではないでしょうか。
日本のソフトウェア業界に夜明けは来るか?
以上のようなことから、ソフトウェアはどうしても複雑になりがちで、規模も大きくなっています。
こうした状況の中、日本のソフトウェア業界はかなり体力を削られているようです。
ちょうどソフトウェアの重要度が大きくなった90年代にバブル崩壊で研究開発に予算が出なくなった時代の影響もあるのかもしれません。
正直に言えば、日本のソフトウェア業界は品質においてアメリカやヨーロッパに勝てず、安さにおいてアジア諸国に勝てないという状況です。
しかしソフトウェアの重要度は日増しに高くなっています。
「クローズアップ現代」で取り上げられたように、そのソフトウェアの欠陥が私たちの生活に影響を及ぼす事も、もはや珍しくなくなってしまいました。
このままでは国内のソフトウェアのほとんどが海外製になってしまう可能性すらあるかもしれません。実際にパソコン用のOSに国産品はほとんど使われていませんし、携帯電話の基本ソフトウェアも日本製は徐々に使われなくなっています。
しかしながら、「クローズアップ現代」に出演されていた電気通信大学の西康晴教授は最後のほうでこんなことを言っていました。
ソフトウェア開発は人間しか資源が要りません。そして環境も汚しません。非常に日本にとっては最適な産業なんです。ですから我々日本はソフトウェア立国になっていかなくてはなりませんが、VTRでごらんになったように、技術者は疲れ果てて、欠陥が多く、なかなか非常に難しい産業になってきています。
確かに巨大で複雑なソフトウェアを作るのは難しいです。難しいんですが、その難しいソフトウェア開発で高信頼性のものを作ることを可能にするからこそ、他の国には追いつけないアドバンテージが得られるわけです。
日本がそういう技術立国になって他の国をリードしていくためには、まず技術者が疲れ果てないような、技術者が笑顔で誇りを持って働けるような産業にしなきゃいけませんし、複雑さに負けない技術力を育てるために、日々改善を続けて行かなくてはいけません。ハードウェアの企業は日々改善を続けることによってで強くなりました。ソフトウェアもそのように強くならなくてはいけません。
実際のところ、そのような改善の手段としてよく言われているXPなどのアジャイル開発、TDDといった概念は、どれも海外から入って来たものばかりです。
ハードウェアの製品開発では他国を押し切って世界トップクラスの改善を見せ付けていた日本が、なぜかソフトウェア開発では改善手段のアイデアすら出てこない。
これはもう業界の構造に問題があるとしか思えません。
しかし、西康晴教授の言うとおり、ソフトウェアは日本にとって最大の武器になりえる存在です。
日本の経済大国としての地位を取り戻すためにも、この世界でなんとしても勝たなくてはなりません。
そのためにNHKでは「産官学の連携」と「人手不足の解消」を強調していましたが、それだけではないでしょう。
これまで説明して来たような、必要の無い複雑さや、意味の無い仕様を解消するだけでもまったく違って来るでしょう。産官学のどれだけがんばり、どれだけの人員を投入したところで、こういったことが解決されなければ無駄なコストはかかり続けるでしょう。
そのためには「技術者が何を作るか」を決める人たちに、それなりのコンピュータの知識が必要になります。
先述の「未承諾広告※」のような意味の無い仕様や、コンピュータに都合の悪い仕様をエンジニアに押し付けるようなやり方がある限り、日本のソフトウェア立国は夢のまた夢でしょう。
オーム社()
ソフトウェア開発の根底にある考え方
組織(社会)に参加し、仕事に取り掛かる前に読むべき本
実用書の前に読むべき本
関連記事
トラックバックURL