プログラマーズページ
初心者のためのプログラミング手引き


 世の中にプログラミング手引書は数々ありますが、こう言っては何ですが、そのほとんどは、初心者には使い物になりません。
 その最大の理由は、著者のほとんどがプログラマであり、文筆家ではないからです。
 つまり、「何かを他人に解り易く説明する」のが「非っ常に下っ手クソ」な輩が、そういう本を書いているからです。
 プログラミングは、論理的数学的思考を要求します。つまり、「1+1=2」という、与えた条件からは必ず一つしか答が出ない環境で、全てを作り上げなければなりません。
 そんな人種に「1+1=田」とか「1+1=1」とか、ヒネった答や哲学的なものを求めたところで、期待された返答が返る可能性は極小であると考えるのが、まあ妥当なところでしょう。常日頃から解りやすい文章を書くことを心がけている専業文筆業とか趣味で解りやすい文章を研究している方々ならともかく、プログラマーの書く文章は、それらどころか大抵は平均以下の文章しか書けません
 少なくとも、万人に理解できる手引書を書け、といわれても、ドキュメントすら満足に書けないプログラマの増えた昨今、そこまで要求を満たせる人間は非常に少ないものです。

 なので、ここではそういった「プログラミングどシロウト」でも理解できるようなドキュメントを求めて、個人的に作成した手引きです。
 かつてドシロウトであり文系人間である私が、何が解らなくて困惑していたか、理系人間には到底理解できないことでしょうが、だからこそ素人に解り易いドキュメントが出来るのではないか、と逆に考えているのです。

 もし、これを読んでも解らない、という方がいれば、どこが理解不能であるか、メールなり掲示板でお尋ねください。できる限りの返答をさせいただきます。
 もしそれでも全くダメな場合は……おそらく、あなたは生まれながらにデジタルなものや数学と相性が悪い星の下に生まれついてしまったのでしょう(苦笑)。どうしても感情・感覚を排した論理的思考が出来ない方には、プログラミングは向きません。諦めて、コンピュータとは出来るだけ関わらない方向を目指すことをお勧めします。
 いや、ただ私の説明が悪いだけ、という話もありますがね(^^;

 では、これであなたの選択肢が、また一つ増えることを願って。


目次

1.プログラムって何?
2.プログラミング言語
3.こんなことができる・できない
4.ツール
5.共通概念・仕様
6.どないしたらええねんな!
7.ネットワークとスタンドアロン
8.用途に応じて
9.最後に
10.追補:プログラミング環境の現在(2008年版)


1.プログラムって何?

 「プログラムって何?」ときたら、こう答えましょう。
 「コンピュータに対する命令の塊です」。

 つまりプログラムとは、コンピュータに対してあれをしろこれをしろ、といちいち事細かに書かれた命令書のことです。
 もちろんコンピュータは人間ではないので、人間の言葉で命令しても全く反応しません。
 そこで、「機械語(マシン語)」という命令言語を使用して、プログラムを作るのです。
 このマシン語の端的な例が、パンチテープです。ほら、30年以上前の古い映画のコンピュータ、あれが吐き出す、穴のあいた紙テープ。あれ、実はマシン語なんです。もっとも、実際の業務で使われたのはパンチ「カード」でしたけどね。
 だからって、あれを読んで「ふむふむ……何っ!?」みたいに、技術者でもない現場の人間が驚けるって、ありえねー話ですよ。あれで解る文字、数字とアルファベットだけですから。まぁフィクションですからいいんですけどね。
 もっとも、現在のプログラミングは、マシン語を直接並べるのではなく、人間の使用する自然言語に近づけた「高級言語」(とはいえ、今のレベルで高級とか言えたものじゃないですが。本当は「高レベル言語」と訳すのが正しいようです)でプログラムを書いて、それを「コンパイラ」とか「トランスレイタ」とか名づけられたマシン語翻訳ソフト(いわゆる開発ツール)を通して、最終的な完成したプログラムにするわけです。

 こう書くと簡単そうに見えるのですが、その実、これを完成させるのはとてつもない苦労を要します。どのくらいの苦労かというのは、未経験者でも耳にしたことはあると思いますが、「人間の仕事ではない」「究極の頭脳&肉体労働」という風評に相応しい内容になっています。
 特にこの業界の労働環境は、労働監査が入れば一発で引っかかるといわれていますが、それくらいしなければまともに完成しないのが、プログラムというものです。
 もっとも、これは商売が絡んだ場合の話で、そうでなければ個人のペースでゆっくりやればいいだけのことです。

 蛇足ですが、何でコンピュータの発達がアメリカで真っ先に進んだのか。
 それは、連中の契約書を見ればすぐに解ります。
 彼らの交わす契約については、詳細に、重箱の隅をつつくような事柄までいちいち記載してあります。つまり、ありとあらゆる想定された事態に契約で対応できるよう、何でもかんでもそこに書き記してあるわけです。
 なんでか、はわかりますよね? あの訴訟社会のこと、契約書に載ってないことで訴訟になるのはイヤですからね。全部予め承知の上で契約をするわけです。
 そんなお国柄なもんですから、コンピュータみたいな命令しないことは一切やらない機械に対する命令を考えるのは、得意分野だったのかもしれません。

 それでは、どうやってそのプログラムをどうやって造るのか、詳細をみていきましょう。


▲ 先頭へ戻る ▲

2.プログラミング言語

 プログラムを始める前に、言語を選ばなければなりません。
 「日本語じゃダメ?」
 ダメです。ちなみに、英語でもドイツ語でも中国語でもフランス語でもロシア語でもダメです。
 でもまあ、アメリカで急成長したものですので、英語が元になっていますので、英語が解ると文法の理解も少しは早くなるし、英語のドキュメントも読めてより一層理解が深まるかとは思いますが。

 プログラミング言語は、目的に応じたものが多数存在します。
 パソコンでの有名どころでは、C(シー)、C++(シープラスプラス)、VisualBasic(ビジュアルベーシック、VB)、Delphi(←商品名、言語名はパスカル/Pascal)、Java(ジャバ) ぐらいでしょうか。最近は.NET(ドット・ネット)対応のVB.NETやC#(シー・シャープ)といった言語も登場していますが、これらはまだ一般的ではありません。
 COBOL(コボル)やFORTLAN(フォートラン) という言語も業界では有名には違いないですが、これは基本的に「汎用機」という大型業務用コンピュータの言語なので、パソコン上ではあまり扱いません(扱えるようになった発展型もありますが、あまり使われません)。
 また、インターネット上で使われる言語のPerl(パール)やJavaScript(ジャバ・スクリプト、正式にはECMA-Script)、またはゲーム用に作られたHSP(Hot Soup Proccesser)、Nscriptorという「スクリプト言語」もあります(これを分けたのは、その使い方が上の言語とは違うからです)。  Windows上ならVBScriptという、VBのサブセット言語もあります。
 その他、AI(人工知能)用のLisp(リスプ)とかProlog(プロローグ)とかAda(エイダ)とか、perlの発展型スクリプト言語であるRubyやらPHPやら、数え上げれば切りがないほどプログラミング言語は存在します。
 でもまあ、現在広く業務で使われているのは、上に書いた言語がほとんどでしょう。

 ちなみに……これらはほとんど「高レベル言語」ですが、これよりマシン語に近い「アセンブリ言語(アセンブラ)」という「低レベル言語」もあります。
 これはよりダイレクトな命令を吐き出すため、より高速ですし無駄も極力省けますが、これで巨大なアプリケーションを製作するのは無謀で、実際はごく一部の速度が必要とされるシステムの根幹部分だけがこれで作られます。
 また、アセンブリ言語はCPU(Central Processing Unit、中央演算装置)固有の命令をもっていて、CPUごとに言語も違うので、汎用性はありません。インテル系(86系、AMDのもこれ)CPUにはインテル系の、モトローラ系(68系・PowerPC)にも専用の、SunMicroSystemsのSPARCとかのサーバ向けRISCチップにも専用のアセンブリ言語があります。

 では、何を選んだらいいのでしょうか?
 言語が目的に応じて存在するのですから、こちらも使途に応じた言語を選択せねばなりません。

(1) ゲームを創ろう。
 これなら、何を使っても完成はします。ただし、出来るゲーム・出来ないゲームはあります。JavaとJavaScriptは、基本的にファイルの書き込みが出来ません(Javaは環境を整えておけば可能になりますが、それは後ほど)。ですので、セーブファイルの書き込みをするようなタイプのゲーム(RPGやアドベンチャーなど)には向きません。
 ゲーム業界で標準の言語といえばC++ですが、はっきり言って、初心者には無理です。使いこなせません。
 ゲームは、内部での計算や画像表示など、多種多様なイベントの集合です。ですから、高速であることは何にでも必要ではありますが、シューティングなど、とっさの判断を必要とするのでなければ、多少遅いスクリプト言語を使っても、十分実用には耐えます。
 ただし、何を作るにしても、相当ハイレベルな技術が要求されますので、本片手に……というわけにはいきません。

 ・すぐ終了する簡単なゲームならJavaScriptを、セーブが必要な手の込んだゲームならVBやC++、速度を要求しないのならHSPあたりがいいでしょう。
 NscriptorはHSPと似ていますが、シューティングやアクション向きではありません。アドベンチャー系紙芝居やRPG、シミュレーション、テーブルゲームの類ならこれの方が簡単でしょう。

(2) フリーソフトを創ろう(ビジュアル系)。
 画像表示は、何につけマシンパワーを要求します。
 特に、自分の環境だけでなく、最低限の環境で動くことを考えれば、少しでも速い言語を使うのが一番です。
 最近の言語は、特定の機能(ファイル読み出しや保存、印刷、ウインドウ表示など)がカプセル化されてすでに入ってますし、表示だけならこれらのテンプレート機能の組み合わせだけで実現できないこともないでしょう。
 ただしこの系統は、少し手の込んだものを作ろうと思うと、途端に難易度がハネ上がります。
 画像形式などにも通じておく必要があり、元々難易度は高いほうです。

 ・C/C++、Pascalが一番、続いてVB。

(3) フリーソフトを創ろう(システムをいじくる系)。
 迷うことなくC/C++、もしくはPascal。VBでも可能ですが、機能が限定される場合があります。また、機能によってはアセンブリ言語も必要になる場合があるでしょう。
 OSシステムへ自由にアクセスするのは、これらの言語がもっとも得意とする分野です。ただし、使う側にもっとも知識を要求する言語でありジャンルです。
 1年や2年でこれをバリバリ造る、なんてのは、かなり才能や素養のある人物で、相当な努力もなければ無理です。

(4) フリーソフトを創ろう(テキスト系)。
 テキストのみを扱うなら、VBが一番手ごろです。
 画面表示もウインドウがパラパラッと出るだけなら、これで十分です。
 HSPで作ってもいいでしょうが、VBの統合開発ツールは慣れれば、ちょっとしたツールなら簡単に実現できます。

(5) インターネットで動くやつ。
 迷うことはありません。てゆーか、選択の余地がありません。
 どんな環境でも動作するインターネットプログラミング言語は、JavaかJavaScriptしかありません。もしあなたがサーバを自由に扱うことができる立場にいるのであれば、PerlやC/C++、RubyやPHPを使ってもいいでしょう(これらはサーバ上で動作します)。Windowsサーバなら、VB Scriptという手もありますが、UNIX系サーバでは動かない場合がほとんどですので、あまりお勧めはしません。
 ただし、迂闊なプログラムを作ってサーバを停止させたりすると、最悪プロバイダへの賠償問題に発展する危険性を含んでいることを忘れないでください。
 てゆーか、サーバ扱えるぐらいならこんなもの読まなくていいです(笑)。

(7) なんか。
 と、とりあえず目的の無い人には、フリーのプログラミング言語を使うのも一つの手です。
 お勧めは「HSP」です。実際にゲームを開発している人が製作したものですので、そこらの機能はほとんど持っています。
 パソコンで動かすためであれば、これ一つでフリーソフトもゲームも造れますが、多少制限事項がありますし、あまり高速ではありません。ただ、習得の容易さでは他の言語の比ではないでしょうし、例えば同人ソフト等小規模な開発には十分以上の機能を提供してくれます。
 ホームページもありますので、そこからダウンロードできます。
 その他にも、万人に解りやすくする目的で作られたオリジナル言語は多々存在しますが、解説書も出ていて汎用性の高いものはおそらくこれだけです。

(8) ただし。
 どのプログラム言語を扱うにしても、それなりのプログラミング知識は必要です。
 言語仕様はもちろん、その文法、コンピュータのデータ形式、アルゴリズムの初歩ぐらいは知っておかねばなりません。


▲ 先頭へ戻る ▲

3.こんなことができる・できない

 では、それぞれのプログラム言語の長所と短所を挙げておきましょう。

(1) C
・特徴
 システム記述言語。ネットワーク用OSであるUNIXもこれで大半書かれている。そのため高速で、マシンにも直接アクセスできる。関連書籍や情報量が多く、ノウハウも蓄積されている。使える人も業界には多い。
・長所
 高速である。パソコン用からインターネットまで、幅広く対応している。
 ゲーム業界のかつての標準言語であるが、インターネットでは現役。アクセスカウンタやアクセスランキングなどの速度や軽さが必要なインターネットアプリケーションに多く使われる。
 できないことは、個人であればまずないほど、用途は広い。
・短所
 難易度が高い。容易にシステムを止めてしまう危険性がある。
 人によってプログラムの書き方にクセがあって、他人が読んでも理解し辛い部分もある。
 初心者と熟練者の技術格差が非常に激しい。

(2) C++
・特徴
 Cを包括した拡張言語。オブジェクト指向言語であり、個人の開発から大規模開発まで、ほとんどのソフト開発に使用可能。ゲーム業界では標準プログラミング言語である。
・長所
 Cを習得できていれば、習得はまずまず簡単。Cと同様、高速で汎用性がある。どんなマシンでもまず開発可能であるため、修得すれば用途は幅広く、どんな業界でも通用する。
 ゲーム業界標準、インターネットでも準標準言語。
・短所
 習得がCに輪をかけて難しく、時間を要する。容易にシステムを止める危険性がある。
 ビジュアルツールは楽かと思えば、逆に一層難しい部分も多い。
 おそらくは最も使いこなすのが難しいプログラミング言語の一つ。

(3) Delphi(Pascal)
・特徴
 Cより簡単な言語として注目されていたが、注目度ではC++に劣る。
 機能面では勝るとも劣らない。C同様、大抵のものは開発可能。
・長所
 C/C++に準ずるが、習得はCよりはやや容易か。ネットワーク対応もオッケー。
・短所
 システムを容易に止める危険性あり。C++でできることを、わざわざこれでやる必要性があまりない。使用人口もあまり多いとはいえず、自力での情報確保が少々難あり。

(4) VisualBasic
・特徴
 ビジュアルツール言語のはしり。プログラミングが比較的容易である(と言われている)。
 .NET対応のVB.NETはオブジェクト指向を取り入れていて、別物と考えた方がいい。
・長所
 個人プログラミングのほか、データベースなど業務用にも使える。
 Word、Excel、Accessなどにも応用できる。Windows上でなら、結構広範囲で使われている。
・短所
 やはり習得は容易ではない。基本的に、インターネットでUNIX環境に対応していない(MicrosoftのサーバOS環境=NT/2000/200xサーバ上のみ)。M$が嫌いな人は×。
 「ランタイムライブラリ」が別にないとプログラムが動かない。
 文法に冗長な部分があり、ソースファイルも長くなる傾向にあり、見にくい。
 VB.NETはVBと互換性がなく、別言語として修得する必要がある。
 M$がサポートを打ち切っているので、今後発展性がなく、使いどころが減っていく。

(5) Java
・特徴
 あらゆるブラウザの上で動作するので、マシンを選ばない。構文がC/C++に準拠したものになっているため、そちらにも生かせる。オブジェクト指向言語としては平易な方。
 開発環境もSun MicrosystemsやBolandが無料で提供しているため、左記サイトや雑誌の付録などでも手に入る。
・長所
 開発環境は無料でも配布されている(有料のものもあり、そちらはより楽に開発できる)。インターネット対応の細かいプログラムが書ける。
 アプレット、アプリケーション、サーブレットなど、状況に応じて使い分けることが出来る。
・短所
 オブジェクト指向言語らしく、習得は決して楽ではない。マシン制限は少ないが、ランタイムプログラム本体がないとブラウザの外では動作しないため、単独のパソコン用アプリケーション製作向きではない。
 難易度の高い通信プログラムにも通じていないと、最大の特徴が生かせない。
 最も簡易なアプレットでは色々制限が多く、高度なサーブレットなどは使用環境も込みで開発されるため、むしろ大規模Web開発や携帯電話アプリケーションなどの業務用向きで、個人用途向きではない。

(6) JavaScript(ECMA-Script)
・特徴
 ブラウザ上で動作可能な標準スクリプト言語。特にコンパイラやトランスレイタを必要としない。インターネット上でのプログラミング言語。
 名前はこうだが、Javaとは関係ない。文法が似ているため、こう呼ばれるだけ。
・長所
 ブラウザ上で完全動作するため、どんなマシン環境でもブラウザさえ対応していればプログラムが組め実行できる。特に開発ソフトがなくても開発可能(開発用のソフトも存在する)。
 使い方次第で、かなり凝ったWebプログラムを作ることが出来る。
・短所
 ファイルの書き込みがサポートされていないため、大規模なデータセーブができない(クッキーという小さな領域に少しだけデータを保存することはできる)。
 一応オブジェクト指向言語であり、他の言語の経験者であれば習得は容易であろうが、複雑なものになると、ブラウザだけではデバッグが難しい。
 ブラウザ互換性やバージョンによる動作の差があり、それらを考慮してプログラムを作成するのは、初心者では無理。
 通常のプログラミング知識に加えて、オンラインプログラミングの知識も要求されることもある。

(7) Perl
・特徴
 インターネットで使われる、掲示板やアクセスランキングなどを造るスクリプト言語。CGIとして広く使われる。フリーソフトで、どのUNIXサーバでもほぼ標準で搭載されている。サーバ上ではそのまま動作する。
 テキスト処理に優れ、文法もCに類似していて、Cの経験者なら修得は比較的容易。
・長所
 スクリプトであるため、そのまま実行できる。文法はC準拠で、経験者には容易。インターネット上ではほぼ標準のCGI言語。
 実用的なスクリプトがネット上からフリーで手に入るため、それらを参考に改造して使うこともできる。
・短所
 サーバ上でしか動作しないこと。この場合、サーバの知識が無いと扱えない上に、デバッグは自身で行うしかない。ネット以外では効果的なプログラミング言語ではない。
 ネット上では文字コードの表示問題が常につきまとうため、初心者はそこでつまづきやすい。
 スクリプト言語の弱点である「メモリ食い」なため、搭載メモリが少なかったりアクセスの激しいサーバだと、反応が非常に遅くなる。
 また、セキュリティの問題があり、どのサーバでも無制限に使えるわけではなく、むしろ使用は制限されていることの方が多い。

(8) HSP(Hot Soup Prosesser)
・特徴
 フリーで配布されている。(Visualでない旧)BASICライクな作りで、初心者にも文法が理解しやすい。参考書も出版されている。
・長所
 単独プログラムのみならず、スクリーンセーバーも楽に作成可能。小規模なアプリやゲーム製作には多大な威力を発揮するであろう。
 参考書籍を製作者本人が書いていて、かなり解りやすい。
・短所
 ネット(通信環境)には対応していない。高速動作を要求すると失敗する。フリーなので、デバッグ情報は自分で集めるしかない。
 多少はプログラミング環境に関する基礎知識がないと扱いにくいかもしれない。

(9) Nscriptor
・特徴
 基本はフリー。ただし、有償サポートもあり。HSP同様、旧BASICと同じ構造で、比較的わかりやすい。
 エロゲ業界でも使用実績がある(Type-Moonのアレでも使われているので、聞いたことはあるかも)。
・長所
 目的を限定すれば、比較的楽に制作できる。テンプレートから作れば、経験者ならかなり楽に完成させられる。
 書籍も出ていて、理解しやすい。
・短所
 HSPに準ずる。また、ゲームならなんでも作れるわけではないので注意。

 とまあ、こんなところでしょう。
 この中から、自分に合いそうな言語を選択してもらうわけであるが、個人的にお勧めな方法はあります。
 まずはフリー環境のJavaScriptやHSPで、単独のプログラムを作成してみる。そこでプログラムの手法を身につけ、しかる後にVBなりC++なりPerlなり高級コンパイラ言語へ移行します。
 VBやC++は開発環境が有償であり、Perlはそれ自体はフリーでも、動作環境(UNIXサーバ)が生半可な知識では手に入らないし、操作すら出来ません。
 故に、まずは誰でも使えるフリーもので腕を磨くことが先決でしょう。

 一覧表で、それぞれの言語の特徴が解るようにしてみましょう。
 数値は5段階、高いほど難易度高(困難)か多い、0は(障害は)何も無いことを示します。
 素人では「難易度0」が妥当な線ですが、難易度2ぐらいなら2・3日で一応出来るようになります(が、下にはありません^^)。
 難易度3は、1ヶ月で「とりあえず一応の機能は押さえることはできる」難易度です。
 難易度4は、3ヶ月で一応プログラムの基礎が出来る、といったところです。ただし、個人でやるともっと難しいかもしれません。
 難易度5は……素人が手を出すべきではない、仕事や学校といった場所で、誰かに長期間教えてもらうのでなければ、止めたほうがいい言語です。

 言 語  難易度  機 能  参考書量  習得人口
 C/C++ 5  5  5  5
 VB 4 4.5 4 5
 Delphi 4.5  5 2 2
 Java 4 3.5 3 3.5
 JavaScript  3.5 3 3 4
 perl 4 4 3 3
 HSP 3  4 2 2
 Nscriptor 3  3 2 2


※色々主観が混じっていますので、必ずしも正確ではありませんが、大体の目安です。


▲ 先頭へ戻る ▲

4.開発ツール

 プログラム開発には、上にも度々出てきていますが、開発環境(開発ツール)が必要です。
 ちなみに「ソフト」「プログラム」「ツール」と様々な呼び方をしますが、これらは全て好みでそう呼ばれているだけで、全て同じ物です。強いて言うなら、「ソフト」は一般的なソフトウェア全て、「プログラム」は大規模開発のもの、「ツール」は小規模なソフトや機能の限定されたソフト、というところでしょうか。どういう使い方をしても個人の自由ですし通用はしますが。
 開発ツールとは、書かれたプログラムの「ソースファイル」を、「実行ファイル」に翻訳(変換)するための翻訳ソフト(コンパイラ/トランスレイタ)です。
 この高級言語を「コンパイル言語」ということもあります。

・「コンパイル言語」の処理
ソースファイル(テキスト)→→→(コンパイラ中間ファイル)→→→実行ファイル(ソフト)

 JavaScriptやPerlのように、プログラム言語の中でも「スクリプト言語」と言われるものは、プログラムをソースのまま実行するため、このような開発ツールは存在しません。プログラムを実行する「インタープリタ」というプログラム(Perlインタープリタ、もしくはブラウザそのものなど)が、あえて言うなら開発/デバッグツールも兼ねているのです。

・「スクリプト言語」の処理
ソースファイル→→→→→→(インタープリタで直接)実行


 この専用の開発ツールを使うことの意味は、実行速度とメモリの使用量です。
 スクリプト言語は、ソースをその場でインタープリタが実行形式に変換して実行します。そのため、メモリは無駄に食うし、実行速度もさほどではありません。
 開発ツールを使って実行形式にコンパイルされたプログラムは、平均してスクリプト言語の10倍以上速くなります。これは、いちいちその場で変換されず、最初からマシンに理解可能な「マシン語」になっているためです。ただ、Javaはちょっと特殊で、まずサイズを小さくするための中間言語へ変換し(ダウンロード時間を短縮するため)、然る後に各個人の前のパソコンのブラウザが、その場で最終コンパイルを行い実行されます(つまり、半分だけコンパイルするようなものです)。
 特に巨大なデータを扱う場合、内部処理に時間を食う場合には少しでも高速なプログラムが必要ですし、グラフィックス関連ではもはや低速では使い物になりません。
 最近はマシンパワーが非常に高くなっていますが、それでも様々な理由で昔のマシンを使っている人も少なくはありませんし(私もそんな一人です)、最新のマシンに変えるには経済的な障壁も常に存在しますので、誰もがそんな高速なマシンを所持しているわけでもありません。
 ですから、プログラムが高速である、メモリの消費量が少ない、ということは、良いソフトウェアの条件でもあるわけです。

 しかしそれは上級者や、業務用ソフトを開発している人間が考えればいいのであって、今ここで要求されることではありません。
 むしろ問題なのは、開発ツールを使うことで「容易に開発できるのか」ということです。

 私の経験上から言わせてもらえれば、ビジュアル開発ツールがあったところで、開発環境は決して良くなっているとはいえません。特に初心者に対しては、むしろ悪化していると言っていいでしょう。
 理由は様々あります。一つは、そのビジュアルツールを使いこなすには、それだけで様々な知識をすでに必要とすること。初心者は、上級者の助けなしにそこまで自力ではたどり着けません。相当な根性と興味がなければ、自力開発は無理です。
 しかも、「オブジェクト指向」という概念が、近年流行の言語には必ず付きまといます。また、高級言語には、文系人間には理解不可能な専門用語や概念が嵐のように飛び交っています。それを理解し、プログラムの初歩を理解するまでには、学校へ通ったり仕事でやったとしても1年、自力では1〜3年はかかるとみなければなりません。
 それほど現在のプログラム言語というのは、面倒で難解で生産性の低いものである、と知って覚悟しておいてください。20年前に言われていた、ブロックを組み合わせてプログラムを完成させるような簡単で高効率なツール(4GL)など、あと10年経っても業務に耐えるほどのものは出ないと思われます。

 それでもなお諦められない、という方は……是が非でも身につけるべきです。
 やっておいて損はありません。いえ、むしろこれからの世の中必要な技術ですし、プログラムが多少なりと組めることは、自身のステップアップにも繋がります。
 始める始めないは、あなた自身の決意にかかっています。
 ここまで、「プログラムは難しいよ解んないよ〜」と言ってはきましたが、決して理解不可能なことをやっているわけではありません。
 結局、同じ人間が考えたものですし、数学が大嫌いな私ですら一応務まったのですから。「オブジェクト指向」の何たるかなど、知らなくても(言語によっては)プログラムは組めます(笑)。
 「仕事でやっていること以外は知らない」という技術者は意外と多いものですから、素人である初心者の方々も、安心してとりかかって下さい。仕事でないだけ、気楽にやれますから。


▲ 先頭へ戻る ▲

5.共通概念・仕様

 プログラムには、どんな言語にも共通の概念や仕様があります。
 それを知っておけば、どんな言語であっても、基本的な考え方として生かしていけます。
 では、それはどういったものか、次をみていきましょう。

(1) 変数(Variable,Paramator)
 これがないと、プログラムは値の保存が一切できません。
 これは、数値や文字を一時的にストックしておく書き換え可能なメモ、と考えて下さい。
 一般的に変数、もしくはパラメータと呼ばれます。シミュレーションゲームではおなじみの呼び方でしょう。アドベンチャーゲームでは「フラグ」という言い方もありますが、これはON/OFFだけを見るパラメータのことです。

 変数には、様々な設定があります。例えばC言語では、数値を保存するにしても、整数、小数点付き、正負記号付き、もしくは数値の幅(大きさ)によっても様々に分類されます。
 なぜこんなことをするかといえば、マシン語のレベルではこれらの数値が厳密に処理されるため、またプログラム上で扱う場合も、そこに入る数値を区別しておくことは、理解を容易にするからです。
 また、これらを最初から分類しておくことで、プログラムを「最適化」しやすくする目的もあります。「最適化」とは、完成したプログラムが、最も小さく最も高速で、最も少ないメモリで動くように調整して翻訳することです。

 スクリプト言語では、こういった厳密さはありません。そこまで高速性を要求されない作りをしているからです。スクリプト言語の特徴は、高速性より「手軽さ」にあるからです。

 変数は「予約文字」といわれる、プログラムやシステムで意味を持っている記号や単語以外であれば、どんな名前をつけても構いません。詳細はそれぞれのプログラムによって違いますが、中身が類推しやすい名称をつけておくと、管理がしやすくなります。

 基本的に、変数は1バイト(8ビット)単位で管理されます。とはいえ、変数に使われる単位は1・2・4・8バイトなど、倍倍で定義されます。偶数バイトの方が管理が容易だからです。

 3バイトとか5バイト、10バイトなどの幅で管理をしたい場合は、1バイト×3、1バイト×5、2バイト×5など、管理しやすい単位で定義します。

・変数宣言例

int i,j;   (C言語、int型の数値変数i,j) var moji2;  (JavaScript、文字用変数moji2) dim posX   (VB、位置保存用変数posX)

(2) 条件分岐

 プログラムの動作条件は、これで判断します。変数同様、これがない言語はありません。
 例えばゲームで考えれば、アドベンチャーで「フラグが立つ」という言い方をしますが、これは「ある条件を満たした場合、次のイベントが発生するスイッチがONになる」という意味です。条件分岐は、プログラムの動作条件を設定するためには必要不可欠な機能なのです。

例:C言語での条件分岐

if( i==3 ) {     // 変数iが3なら   j = 4;     // 変数jに4を代入する   frag05 = true; // フラグ05が立つ(ONになる) } else {      // (変数iが3)でなければ   k = 4;     // 変数kが4になり   frag06 = true; // フラグ06が立つ }

(3) 繰り返し
 これもまた、どの言語でも備えられています。これも条件分岐の一種といえます。
 例えば、上のように条件を設定する場合、同じ行動を何度もとる場合、それをいちいち何度も記述していては無駄になります。そこで、「ここからここまでは同じ」という部分は、「ループ」という繰り返し処理の中に組込んでしまいます。
 このループを抜けるための条件を設定しておけば、ある行動を完了したら次のシーンへ進む、といった条件付けが出来るようになります。
 気をつけなければならないのは、この条件を少しでも間違えると「無限ループ」という状況に陥ることです。この状態ではプログラムが永久にループから抜け出せなくなっているので、いわゆる「飛んだ」状態になっていますので、こうならないよう注意が必要です。

例:
k = 0;     // 変数kの初期値は0 END = 10;    // 変数ENDの初期値は10 while(END>k) { // ENDがkより大きい間はループ   k++;    // 変数kの数値が1ずつ増えていく   END--;   // ENDは1ずつ減っていく }       // kがENDを超えたとき、ループ脱出

(4) サブルーチン/関数(subroutine/Function)
 長いプログラムを書いていると、同じような処理が繰り返し出てくる場合があります。特に、一つの完結したプログラムを造るとなると、必ずそういった部分が発生します。
 それをいちいちすべて記述していては、時間とCPUの無駄になります。
 そこで、これらの機能をひとまとめにして、「関数(サブルーチン)」という塊に分けてしまいます(Function の直訳は「機能」ですね)。
 たとえば、ある一定の計算をする機能を関数にまとめ、ここに数値をいくつか与えたら答を返す、という機能を持たせたりします。こうすれば、この計算はこの関数を呼び出して数字や文字を渡せばいい、という簡単な記述をするだけになります。

(5) 10進数と16進数と2進数
 これを考えずにコンピュータを考えることはできません。
 10進数は、通常我々が使っている数字です。お金の単位、何かを数えるにしても、常にこれです。
 対して16進数と2進数は、コンピュータ独特の数字の数え方です。
 2進数は「1と0」だけです。これは、コンピュータのメモリが「スイッチON(1)/OFF(0)」で記憶して、それを組み合わせることで数値や文字などを表すからです。この単位が「1ビット」です。
 16進数は、これを8個単位で扱うようコンピュータが作られていますので、それを10進数のようにもっと大きな単位でまとめて、しかもコンピュータの中が解るような数え方をするために導入された数え方です。
 16進数は、4ビットを単位とした、ビットの組み合わせの種類からきています。昔は「4ビットマイコン」というICがあって、それで大きく広がりました。4ビットの状態を表現するために、0〜9、a,b,c,d,e,f(それぞれ11〜15に相当)の16種類を当てはめています。
 今では8ビット単位=「1バイト」がコンピュータの記憶容量の基本単位になっています。ただし、通信の世界では何故か今もビットですが(例えば「光の100M」の表示は、100Mbit/s=12.5MByte/s)。このため、1バイトは16進数では二桁で表されます(00〜ff)。
 ちなみにコンピュータの世界では、1k=1,000ではなく、1,024です。これは「2の8乗」=1,024であり、容量計算では都合がいいからです。当然1M(メガ)=1,024k、1G(ギガ)=1,024Mです(ただし、ハードディスク容量は必ずしもそうではありません)。

 それから、これはよく間違うのですが、コンピュータの世界では、数字は「0」から数え始めます。「1」から、ではありません。

例:
10進数 2進数  16進数 14   1110   0x0e 204   11001000 0xc8

※16進数は通常"0x"を頭につけ、さらに"h"を数字の後につけることで、他の進数と区別する。

(6) 配列
 これは、数値や文字の並びを「一まとめの並び」として考え、その数字や文字の一つ一つにアクセスする記述方式です。
 つまり、データ一覧表みたいなものと考えましょう。0から番号の振られた表にデータを書き込んで、「何番のデータ」と参照されたときにすぐに読み出せるようにしたものです。これは変数の一種ですが、変数が一つの名前に一つの値が入るのに対して、配列では一つの名前にいくつもの数値や文字を割り振ることができます。
 解り易い例として、PRGでおなじみのマップを定義する「マップデータ」の配置にもこれが使われます。

例:
mapdata = new array {  // 配列mapdataを宣言・定義
0,0,0,0,0,0,0,0,0,   // 0:通路
0,1,1,1,0,1,1,1,1,   // 1:壁
0,1,E,1,0,1,E,1,0,   // E:イベント(階段など)
0,1,0,1,0,1,0,0,0,   // という配置になっている8*8のマップです。
1,1,0,1,0,1,1,1,0,   // これが面倒なら通路="道"、壁="壁"、イベント="EV"
0,0,0,1,0,0,0,0,0,   // などと定義しても構いませんが、
0,1,1,1,0,1,1,1,0,   // 使用する言語によっては
0,0,0,0,0,1,0,0,0    // 日本語は使えないこともあります。
}

※ただし、文字で定義するより数字で定義した方が、一般的には処理上便利ですしメモリも食いません。

(7) 数字と文字の扱い
 さて、数字を扱う場合は、まあ万国共通(一部中東方面では違う文字を使ったりしますが)、で10個の数字の組み合わせですし、アルファベットも26文字の大文字小文字で52文字(まあ違う文字を使う国もありますが、発祥がアメリカなので英語圏を基準とします)、その他記号を組み合わせても大した数ではありません。
 これら数字や英文字記号は、1バイトですべて表現されます。これが「文字コード(ASCIIコード)」というもので、数字やアルファベットは、文字で表される場合、すべてこのコードで処理されます。数字とアルファベット他いくつかの「制御コード」は、基本的に一覧表になっていて、今はどんなコンピュータにもハードに組み込まれていて、標準化されています。
 例えば" "(スペース)は0x20、数字の1は0x31、2は0x32……という具合です(この文字コードは16進数での表記です)。
 これらの文字は、計算で使用される数字ではありません。ですから、大抵どの言語にも、最初から持っている組み込み関数の中に、数字←→文字変換関数を持っています。
 コンパイル言語では、これらの区別を厳密におこなっていますが、スクリプト言語は計算式に入れられたら数字、文字表示形式で表示されたら文字、と用途に応じて勝手に変化もします。
 これらの数字・文字の扱い方をしらないと、とんでもない結果が表示されることがありますので、注意しましょう。
 ちなみに、文字で作られた絵を「アスキーアート」と呼ぶのは、文字コードが「ASCII(アスキー)コード」と呼ばれることに由来します。

(8) アルゴリズム?
 さて、ここまできたら、プログラムには付き物のアルゴリズムというものに触れなくてはなりません。
 とはいえ、これは「データ処理の効率的な方法」を示したもので、例えば「ハノイの塔(の解法)」とか「バブルソート」「クイックソート」(並べ替え)などは、有名な基本的アルゴリズムです。
 これを知っていると知らないとでは、データ処理手法が大きく変化します。
 ただ、これを知っていればどんなソフトにでも応用できるか、といえばそうではありません。例えば、ソートアルゴに詳しいからといって、グラフィックス処理が出来るかといえば、それは画像処理アルゴとはあまり関係ありません。
 これもまた、目的に応じたアルゴリズムを研究する必要はあります。

 でも、こんなもの後回しでもプログラムは出来ます。心配しないで、必要になったら考えましょう。


▲ 先頭へ戻る ▲

6.どないしたらええねんな!

 プログラムを作り始めた。エラーが出た。デバッグ(バグ修正=「プログラムエラー」修正)……しかし、どこがどう悪いのかさっぱり解らない。
 それが、デバッグ地獄の始まりです。
 ちなみに「バグ(プログラムエラー)」の語源は、本当に「蛾(羽虫)」です。初期のコンピュータは、数千本の真空管を並べて動かしていまして、蛾がそこに飛び込んで回路をショートさせエラーを出したことから、エラーを直すことを「バグ(羽虫)取り」と言うようになりました。

 デバッグは、プログラム作成には欠かせません。一発で完璧なプログラムを作成できる人は、この世にはいません。断言していいです。規模が大きくなればなるほど、完璧さは比例して減少していきます。
 いくらプログラムの達人になろうが、デバッグなしにソフトを完成させることはできない、とその道のプロも言っていますから、これはどうしても避けられない、無視できない作業です。

 しかし、デバッグにも「ツボ」というものがあって、素人と達人には、そのツボの蓄積と効率的なエラー発見能力に決定的な差があります。これは経験で蓄積されていくものですから、初心者には確かに重荷というか、キツい部分です。
 こういう時には、近くにプログラムに慣れた人間がいるなら、その人に聞くのが一番です。
 慣れた人に教えてもらうことは、自分で試行錯誤するのに比較して、5倍は速く習得できます。試行錯誤をすっとばして、目的のものに最短距離で到着できるからです。それでやり方をマスターしてしまえば、もう試行錯誤の無駄な時間は不要となります。
 ただ、周囲にそういう人が存在しない場合は、自力で解決するしかありません。自力解決といっても、完全に何もかも自力で調べ上げて、というのではなく、例えばネットには、そういったプログラム相談に応じるサイトは山のようにありますし、初心者に優しいサイトも数多く存在します。そういったサイトを活用するのも、効率的なデバッグを進める手段です。
 そういうのが死ぬほど面倒とか、秘密で誰にも相談したくない、もしくは使っている言語にはそういった相談相手がいない……というあまりに不幸な人(そういう人は滅多にいませんが)は、諦めて自力で調べてデバッグして下さい(笑)。


▲ 先頭へ戻る ▲

7.ネットワークとスタンドアロン

 プログラムを造るにあたって、考えなければいけないことがあります。
 それは、ユーザーが何処で使うのか、です。
 インターネットで動作するものであれば、それはネットワークに対応したマルチタスクプログラムの作り方をしなければいけないし、個人のパソコンにインストールして使うものであれば、「スタンドアロン環境」で動作するように造らねばなりません。
 例えば、ホームページで使われているようなものを、自分のパソコンの上で単独で動かそうとすれば、そのソフトにはブラウザの機能を再現するよなプログラムが必要になることもありますし、逆にデスクトップで動いているソフトをネット上で再現するには、いろいろと制約があってなかなか実現できません(これは、ネットワークのセキュリティの問題があって、誰でも自由にネットに繋がっているマシンに書き込みできないようになっているからです)。
 基本的にソフトは、他人に使ってもらうことを目的としたものです。もちろん、自分で環境を改善したいがため作る人もいますが、多くは発表して使ってもらってなんぼ、です。
 ただ、その使用環境が自分の製作環境および動作確認環境と同じでなければならない、という厳しい条件では、使ってくれる人は多くはありません。ユーザーサイドの条件を満たせるようなツールが出来て、初めて使ってもらえるということを忘れてはいけません。
 もちろん、自己満足のために造ったのであれば、自分が満足するツールを作成してなんぼ、ですけど。


▲ 先頭へ戻る ▲

8.用途に応じて

 さてさて、まだ考えておかねばならないことがあります。
 それは、前にも書いた通り、「何がしたいのか?」です。
 みんなが使っているからC++にした、という選択は、あまり誉められたものではありません。
 確かにC++は、ツールも出揃っていますし、関連参考書も雑誌の特集も数多くあります。しかし、初心者にはあまりに厳しい言語であることも忘れてはなりません。
 もし、あなたが目的とするプログラムが、C++でないと実現できない、というのであれば、それは仕方ありません。じっくり勉強して、慣れていくしかありません。
 しかし、みんなが使っているから、という理由で、もっと簡単なツールでなく、わざわざ難しい方を選んでしまうのは、それは時間の無駄になってしまうことが多いのです。

 例えば、ホームページを造りました、次はちょっとこれに更なる細工を施したい……と思ったなら、選択肢は普通ならJavaScriptかJavaかPerl(CGI)、といったところでしょう。
 しかし、ネットワーク周りは、どこもかしこも「アクセス制限」という障壁が存在します。そのため、Perlはサーバ管理者から許可されていない限り、使うことはできません。となれば、勢いJavaScriptかJavaということになってしまうわけです。
 それではダメというなら、環境を整えるしかありません、CGIがOKのプロバイダに乗り換えるか、もしくはレンタルサーバやレンタルスペースなどを利用する、という手もあります。
 しかし、それでCGIが使えるのか、といえば……動作環境の整備にはUNIXの知識は不可欠ですし、日本語を扱う場合、文字コードの違いがあって(UNIXでは、パソコンで使うSHIFT-JISではなく、EUCというコードを使っています)、それを解決しないと表示が文字化けしてしまうことになります。サーバサイドでアクセスレベルも変更しなければなりません。また、Perlでは標準ビジュアルツールがありません。大抵は、エディタで打ってUPして動作テスト、という流れが一般的です。
 また、UNIXはすべからく文字コマンド(コマンドライン)で動作します。アイコンクリックで動作完了、というWindows/Mac感覚では動いてくれませんので、解る人のサポートは欠かせません。

 そんなことをいわれても、初心者にはどの言語やツールが何を造るのに向いているのか、ということも知りませんし、ましてや聞いた相手が偏った環境であったりすると、それ以外の選択肢がなくなる場合があります。「これでなきゃダメ」という相手の言い分は、そのまま信じないようにしましょう。
 個人で造ろうと思うモノなら、ほぼどんな言語でも(制限はあれど)実現できるものですから。

 また、個人的にはM$関連のコンパイラ(VB、VC++)はあまりお勧めしません。特にVBは、元は「ACCESS-BASIC」といい、データベース制御から生まれた言語ですが、コーディング方法はVB以外には応用できません。これからもうM$製品で全部やっていくつもりであれば結構ですが、何よりも「M$プラットホーム以外で通用しなくなる」可能性を忘れないでください。
 しかも、今までのVBは、M$自体がVB.NETへの移行を推奨し、旧VBのサポートも早々に打ち切るのではないかと言われていますので、今後の展開には注意が必要です。

 また、今後プログラミングでプロフェッショナルになろう!と思ったら、オブジェクト指向を身に付けなければ将来やっていけません。仕事を選べばやっていけないこともないでしょうが、そんなことをしていればいずれ行き詰まります。言語の進化が、オブジェクト指向抜きでは語れなくなっているからです。
 しかし個人的には、オブジェクト指向とは、本来コンパイラがやるべきことを人間に押し付けているだけという気がしてなりません。本末転倒な発想ではないかと、私は思っています。
 「効率化されなければならない」と言われつづけて20年以上、むしろプログラマの負担が増えている現状を見ると、現在のプログラム言語の進化は間違った進化ではないか、と思えてならないのです。
 だからといって、自分に言語を開発するだけの技術がない以上、他人の理論に従うしかありません。ならば、自分に一番合った言語を選択し、そこから始めていくのが一番です。


▲ 先頭へ戻る ▲

9.最後に

 ここまで色々書いてきましたが、プログラムは難しいものです。ただ作りたい、という情熱だけでは何ともなりません。
 プログラムの制作過程には、多くの知識が要求されますし、プログラムはその結晶です。
 設計し、動作を予測し、組み上げ、動かし、調整し……と、大いなる苦難を経て完成に至ります。しかも、完成してもそれは「一応の完成」であり、機能追加にバージョンアップは果てしなく続くことでしょう。
 それでも、自分の思い通りのプログラムが完成したなら、もっとそこから先へ進みたくなると思います。そこまで積み重ねたものが足場となって、もっと先へ進むことが出来るようになったからです。
 プログラムは難しいものです。しかし、楽しいものでもあります。
 その楽しさを知ることができたなら、あなたの人生がより広がった証拠です。
 せっかく覚えた楽しみを、逃さないようにしてください。

 しかし、「これは俺の生き方に合わない」と思ったら……こちら方面での努力は徒労に終わる可能性がありますので、絶対必要でないのなら、他のことに力を注ぐべきでしょう。やりたくもない趣味に力を注ぐのは、人生の浪費に他なりません。
 改めて、自分に合うテクニカルな趣味を見つけましょう(笑)。


▲ 先頭へ戻る ▲

10.追補:プログラミング環境の現在

 さて、初心者の方々はこれを読んで挫けたでしょうか、それともやる気になったでしょうか。
 一応、2008年度半ばあたりまでのプログラミング事情を書いておきますと……

・世の中で今最も注目されている言語は、Javaっぽい。
 Javaという言語は、個人で扱うにはちょっと制限が多すぎますが、ネットの世界で業務用のシステムを組むには超メジャーな存在に成長しています。特に携帯電話向けのアプリは非常に人材不足で、それが出来れば今後半世紀は仕事に困ることはない、とまで言われます。
 仕事で使うことを考えるなら、Javaを覚えておくのが最も将来性もあり、即戦力として引く手数多の状態になります。
 ただし、後述するオブジェクト指向をマスターしていないと、Javaの仕事はできませんので、こっち方面に進みたい人はご注意を。

・VB(ビジュアルベーシック)はどうなるの?
 ここでいう「VB」とは、VB Ver.6.0のことで、.NET対応(Ver.7〜)以前のものを指します。
 この「VB」と「VB.NET」は全く別物と考えてください。
 VB ver.6.0は、今から覚えても将来がない言語であると確定しています。
 なぜかというと、従来のVBは、その製造・販売元であるマイクロソフトがサポートを打ち切り、VB.NETへの移行を促しているからです。
 しかし、VB自体はすでに広範囲に普及し、MS-Officeにもマクロとして採用され、またWindowsでもVBScriptという形で使われています。
 なので、使いどころはまだ多いのですが……現在のプログラミング言語は、ほぼオブジェクト指向化を目指していますので、オブジェクト指向でないC言語や旧VBなどは、新しいシステムからは切り捨てられています。
 VB.NETもこのオブジェクト指向に対応した言語なのですが、困ったことにVB6までの旧言語とは互換性がありません。VB6のソースをそのまま持っていっても使えず、相当の書き直しが必要になります。
 つまり、旧VBだけが使えても、VB.NETでは使えないわけです。
 とはいえ、すでに旧VBで作られた数多くのシステムが存在し、そのメンテナンスには旧VBの知識は必要なので、今すぐ使えなくなるということはありません。
 しかし、今後システムの更新となったとき、選択肢からは非常に外されやすくなっていることは間違いありません。
 今後縮小することはあっても、拡大することはありませんので……。

・デュアルコアCPUに対応した、マルチタスクプログラムがこれからは必須になる?
 数年前は、マルチCPUなんてのは業務用サーバの世界の話で、パソコンではなんも関係ない世界でしたが、近年デュアルコアだのクアッドコアだのが平気で普通のPCとして売られるようになり、自然とそれに対応したプログラミング技術も求められるようになってきています。
 まぁ、まだまだ需要はネット関連の方面がメインですが、そろそろ各自のPCで動くアプリケーションでもマルチコア対応が必要になってきてまして、それを満たすにはマルチタスクプログラミング、ということになるわけです。
 ただ、M$はそのへんの技術が薄いので、WindowsではそこらのAPIも対応こそしてますが、なんだか中身は不完全なものになりそうな気がしてたまりません。現にXP→Vistaの「退化」を見れば、次の「Windows7」もどんなものか、大体想像がつきそうなものです。
 とりあえず、普通にOSが対応していかなければ、その上で動かすアプリがまともに対応できるわけはありませんので、それらはWindowsVistaやMacOS-XIとかがどういうものか、そして将来的にどう進化していくのか見ていかないと、なんともいえませんけどね。
 現在、MacもOS-X以降はUnixベースになり、当たり前のようにマルチタスクで動いています。Windowsも、一応Unixに分類される構造であり、マルチタスク対応ではあるのですが、Windows9xとの互換性を保持したことから、NTベースの2000やXP、VistaやWinサーバでも、ヘンなバグを大量に抱えています。
 普通にPCとして使うには、まあそれなりの性能を示すようにはなりましたが、相変わらず重要なシステムに使えるほどの安定性は持ち合わせていないと言えます。それはMacでも同じで、相変わらず内部の安定性はWindowsをバカに出来ない程度だ、という酷評も聞こえてきます。

 マルチタスク/年中ノンストップ運用はサーバの世界では当然で、Windowsもサーバはあるにはあるんですが、今でもメモリリークという致命的欠陥を抱えている状態で、サーバとしては「高かろう悪かろう」という最低の製品になっています。
 マルチタスクで多数のソフトが動けば、自然とメモリリークの影響も比例して増えるわけで……そこらを直さないと、Windowsも近いうちに限界を迎えることでしょう。

※メモリリーク
 ソフトが使用したメモリの「後片付け」が上手く出来ず、「ゴミ」を残してしまうバグ。
 Windowsになってからの伝統的バグで、今(Vista)でも修正されていない。このゴミが蓄積されると、使えるメモリが少しずつ減っていき、やがて勝手にシステムが落ちる。
 ミッションクリティカル(止まっちゃいけない)システムの場合、こんなバグは明らかに致命的で、サーバには使えないのだが、不治痛のWindowsサーバを導入した某地方銀行は、週末になるとサーバをリセットするのが仕事だという。
 普通、サーバをリセットするのは、年に一度か二度、ハード的なメンテナンスをするときだけなのだが……。

・オブジェクト指向は本当に効率的か?
 これに関しては、様々な意見があります。
 ほとんどの技術情報誌では、「オブジェクト指向はプログラマの万能薬だ」みたいな記事ばかりですが、一方で「オブジェクト指向はプログラマの負担を増すだけで、何も改善されない」という技術者も、少数ながらいます。
 オブジェクト指向というのは、「頭を使う量を増やして、手を動かす量を減らす」ということだという表現が見られましたが、それはつまり、オブジェクト指向をしっかり理解していないプログラマは対応できないと言っていることです。
 オブジェクト指向以前の、「構造化言語」というタイプの言語(Cとか旧VB、Pascal)では、「頭は使わなくて手を動かす」ことで対応できた部分が多くありました。ゆえに、初級プログラマでもそれなりに仕事ができて、そこで経験を積んでいくことで中級・上級へとステップアップすることはできました。
 しかし、オブジェクト指向言語では、「オブジェクト指向」という概念を理解できなければ、そこから先はないのです。
 オブジェクト指向という概念は、理解している者にとっては簡単なものかもしれませんが、一方で完全に理解するには非常に難解な概念であるとも言われています。その時点で脱落する初心者が増えれば増えるほど、プログラマ人口も減り、結局はプログラマ一人当たりの負担が大きくなるわけです。
 ということは、やはりオブジェクト指向はプログラマに負担を強いるだけの概念なのかもしれません。

 現実、この「オブジェクト指向」というやつには、かなり多くの人が泣かされているようです。
 私が実際現場で見聞きした状態では、若い世代ではVBでプログラミングを覚えて、そのままVBで仕事をしてきて、それ以外は知りません……というプログラマも少なからずいます。そういうプログラマは、オブジェクト指向の概念を聞いても( ゚ Д゚)ハァ?という反応をすることが多いのも事実です。VBは構造化言語であり、オブジェクト指向がありませんから、初心者にも比較的解りやすく、またプログラミングがしやすいツールがあるため普及しましたが、そのために他の言語への移行がなかなか出来ない言語でもあるのです。
 このため、VB→VB.NETの移行がなかなか進まず、企業側もVB.NETでシステム構築をしたくても、プログラマが少なすぎるために出来ない、という事例もあったようです。
 同じケースでも、構造化言語C→オブジェクト指向言語C++の場合には、C自体が元々難易度の高い言語であり、オブジェクト指向の必要性もあったので、ここでの移行は比較的スムーズに進みました。また、C→C++は上位互換でしたので、Cの書き方そのままでも通用したのです。
 同じくオブジェクト言語であるJavaは、C++の文法がほぼそのまま通用するので、C++に慣れたプログラマならさほど困惑することもないため、これもまた普及が一気に進みました。

 しかし、こういった言語の移行だけではなく、オブジェクト指向というのは、概念のややこしさもさることながら、その説明がわかりにくいため、理解を妨げているのではないかと感じます。
 オブジェクト指向は、よく「車」に例えられます。プログラム全体が車なら、各機能であるクラスオブジェクトとはタイヤやガラス、ライトやハンドルといったパーツであり、オブジェクト指向プログラミングとは、そのパーツ(クラス)をカスタマイズすることで新しい車(プログラム)を容易に作る方法、と説明されます。
 言わんとしていることは解るのですが、じゃあ具体的にどうすればいいのか?という段になると……途端に、その説明と概念が繋がらなくなるわけです。
 特に、先に書きましたが、プログラマという人種は他人にわかりやすく説明することが下手な人種です。
 自分では理解できても、それを他人に説明しようとすると、途端にわかりにくい概念になってしまいます。

 もちろん、解る人は例え話などなくても理解しているのですが、そういう人は全体からすれば少数派でして、中にはとりあえずこう書いとけばいいからという書き方を教わるだけ、という場合もあります(私としては、むしろ概念の説明より先に、具体的・実用的な書き方をまず先に教えるべきじゃないかと思いますが)。
 その難解さは、熟練した技術者でも困惑するほどです。先に「オブジェクト指向は負担を増やす」と述べたのも、熟練したソフト技術者です。彼はおそらく、自分が修得することよりも、他人に教える苦労を経験したのでしょう。半端な理解でこれを使おうとすると、メチャクチャなことになる……と言いたいのだと思われます。

 特に、ネット上でのC++などの個人的な解説サイトを見ると、ことごとく「これはこうするとより効率的だ」とか「オブジェクトをこう利用することで……」とか、オブジェクト指向を理解していることが大前提となっていて、オブジェクト指向を批判する向きは非常に少数でした。
 もちろん、サイトの管理者は理解していて、それを使えば効率的であることも解っているのでしょうが、そういう人たちをかき集めた結果、今でもプログラマは人手不足で、しかもオブジェクト指向を完全に理解している現場技術者は減る一方です。理解している人たちは現場を離れ、プロジェクト指揮者とか、もっと上に行ってしまって、現場仕事を離れていきます。
 だから、現場はいつまで経っても人手不足で、教える人間も不足しているため後進のスキルが上がらず、結局国内ではなんともならず、インドとかへ外注も回っていってしまいます。
 現場からすれば、オブジェクト指向なんて小難しい概念持ち込んで過重スキルを要求するより、開発を楽にするツールを作れって話なんじゃないでしょうか。
 「ビジュアル開発ツール」とか言ったところで、そこに仕込めるものが多すぎたり、完成までの手順が難しすぎたり、新たな機能が多すぎて扱い切れなかったりで、人の負担を増やしているだけでしかないように思えます。
 確かに、文字だけのコマンドラインコンパイラに比べれば開発効率はいいでしょうが、結局それは、同じプログラムを作れば数段楽になるけれど、楽になった分開発規模が拡大したり難易度の高いプログラムを要求されたりで、労働量はむしろ増えていると言って間違いありません。

 オブジェクト指向の失敗は、もう一つあります。
 それは、資産の継承という概念です。
 すでに出来ているクラスに機能を足していくだけで、新しいクラスに機能が継承できる――というのが大雑把な考えですが、そのすでに出来ているクラスを利用していないということが、すごく非効率的なのではないかと思われます。
 というより、すでに出来ているクラスは使われずに、また最初から新しいクラスを作り直すなんてことが毎度毎度続くので、資産の継承が上手くなされていないわけで、せっかくの効率化概念が、現場では生かされる機会が少ない、というのも効率化できていない原因ではないかと思われます。
 まあ、いくら発想が良くても、実際に使われないことにはただの机上の空論なわけで……。
 現実に即していない概念だということも、オブジェクト指向が非効率的である点ではないでしょうか。

 本当は、これを楽にする言語が、各社で開発されていたんです。1990年ぐらいに話題になった「4GL(4th Generation Language、第四世代言語)」というやつです。
 これは、ほとんどの機能がカプセル化されたパーツで出来ていて、それをパネルの上で接続していくだけでプログラムが完成する、というものでした。懐かしの「電子ブロック」みたいなものです。
 この当時、「5年後にはこれが実用化されて、現在のプログラマ不足や開発効率の悪さは一気に解決される」「開発効率は10倍になる」と、夢物語が現実になる日を待ち望んだのですが……
 結局、これは日の目を見ませんでした。結局、要求される機能が複雑すぎて、そこまでの汎用性を実現できなかったのです。今でも細々と研究されてはいるのでしょうが、どうなったかは知りません。
 この4GL、開発されていたのは汎用機などの大型コンピュータの上だけで、もっと小さいワークステーションやPCは対応どころか、完全に見捨てられたままになっていたのです。汎用機で上手く動くようになったら、徐々にワークステーション、PCへと下りてくる予定だったのでしょう。
 で、結局汎用機が主流だったネットワークの世界は、一気にダウンサイジングが進み、10年ほどでワークステーションクラスどころかPCサーバまでが一般人の手の届くところまできてしまいました。このせいで、汎用機のシェアも落ち、どのメーカーもダウンサイジングを行わねばならなくなり、汎用機対応の言語をわざわざワークステーションにまた作り直す余裕は出なかったのでしょう。
 ……で、そこでやったことといえば、人間の方にオブジェクト指向という負担を押し付け、開発効率が倍ぐらいに上がるビジュアルツールで、開発規模10倍以上のプロジェクトをこなさなくてはならなくなった……というところでしょう。
 だから、相変わらず業界は毎日熟練のプログラマを求め、どのプロジェクトもプログラマ不足に悩み、成長しない新人に泣かされ、終わらない外注仕事に泣かされ続けているのです。

・育たない・育てない人材
 日本では、従来よりハード偏重主義が蔓延していて、企業はソフト技術者を育てようという気が全くありません。勝手にスキルを上げられる有能な人間を雇うことはしても、自社内で教育しよう、とは思わないのです。
 そのため、日本のソフト産業は、ゲームや日本固有のワープロやFEPなどを除けば、ほぼ壊滅状態と言っても過言ではありません。
 でなければ、なんでインドからわざわざ技術者を呼んで仕事をしてもらうのでしょう? 日本人じゃダメだからですよ。使い物にならなくて。インド人の方が安いから、というコスト的な問題ではないのです。彼らをインドから呼び寄せて日本での生活を保証する費用を考えれば、日本人の方が最終的には安くつくはずですが、日本人で同じスキルを持っている人間が圧倒的に少なくて取り合いになっていることもあって、そういう人材の単価は高騰しています。
 ハードがいくら優秀であっても、今はそれを制御するソフトが必須であり、ソフトなしではどんなハードも正常に動作しません。
 もちろん、日本人にも優秀なのはいますが、その数が壊滅的に少ないのです。少ないがために、常に仕事に追いまわされ、後輩を育成するどころではありません。会社もそんなことをさせるより、本人を働かせないと、仕事が進まないのです。

 また、現在のような個人の成果主義が浸透することで、高いスキルを持った人間が、自分を高く売るために、他人へスキルを教えて他人の価値を高めることを嫌がる傾向にあります。会社が社員教育に力を入れず、誰かに任せるだけになると、後輩への必要な技術伝承までも行われず、人がいなくなる=技術が失われる、という状況になりつつあります。先輩は当てに出来ない時代なんですね。
 ましてや、高い技術を持っている人材は、外資で日本企業の10倍とか20倍とかいう報酬で働き、とっととリタイヤしたり自分の会社を立ち上げたりもしますんで、よほど会社が技術に金を出せないと、これからはどんどん人材流出を許すことにもなりかねません。
 そんな状況で、企業自体の技術レベルが低下している一方で、国際競争力など持ちえるでしょうか?
 ただでさえ、日本企業はリストラや人件費削減で、社員に対する教育に金も時間も割かなくなりました。その穴を派遣で埋めているのが現状です。

 が、派遣なんてのは、「知っている」=プロ、「経験者」=使えるプロと定義されますので、「現場では使えない」なんてのはザラです。「本当のプロ」=神ぐらいの人材は、中小の派遣一社では一人いるかいないかの世界です。大学の情報科出たてのぺーぺーが、半月の研修程度で即現場ではプロ扱いされる世界ですから……。
 で、結局素人に毛が生えた程度の連中がやれるのは、根性でやることぐらいです。知識を生かすのではなく、結局体力勝負になってしまうのです。
 そんな状況ですので、この業界では35歳(or30歳)定年説がずっと消えないんですね。社会的に、人生リセットの節目、限界ですから。
 そしてさらに、大切にされない一流技術者は日本の会社を去り、外資系に鞍替えし、もっと腕に見合った評価や報酬を得ることになり、残ったのは二流以下の使えない人間ばかり……なんて状況が進行しつつあります。プログラマではありませんが、日亜化学の中村氏(青色発光ダイオードの開発者)の件などはいい例です(その日亜化学は、2008年後半にまた社員とのトラブルがあったようで、これは企業体質ではないかと思われています)。
 例えばこの十年ほどのサムスンの大躍進は、こうして高い報酬で日本から引き抜いた人材から技術をタダで得て、生産ベースに上手いこと乗せたからです。自社では元々技術力のないサムスンですが、その経営姿勢は日本企業も見習わねばなりません(もっともサムスン自身は、低価格+生産技術に対する特許料支払いで、利益率自体は日本の電機メーカーの半分程度と言われる、超貧弱収益体質ですが)。
 こういった技術者を大切にしないバカな日本企業経営者のせいで、日本の会社も労働環境も、どんどんグズグズになる一方……。

 日本で優秀なのはゲームプログラマだけ、と言われますが、そのゲームプログラマですら過重労働環境は変わっていません。
 ゲームプログラマは引く手数多で、待遇もいい方なので、プログラマの中ではまだマシではありますが、今後外資が本格的に日本の優秀な人材を引き抜きにかかったら、日本のゲーム産業は干上がりかねません。
 まあ、ゲームプログラマは大抵英語すら話せないヲタが多いうえ、秋葉を絶たれたら人生\(^o^)/オワタようなものですので、そうそう引き抜かれて海外へ行くなんてことはないでしょうし、ある日突然「君、今日中に荷物まとめて明日から来なくていいよ」なんて言われるような企業に好き好んで行くとも思えませんがねw
 それにしたって、そこまで欲せられる人材がいるとも思えませんが……

 さて……この業界に未来はあるんでしょうかねぇ……。
 こんな状況では、趣味のプログラマ以外、生まれてこないんじゃないかと思いますが。


▲ 臨時企画目次 ▲ ▲ 先頭へ戻る ▲