MENU
ここでは今後プログラムを作っていく上では、特に意識しなくなるけれど、初めてコンピュータプログラムを作る人が陥りがちなことをまとめておきます。(厳密な話ではなく相当誇張して書いているので、余り突っ込まないでいただきたい。)

全てはアルゴリズム

まず、プログラムを組んでいる時は、意識するしないは別として、いつもアルゴリズムを言語化する作業をしていると言うこと。

プログラムを作るうえで、アルゴリズムなんか関係ないと言うことを言う方がいます。確かに狭義のプログラミングは、すでに出来ている仕様書に基づいて、プログラム言語で書くだけなので、極論するとアルゴリズムは不要という人がいることも分かります。

ただ、このサイトで対象にするのは、組織でシステムを組むのではなく、一人でシステムをくみ上げようと考えている人です。そういう人にとっては、プログラムを作る際もアルゴリズムを念頭に置いておく必要があります。アルゴリズムとプログラムが関係ないと言うことは全くありません。

実現する機能を途中でアルゴリズムを考えるステップを省いて、いきなり、プログラムを組もうとしても、普通は途中で破綻します。また、あらかじめ仕様を作っても、実際にプログラムを作る際にアルゴリズムの誤りに気付いた方が、後々の手戻りが少なくなります。

基本的にシステムを作り上げると言うことは、機能を実現するアルゴリズムを考えて、そのアルゴリズムをコンピュータ言語で書き表すことです。

また、コンピュータの教科書や情報処理試験などで出てくる、ソートやマージだけがアルゴリズムではありません。ある意味、すべてがアルゴリズムにかかわります。(配色とか画面上の位置と言った純粋にデザインという部分もありますが。)

ネットなどでは、情報処理試験などで、アルゴリズム問題が出来なくても合格したという人がいます。

別に、試験に合格するかしないかと、実際にプログラムを組んでシステムを構築するのとでは、違うのは当たり前です。

試験は、何割取れば合格という性格です。基本的に、満天は取らなくても良い。しかもその合格のラインが6割とか7割程度だったりします。

システムも、基本的に満点と言うことは無いでしょう。どうしてもテストできていない部分や、そもそもの想定で機能が抜けているケースもあります。しかし、(あくまでも個人の感覚ですが)事前に想定している普段良く使う機能の部分は100%出来ていないと、本番ではリリースしないでしょう。

もちろんまれに発生するケースでの検討が漏れていて、その部分が機能から抜けていたとか、機能はあったけれども、アルゴリズムが間違えていたとか、もしくは、アルゴリズムも正しかったけれど、プログラムが間違えていてテストが出来ていなかったとかいうことはあると思います。しかし、普段よく使われる部分で機能が漏れていれば、少なくてもユーザーがテストした段階で普通は必ず発覚します。本来なら、仕様作成の段階でユーザーが発見すべきですが、そこでは見落とされる可能性もあるかもしれません。普段使われる部分で、機能はあっても、ユーザーがテストしてみたら上手く動かないという場合は、一度でも動かせば、こんなこと分かるだろう。開発はテストしていないんじゃないかと怒号が発せられ、開発側の信頼性がなくなり、すべてのテストをやり直す羽目になることもあるかもしれません。

いわゆる製品で、そういうことが発生すると、会社は倒産してしまうかもしれません。

何を書きたいのかというと、試験に合格するためにはアルゴリズム問題が出来なくても良いかもしれませんが、個人でシステムを作りたいならば、情報処理試験のアルゴリズム問題位は出来るくらいに勉強しておきましょう。(試験では時間が制限されていますが、自分でシステムを作る方は、時間制限は気にしないでも大丈夫でしょう。)

入出力はプログラミング言語の範疇で考えない方が良い

プログラムを作ってブログに記事を自動で投稿すると言うことを考えた場合、記事を何らかの形で、例えば事前に文章をテキストファイルに作成しておいてシステムに取り込ん(入力)で、ブログに書き込む(出力)必要があります。

ここではテキストファイルって何ということは説明しないので、分からない人は、Googleで検索してみてください。(とりあえず文書を保存しておくものだと思っておいてください。)

ここで何を書きたいのかというと、幾らコンピュータ言語の勉強をしても、ファイルから文章を読み込むとか、ブログに文章を書きこむという機能はプログラム言語には出てきません。

キーボードから1行入力するとか、画面に文章を出力するいう機能がコンピュータ言語の仕様として定義されている場合もありますが、実際のシステム構築ではまず使いません。

コンピュータのシステムと外部とのやり取り(インタフェース)は、コンピュータ言語ではなく、別途入出力のためのライブラリ(ライブラリとは図書館とか書庫ですが、コンピュータの世界では、プログラムやプログラムの部品の集まりをライブラリと呼んでいます。)として提供されます。そして、そのライブラリの使い方を勉強する必要があります。そして、こう言ったライブラリの使い方を理解するためには、プログラムだけでなく、広く一般的な情報処理の知識が必要です。

俺はプログラムが書ければ良いのに情報処理ってなんだと思う人もいるかもしれません。例えばWindowsで”使える”プログラムを作るためには、(総称して)情報処理(という様々な分野)についてを勉強する必要があるんです。

このサイトはプログラム講座ではなく、情報処理講座にしているのは、そういう理由です。

逆に大学の工学部の実験などのデータを取りまとめる為に、コンピュータを使いたいだけであれば、実験データを保存する方法と画面に表示する方法が分かれば、後の計算その他アルゴリズムにかかわる部分は自分の専門そのものに近いでしょうから、実は余り悩まないでコンピュータが使えるようになるかもしれません。

そして、データを表示する方法も、余りこらなければ、比較的簡単です。コンピュータ言語の範疇ではないと書きましたが、Pythonなどは、余りライブラリを意識することなくデータを簡単に入出力できるので、工学系の人がコンピュータを使いたい場合は、Pythonの勉強をお勧めします。

また、Webサーバー上で稼働するWebサービスなどを実現したいという場合は、プログラムだけでなくWebサーバーの知識なども必要になります。最近はC#でも比較的簡単にサーバー側で稼働するシステムを作れる様になっていますが、以前はC#で作る場合は、WebサーバーとしてWindowsサーバーやWebサーバーとしてIISが必要だったり、いろいろと成約がありました。そのため自社内でサーバーを立てて社員に使ってもらうシステムであれば良いのですが、不特定多数の人に使ってもらうには、Linuxなどの安いサーバーを使って、Apache上で動かしたいという要望がありました。

そこで、使われたのがjavaです。ただ、じゃヴぁも環境構築が必要なので、安価なレンタルサーバーではPHPによるシステムが使われるようになりました。

WordPressなどのブログシステムなどもPHPで作成されています。

また、Webサーバーではなく、ブラウザでサイトを読み込んで、クライアント側で処理する仕組みも考案されて、そのためにjavascriptなどが使われるようになりました。

javaにしても、PHPにしても、またjavascriptにしても、扱うのがWebなのでHTMLの知識が必要になります。

さらに、Webの世界では、デザインはCSSで指定する流れになり、CSSの勉強も必要です。

その上で、上記の言語でもWebにおけるデータのやり取りは、言語の仕様の範疇ではなく、Webとのインタフェースを行うライブラリで提供され、ライブラリの使い方を学ぶ必要があります。


そこで、結論は、外部との入出力はコンピュータ言語の範疇ではないと言うことです。

機能を実現するアルゴリズムは一つではない

良く考え違いをする方がいますが、

ある機能を実現するアルゴリズムは一つとは限らない

ということを常に念頭に置いておいてください。

どういうことかというと、下記を考えてみてください。

【問題】
1から順番にNまでの自然数を足した時の和Sを計算する


【アルゴリズム1】
1+2+3+4+5...と順番に足していけば良い。

一つ前までの和をSBとすると
N=1ならSBは0、Sは1
N=2ならSBは1、Sは1+2(だからSはSB+N)で3
N=3ならSBは3、Sは1+2+3(だからSB+N)で6
...

つまり
N=1の時はSは1
Nが1より大きい時は、SはN-1までの和SB+N

プログラム言語的に表現すると

N=与えられた数
(もしくは INPUT N  Nをキーボードから入力する)
S=0
for i=1 to N
S = S + i
next i

【アルゴリズム2】
1からNまでの和をSとすると初期値1、交差1の等差数列からなる等差級数だから和の公式から

S=N×(N+1)/2

上は、順番に1つずつ足していく方法。下は、数学の公式を使ったアルゴリズムです。
どちらも同じ結果になります。

ここからは雑談です。

皆さん、高校の時に数学的帰納法という考え方を学んだと思います。アルゴリズム1はまさに数学的帰納法を適用した考え方です。

でも、皆さん、高校で数学的帰納法を学んだ時、理解できていましたか?

コンピュータの世界では繰り返しが良く出てきます。繰り返しに慣れてくると、なんでも繰り返しで表現する人が出てきますが、上野解答、あなたにはどちらが理解し易いですか?

え、数学的帰納法も嫌だったけど、等差数列の和も理解できなかった?

う〜ん、日本では数学なんか役に立たないと言う風潮がありますが、システムを組む場合は必ず何らかの形で数学が必要になります。コンピュータに数学なんていらない、アルゴリズムなんて関係ないという風潮が現代日本の病気かもしれません。

じゃあ、どういうアルゴリズムを選ぶのかと言えば、時代によって若干違っています。昔も今も変わらないのは、計算の量が少なくて済む効率の良いアルゴリズムです。

ただ、効率の良いアルゴリズムは、理解しにくいばあいもあります。そこえd、ここでは、分かりやすいアルゴリズムを考えることを推奨します。

ただ、分かろやすいと言うのは、誰でも理解できて実践可能な客観的な指標が定義されているわけではありません。人によって判断が分かれる場合もあります。

一般的かどうかは別として、どうやるかを表すのではなく、何をするのかを表現できる様にアルゴリズムを表現すると良いかなと考えます。(ちょっとこの記述はあいまいなのでもう少しましな表現を考えたいと思います。)

コンピュータでアルゴリズムを書くのも一つじゃない

ここまで同じ機能を実現するアルゴリズムは一つではないと書きましたが、実は、更に一つのアルゴリズムを考えた時に、そのアルゴリズムをコンピュータ言語で記述する方法も1種類ではなく、幾つも書き方があります。

具体的な例は、後でお見せしますが、一つのアルゴリズムに対して色々な書き方があると言うことを伝えておきたいと思います。

なので、組織で作るシステム場合は、プログラムを作る人がメンテナンスをする訳ではなく、またプログラマーのレベルも様々な人が集まっているので、人によって色々な表現で作られてしまうとトラブルのもとになったりします。そこでこういう場合はこういう風にプログラムを書く様にとなるべくルールを統一して、他の人がメンテナンスする場合も混乱しない様にしようと努力しています。(なかなかうまくいってませんが)
このページの先頭へ