ペペロン頭脳

いわゆるエスアイヤーに勤めてるけどまともにエスアイやったことないITエンジニアのメモ的なアレ。

プログラミング知識皆無だったころの自分が持っていた疑問に答える

プログラミング(ほぼ)未経験の状態からITエンジニアとして就職して、4年が経った。
節目というほど節目でもないが、首記の件について思い起こしつつ書いてみようと思う。
あくまでもざっくりした説明にとどめるので細かいツッコミはなしで。

センター試験の問題にあったプログラムをメモ帳に書いて、拡張子をexeにしたけど動かない。

これは高校生のときだな。
すごく恥ずかしい行為なのだが、世界中探せばこういう勘違いをした人はきっといるはずだ!いてくれ!

君は3年ほど前からノートPCをいじっていたとは思うが、プログラミングの知識は0だった。
巷にはフリーソフトがたくさんあって、いくつか気に入って使ってるものもあるが、自分でそういうものを作れるとは思えないし調べる気もないというアンニュイ感あふれる受験勉強生活を送っていたはずだ。
で、目についたのがセンター数学ⅡBのプログラミング問題。
あれはBASICという言語で書かれている。

10  LET N=1
20  PRINT "n=";N;
30  N=N*2
40  IF N<20 THEN GOTO 20
50  END

なんとなく単語から意味が分かりそうな気もするが、君には暗号にしか見えていない。
そのままテキストとして打ち込めば動くような気がしていたのだろうが、残念ながら世界は甘くなかった。
これは人間が読み書きしやすいように定められた言語で、機械は直接読むことはできないのだ。
これが?と思うかもしれないが、実際にプログラムを走らせるにはこれを「機械語」に翻訳してやる必要がある。
機械語はコンピュータという機械が直接理解することができる数値の羅列。コンピュータは0と1で動く、というのはよく知られているが、まさにそれだ。人間様も鍛錬を積むことで読み書きできるらしいが、普通はやらない。
そしてこの機械語への翻訳処理を行うプログラムのことを「コンパイラ」と呼ぶ。名前くらいは聞いたことがあるんじゃないか?
Windows向けのBASICコンパイラをどこからか手に入れて、上のプログラムを翻訳・実行してやるとこう表示されるはずだ。

n= 1 n= 2 n= 4 n= 8 n= 16

ちなみに、世の中には一度翻訳する手間をかけずとも、書いたまま実行でき(ているように見え)る言語(と実行環境)も存在する。
それを知るのはもっと後の話。

うーんしかし半端にPCをかじったくらいの時にありがちな、拡張子についての勘違いとか拡張子信仰のようなものが垣間見える。

データベースって何に使うの?エクセルでできるじゃん。

プログラミングの話ではないが、密接に関係する事柄なので。
これはいつだったか。教科書か何かにデータベースの説明がちょろっと載っていたが、データを管理するソフトということ以外よくわからなかったのだった。
オーケー。たしかに君はExcelで住所を管理して年賀状を作っていたな。あれも一種のデータベースだ。データを項目ごとに表として整理・保存できる仕組みだ。
だが、教科書に出ていたのはそういうこまごました台帳ではなくて、もっと大きなスケールで利用されるものなんだ。
君は「パソコン」しか知らず、社会のあちこちで動いている情報システムのことはよく知らなかったのだから無理もない。

たとえば君はYahoo!Japanのアカウントを持っているな?
検索エンジンYahoo!メールもYahoo!そしてテキストサイトFlashサイトの群雄割拠、そういう時代だったな。

話を戻すが、自分のIDや送受信したメール、ヤフオクの利用履歴なんかはどうやって保存されているのだろう?Excelみたいにファイルに書き込んでいるのか?
できなくはないかもしれないが、何百万何千万のアカウントがある巨大なデータからひっきりなしにレコードを探して読み込んで更新や追加もして、というのは無理がある。
特に更新や追加が発生する場合、色んな表の整合性を保ちつつ高速に処理するというのがExcelのような仕組みでは困難なのだ。
そこで必要になるのが、こういった処理を専門にやるデータベースソフトウェアだ。多くの場合、データベース専用のサーバーを用意して動かす。
これを使うと、「この表とあの表から、このIDに紐付くデータを取ってくる/更新する」といった処理がやりやすくなる。プログラムと連携させるのにも向いている。
そしてなにより大量のデータを安定的に・高速にさばけるよう工夫が凝らしてあるのだ(真価を引き出すには知識が必要だが)。

この話をSuicaのシステムとか銀行のお金の管理なんかに置き換えてみると、より重要性がわかってくるはずだ。

数値計算の結果を黒い画面に出せることはわかった。でもどうやったらフォトショみたいなソフトができるの?繋がりが見えない。

これは大学の時。1年次の必修科目に情報処理入門というのがあって、文理関係なくC言語とHTMLの勉強をさせられるのであった。
このとき初めて「コンパイラ」を使ってコードから実行バイナリを生み出す体験をしたわけだ。
しかしたかだか10時間そこら、しかもC言語。教えられる内容は簡単な数値計算がせいぜい。習った通り素数を羅列したりは出来るようになったが、この延長でGUIのアプリケーションが作れるとは到底思えない。

それは君が「OS」の役割について一部しか理解できていないからだ。

たとえばWindowsのペイントソフト。
まずウィンドウがある。メニューがある。絵を書くためのキャンバス、ペンやブラシとその太さを変えるボタン、色を選ぶパレットなど色々な部品が集まって出来ている。
こういった部品を画面に出すために、「WindowsAPI」というものが用意されているのだ。
これはWindowsというOSが提供しているインターフェイス(窓口、関数群と思ってもらえればOK)で、必要なヘッダファイルを集めてきてインクルードすると自分の書いたプログラムの中から呼び出せるようになる。
これを使って部品を用意したり、ファイルの読み書きなどOSの機能を呼び出したり、ボタンを押した時(イベント)の動作などは自分でプログラミングしたり、というのを積み上げていくとやがてGUIアプリケーションが出来上がる。はずだ。
ここまでの話でWindows向けアプリが他のOSで動かない理由もわかって頂けたと思う(Javaで書いたアプリなどを除く)。

また、生のままのWindowsAPIを扱うのは割と煩雑なので、外側から包んで扱いやすくまとめたもの(フレームワーク)もある。VisualStudioなど開発用のソフトを買うと利用できるようになる。
そして10年後の君は平日ほぼ毎日VisualStudioと向き合っている。



長くなったのでこのへんにしといてやろう。
もう一度言いますが、あくまでもざっくりなのでよろしくオネシャス。