#6531

なんでも入る箱


web制作

去年初頭、まだ仕事もせず本社で研修を受けていた頃。
当時の同僚がPHPの基礎課題に苦戦している中でこんなことを言っていました。
「プログラミングは配列を使いこなせばマスターしたも同然なんじゃないか」

なかなか正鵠を得ていると思います。
ただし、ひとつ訂正するならばプログラミングそのものをマスターしたことになるというより、
全体からすると「超初心者の壁」を乗り越えたに過ぎないことに注意が必要ですが。
しかしこの壁を乗り越えるだけでも、
初学者からすればプログラミングしている感は大分実感できるはずなので、
そういう意味でも同僚の言葉は大筋で間違っていないと思います。

よく箱に例えられますが、プログラミングの基本の基本は「変数」です。
変数という箱は、中に文字列や数値、真偽値などのデータを1つだけ入れられます。
数学でいうところの「X」です。
プログラミングでは、これを駆使してさまざまな式を計算し、その答えを変数の箱に入れていきます。
変数を使えるようになったらまずレベル1をクリアと言ってよいでしょう。

次のレベルが同僚のいう配列です。
配列はただの変数と違って、中に何個でもデータを入れることができ、
それらのデータはラベル(基本的には連番)が付けられて管理されます。
配列は、数珠つなぎにされた中身を一括で取り出すこともできるし、ひとつ取り出すこともできます。
これは、変数をただデータの個数分用意するのと違って便利なことがあります。
代表的な用途に、配列ひとつずつに処理を行うループを組むことが挙げられます。
配列でループを使いこなしたらレベル2はクリアです。

さらに配列は、配列の中に配列を入れることもできます。これを多次元配列といいます。
多次元配列を使いこなせば、ループを入れ子にして複雑な処理を行ったり、
ある程度大きなデータを効率的に管理することができるようになります。
ここまで来ればレベル3はクリアでしょう。
そして、ここまでがおそらく一般的なプログラミングスクールの卒業レベルだと思います。
職業訓練ではレベル1すら行かないこともありますが、
少なくとも自分の会社の研修はレベル3まで行きました。ここまでが超初心者の領域です。

では、その上は何なのか。要は本当の脱初心者の壁は何なのか。
いろいろな意見があると思いますが、自分は「オブジェクト(クラス)」だと思っています。
プログラミング言語は変数とは別に関数という、いろいろな機能を持った箱もあります。
これはただ入れておくための箱というより、
右から情報を入れて左から別の情報が出てくる入出力装置のようなものです。
たとえば指定した数値を入力しそれを全部足して合計を出力するといった機能が考えられます。
これらはプログラミング言語にあらかじめ用意されたものもあれば、
自分で独自に作ることもできます。

オブジェクトは一見すると配列と同じような箱です。
複数のデータを入れられて、なおかつそのデータには住所のようなラベルが付く。
しかしただの配列との最大の相違点は、データだけでなく関数も入れることができるという点です。
つまり、ただの箱ではなく入出力装置も兼ねています。
超ざっくり言えば、関数という機能を配列のように管理できるのがオブジェクトです。
これにより、たとえば時間を表示する関数に表示形式指定機能や日付の変更機能など、
同じような機能をひとまとめにしておくときに役立ちます。

自分はいままでPHPを独学で書いてきましたが、
自分を客観視するとそのプログラミングの腕前はレベル3に留まっていると思っています。
何故かというと、PHPのみを使う限りそれ以上レベルアップする必要が無かったから。
論理演算と配列さえ使えれば、ピクチャレ大会レベルのサイトは誰でも作れます。
あえてそれ以上高度なことをして複雑にする必要がないんですよね。
なので自分は、プログラミング歴はそれなりに長いにもかかわらず、
オブジェクト指向はまったく縁がありませんでした。
それゆえにPythonやjavascriptなどオブジェクト指向言語に着手する勇気が出ず、
長らくPHPしかできない期間が続いてきました。

ですが今週末開催予定のピクチャレ大会のイベント準備に取りかかったとき、
PHPではどうしても実現できない機能を実装するためにいよいよjavascriptと向き合ったのですが、
すぐにオブジェクト指向の壁にぶつかり、自分のプログラマーとしての浅はかさを思い知りました。
javascriptではこれまで全然意識してこなかった変数のスコープ
(その変数が有効になる範囲)も考えなくてはいけないし、
関数をオブジェクト化する必要性に迫られることもあり、
デバッグのたびにこれは配列なのか、はたまたオブジェクトなのかと混乱している状態です。

本当に難しいです。でも、それゆえに面白い。やり甲斐はあるんですよね。
なぜならjavascriptは、PHP単独でできることよりもぐっと可能性を広げてくれるから。
具体的にはよりリアルタイムな描写ができるようになり、
もっとインタラクティブなwebサイトを構築することができるようになります。
PHPはページを書く前に処理を終えるサーバーサイドプログラムであるため、
ユーザーの動作に対して何か処理をすることはできません。
PHPの役目はあくまでもHTMLというマークアップ言語を書き出すための言語です。
それに対してjavascriptはユーザーのPCで動くプログラミング言語であるため、
ユーザーの動作に対してリアルタイムに反応し処理を行うことができます。
そのため、PHPではアクションゲームは作れませんがjavascriptなら作れます。
いままでPHPしか書いてこなかった自分にとってはなかなか可能性を感じる言語です。

ただ、処理をユーザーの端末に全面依存するということはデメリットもあります。
まずコードがユーザーに丸見えなので、
秘匿したいような情報は扱えないしハッキングの被害も受けやすい。
また処理速度もユーザーの端末に依存するため重い動作をさせることは難しい。
この辺の問題はすぐに顕在化してくると思うので、早めに対策を打っていきたいところです。
javascriptをサーバーで動かすNode.jsはひとつの解決策だと思いますが、
それを導入するためにはサーバーを移転しないといけないんですよね……。
そうすると今度はLinuxやらなんやらの知識が必要になり、実費も必要になってくるため
なかなか簡単に解決とはいかないのがこの問題です。

まぁそれはさておくとして、
今大会は自分にとってはjavascriptのレベルアップに良い機会になりそうです。
今日は00時就寝07時40分起床、昨日に引き続きプログラミング作業ががっつり捗りました。
ちょっとした賭けでしたが、プライベート作業の申請をして良かったです。
これのおかげで昨日・今日とすごい満たされている感があります。
今週はかなり忙しいですが、相応に充実しそうな予感。

コメントを残す