読者です 読者をやめる 読者になる 読者になる

Dividing By Zero

ソフトウェアをはじめとする技術に関する備忘録と日々のメモ書き。

注意すべきプログラムの特徴

プログラミング

はじめに

 前回の記事では、コンピュータとプログラムが「なぜ」作られ、「どう」使用されるかを説明した。

na-777.hatenablog.com

  元々は人がすべき仕事、解決すべき問題を代わりに行わせる為であったが、今では様々な場面で利用されるようになった。しかし今日に至るまでプログラムの特徴というのは意外と変わらないものである。この記事ではプログラムの特徴について取り上げ、それがどのような影響を及ぼしているかについて説明したい。

プログラムの特徴

process-design-eng.com

  ハーバード大学の元教授であるShoshana Zuboffが発表した内容によると、ITの導入目的として[自動化]と[情報化]の2種類あるとされている。 (これらの内容は上記のサイトから一部引用した。こちらの記事についても参照してほしい)

現実世界の出来事を機械上で実行する

人の手を介さず、何らかの仕事を行うことができる [自動化]

f:id:na-777:20160627230912p:plain

汎用旋盤(横)|フリー写真素材・無料ダウンロード-ぱくたそ

 現実世界で行われる仕事内容をプログラム化し、それを機械の上で実行する。コンピュータが出てきた当時は学術計算などが主な自動化の内容だったが、コンピュータの処理性能、通信性能の向上、入出力手段の多様化により様々なものに応用できるようになってきた。

  • 手紙はメール、チャットツールへ
  • 財務、人事、商品管理は基幹業務システムへ
  • 百貨店や書店は楽天AmazonなどのECサイト

現実世界と比べ情報共有や整理、加工を効率的に行える [情報化]

f:id:na-777:20160626155420p:plain

無料の写真: Sd, カード, データ, ストレージ, 技術, フラッシュ - Pixabayの無料画像 - 1137506

 コンピュータに取り込まれた情報は0と1の電気信号に変換される。これらの共有、複製にかかるコストは現実世界のそれと比較できないほどに小さい。それに加え自動化の恩恵により現実世界では考えられない速度で情報の蓄積、共有、整理、さらには加工まで行えるようになった。

  • 紙の地図やメモ帳はGoogle MapやEvernoteへ 
  • 個人の感想や体験は食べログ価格.comなどの口コミサイトへ
  • ソフトウェア開発現場の経験則は、GitHub/Jenkinsなどの各種ツールへ

プログラムの注意すべき点

 さあ、ここからが本題だ。プログラムは現実世界の出来事を模倣し、それを人ではなしえない速度でそれを実行する。それが本当なら人々の仕事は年々減っていくはずだが、現実にはそうなっていない。

You can see the computer age everywhere but in the productivity statistics  -Robert Solow-

コンピュータの時代は至るところに見えるが、生産性統計には表れていない -ロバート・ソロー-

Productivity paradox - Wikipedia, the free encyclopedia

 プログラムにも問題が存在するからだ。

抽象的なものを許容できない、機械的な制約が存在する

  基本的にプログラムは曖昧な事柄を許容することはない。例えば工場で生産されるネジの不良品分別を例に考えよう。

f:id:na-777:20160816003242p:plain

ねじ - Wikipedia

 人が不良品の分別を行う場合は、良品/不良品の見本となるネジを見て、不良品の見本に近いネジを不良品として分別するはずだ。もちろん個人差があるので人によって不良品として扱う、扱わないの基準に幅があるだろう。だが細かいことを指示せずともある程度分別してくれるはずだ。

 対してプログラムの分別は正確である。プログラムが行う分別はネジの重さ、長さ、ネジ先の径の大きさなど基準となる値を使い、その基準から外れているものはどんなに正常なものに近くても必ず弾く。ただ、正確ではあるが、時には人ではしないようなミスを犯す。例えばネジの重さ、長さ、径が基準値内だったがそれでも不良品を見逃してしまった。

そのネジにはネジ山が無かったのである。

 プログラムは一から十までの指示をしっかりと行わなければならない上に機械的な制約も存在する。想定外のデータ入力などには特に弱い。数字の0に対して除算を行ってしまったときに発生する[ゼロ除算]、想定しているデータの型から外れた入力を受け取ったときに発生する[タイプエラー]などがそれだ。例外に対策をしておかなければプログラムが即座に停止する様な致命的な事態が発生する。 

現実世界の出来事を正確に把握、表現する必要がある

 プログラムは曖昧な事を許容することができず、機械的な制約があることが判明した。ただしそれ自体はそれほど問題ではない。問題は、この世の中は曖昧なことだらけであるという点だ。

itckinki.jp

 さあ、自分たちが行っている業務を思い浮かべてほしい。自分たちが行っている業務を新入社員に教える時に、マニュアルは存在するだろうか? 存在しない? では教える時はどうする? 自分の経験をもとに新人を指導するだろう。でもそれはあなたの先輩や上司も全く同じ内容を新人に教えるという確証はあるのだろうか? 例えば仕事でわからないことがあったときに都度都度上司や先輩へ報告しろという人もいれば、とりあえず自分で考えてやってみろという人もいるだろう。

 回りくどくなったが一言で言えば、みんな結構適当なのである。

 それをプログラムで自動化するのは本当に骨が折れる。すでにマニュアル化してあれば楽だが、そうでない場合は業務内容の整備、共有するために社内調整が必要である。だが、、、その過程でいろいろな問題が発生する。情報の共有不足、発言力の不均等、各々の利害から生じる政治。しっかりとしたものが出てくるまで変更や時間がかかる。

 一度しっかりとした業務手順が完成されプログラムが作成できても、人事異動、組織変更などの変化も後々発生するかもしれない。現実世界の事象が変化した場合、プログラムを変えるか、現実そのものを変える必要がある。プログラム側の制約などにより現実世界の曖昧な部分を正確にしたりすることもある。

 ここまでに述べてきた[自動化]や[情報化]は実現すれば我々の仕事を楽にし、より良い情報を提供してくれるが、それを実現するには現実側の曖昧さや、プログラム自体の制約、業務内容の変化による影響に対し、適切な対応ができる体制が必要なのである。

まとめ

  • プログラムには[自動化]と[情報化]といった特徴が存在する
  • [自動化]と[情報化]により作業を減らしたり有益な情報を得たりできる
  • しかしプログラムは曖昧さを許容できず、機械的な制約も存在する
  • 現実世界は曖昧なことが多く、時間の流れにより変化が発生する
  • これにより効果的な[自動化]、[情報化]を行うのが難しい