見出し画像

プログラミングの外側にあるもの

プログラミング教室に行ってプログラミングを学習しても自分の好きなものが作れるようにならないとか悩んでいる人は多いと思います。今回は「プロラミングの外側にあるもの」について考えてみたいと思います。要素がたくさんあるので発散しがちかもしれませんがお付き合いください。

プログラミング教室では何を習うのか?

私的なスクール以外にも専門学校や大学でもプログラミングを教えたりします。私的なスクールでは子供向けには次のような講座が多いのではないでしょうか。

  1. Scratchを用いたビジュアルプログラミング

  2. Raspberryを用いたロボットプログラミング

一般向けの講座では

  1. HTML・CSS・JavaScript

  2. PHPなどのサーバーサイドプログラミング

  3. IoT関係でC言語など

  4. 機械学習関係でPython

  5. 基幹系でJavaやC#

全体を通じて言える話としては、文法から入っていくということです。これは「順次(逐次)」「分岐」「反復」というプログラムを実行する順番である制御構造を学ぶ流れから来ています。この制御構造は構造化プログラミングといって、エドガー・ダイクストラらの流れから来ています。フローチャートも構造化プログラミングを可視化したものですし、C言語や、Javaなどのオブジェクト指向言語の流れに繋がっています。
構造化プログラミングでは書いた命令は上から順番に実行される(順次)が基本にあり、たまに(if文)で分岐したり、繰り返し文で反復したりという内容でシンプルです。あとは書き方({}の意味などを)覚えていけばプログラミングをマスターできるよねという話です。ここから話は色々な方向に飛びます。

教える側の理論

教える側としては、テキストを作って、動作を検証したものを学んで貰う必要があるので、ハードウェアを同じものにして、OSを同じものにして、開発ソフトウェアを同じものにして、テキストの内容が完全に動く形で学習者に提供する形になります。これは教室で教える場合の時間的な制約もあります。例えば、持ち込みのPCで環境構築を行おうとして、1名が環境構築ができないとなるとそこで授業が止まってしまうからです。その対応で授業時間が潰れてしまうと、教室運営ができないとい悩みがあります。

だからなんなの問題

例えば新しいプログラム言語を学ぶときはHelloWolrdを出力するという何となくきまっています。例えばC言語では

 #include  <stdio.h>
int main(void) {
   printf("Hello World");
   return 0; 
}

このプログラムを実行するとコンソールにHello Worldと出力されるわけですが、ここから例えばIoT機器を利用して温度測定して、ある閾値を超えたらメールが飛ぶようにするプログラムを考えるとなるとだいぶ飛躍があるように思います。文法の基礎から目指すアプリを作れるようになるまでは平野から富士山頂上を目指すようなものでとても遠いように思います。
ちなみにHelloWorldは趣味でやっている人がいて、「40言語で「Hello World」をやってみよう!!」というサイトがあります。このサイトでは同じHello Worldを出力するプログラムでも、言語によってだいぶ違いがあることがわかります。
話は飛びました、もとに戻すと、先に一般向けの講座では

  1. HTML・CSS・JavaScript

  2. PHPなどのサーバーサイドプログラミング

  3. IoT関係でC言語など

  4. 機械学習関係でPython

  5. 基幹系でJavaやC#

と書きました。これはホームページを作成するや、IoT機器を操作するや、認識系AIを作ると行った、目的があり、その目的により対応する得意な言語が異なるためです。こういったスクールでは最終的な成果物(ゴール)を定めているので、一緒に山を登っていけばある程度の結果にたどり着けることになります。
ここで問題になるのは終盤に進まない限り、プログラムは基本的に「実行」ボタンを押して実行して確認していくという点です。「実行」というトリガーを自分で押して、順次にプログラミングが実行されていく構造化プログラミングですからこれは致し方ないのかもしれません。
ここまでをまとめるとプログラミング教室では

  1. 確実に動く環境で学ぶ

  2. 構造化プログラミングから入る

  3. 「実行」を押して実行する

といったところが特徴になりそうです。

プログラミングの外側にあるもの

プログラミング環境を整える

自宅でプログラミンを行う場合は、自宅のPCにプログラミング環境を整える必要がある。プログラミング環境として

  1. プログラミングを入力して保存する環境

  2. 入力されたプログラムを解釈、実行する環境

の2つが必要になります。プログラムを入力して保存する環境はメモ帳でも構いませんが、最近はプログラム入力専用のメモ帳のようなものをエディタと言いVisual Studio Codeなどが有名です。最近はVisual Studio Codeがデファクトスタンダードのようになっていますが、日本語化や設定方法がコマンドを利用したものになり、初心者の人には少しわかりにくいと思っています。だたMicrosoftが管理しているのでインストール時のトラブルは少ないです。
次にプログラムを解釈、実行する環境ですが、これはさまざまです。例えばPythonという言語の場合は、Python本体をインストールする場合やAnacondaと呼ばれる総合開発環境をインストールする場合など、インストールするものが複数あります。
Javaの場合はEclipseという総合開発環境を使う場合が多いですが、Eclipseを日本語化したものにAll in one Eclipse(Pleiadesプラグイン)というものがありどちらにも細かいパッケージの違いがあります。
更に、それぞれにバージョンの違いがあり、またOSによっても違いがあります。
また各クライアント(インストールする)PCの設定の違い(ユーザー名に日本語が含まれているかどうかなど)やインストールするアカウントの権限(管理者権限の違い)があります。つまりプログラムの解釈、実行環境を整えるには次のような組み合わせになるのです。

  1. どの環境をインストールするのか?

  2. どのバージョンをインストールするのか?

  3. どのOSのどのバージョンにインストールするのか?

  4. インストールするアカウントの設定は正しいか?

  5. インストールするアカウントの権限は正しいのか?

  6. セキュリティソフトなど他のソフトウェアの影響はないか?

多くの場合、そのままインストール可能に作られていますが、特に日本語周りでトラブルになることが多いです。インストール時にトラブルになった場合は、エラーメッセージを元にこれらを潰していくスキルが必要になります。これからプログラムを学ぼうと思っている人にこれは結構大変な作業だと思います。
これがまず第一のプログラミングの外側にあるものです。プログラミングのスキルとは全く別なPCやファイル、ネットワーク全般に関する知識が必要になります。

オンラインプログラミング環境

こういった問題を解消するために出てきたのがオンラインプログラミング環境です。C言語ではBitArrowという環境を使っていますし、JavaなどはPiza IOがあります。PythonではGoogle Colabolatoryが有名です。
これらのオンラインプログラミング環境ではブラウザがあればプログラミングの学習ができるので、大変便利です。注意点はGoogle Colomeブラウザでアクセスするといったところくらいです。一般的な入門書でプログラミングを学習する場合はこれらのオンラインプログラミング環境で十分だと思います。

どこで実行されるの、どこに保存されるの問題

オンラインプログラミング環境は便利なものですが、どこで実行されるのという問題とどこに保存されるのといった問題があります。Google ColabなどはプログラムはGoogle Driveに保存されますが、収集や作成した画像は、実行後、数時間立つと消えてしまいます(インスタンスが落ちる)。このことを知らないとファイルが消えてしまったように見えるはずです。このような状態を回避するために、Google CorabにGoogle Driveをマウント(くっつける)のですが、セキュリティの関係でこの手続きが煩雑で直感的に理解しにくいものになっているようです。
このようにオンラインプログラミング環境は便利なものですが、それ故に発生する「どこで実行されるの、どこに保存されるの問題」が第2のプログラミングの外側にあるものになります。

だれが実行するの、いつ実行するの問題

オンラインプログラミング環境だけでなく発生する問題で「だれが実行するの、いつ実行するの問題」があります。プログラムの実行は通常「実行」ボタンを押して実行することになります。「実行」ボタンを押すと書かれた命令が「順次」で実行されていきます。
ところが、みなさんがいつも使うアプリは「実行」ボタンを押していますか?というと必ずしもそうではないのです、目覚ましでアラームのアプリをセットした、6時になって「実行」ボタンを押さないとアラームが鳴らなかったとしたらかなりおかしなあぷりになってします。アラームのアプリは「6時」という時刻をトリガーに実行されるようになっています。
例えば、お絵描きのアプリがあって、「実行」ボタンを毎回押さないと絵がかけないとしたら変です。お絵描きのアプリは「なぞる」という行為がトリガーになってプログラムが実行されるようになっています。
これが大きなギャップになっていると思います。構造化プログラミングの処理はフローチャートを見ても分かる通り、上から下への処理の流れ(スレッド)になっているのです。だから実行ボタンを押して実行して終わるという流れになるのです。
ところが普段我々が接しているアプリの殆どは実行ボタンを押して実行するものではなく、他の、何かのトリガーで実行されるようになっています。このようなプログラムのことを「イベント駆動型」のプログラムと言います。このイベント駆動型のプログラムの作成方法が実は難しいです。Javaはインターフェースまで知らないと行けないし、インターフェースを知っていてもなんで動くの?を答えるのは多分Javaをマスターしている人でもちゃんと説明できないと思います。
何より、イベント駆動型のプログラミングの手法は言語やフレームワークによりさまざまで、これといった決まりがないんです。だから使う環境に合わせて学習というかなれるしかない。ただ動きが分かればあとは構造化プログラミングの知識は使えます。
プログラミングの文法の話の外側にイベントを扱う方法が書く言語によって異なって存在するというのが、プログラミングの外側にあるものの第3になります。

フレームワークやライブラリ

プログラミングができるようになるとその言語で実現可能なことは何でもできるようになります。だから今の社会があるわけです。誰かが作ったプログラムでデジタルは動いています。
でも僕らが一人で作れる範囲は、犬小屋からせいぜい頑張って一軒家といったところまでだろうと思います。のこぎりと金槌でスカイツリーを作れるかといえば、無限の時間を使えば作れるかもしれませんが、現実的ではありません。
例えば建築の世界にはツーバイフォーといった仕組みがあります。これはある規格の建築資材を用意しておいて、それを組み立てるという工法です。これにより工数や納期を大幅に削減することができます。プログラムの世界にもツーバイフォーのようなものがあって、これをフレームワークと言います。フレームワークを使うと簡単にアプリを作ることができます。ノーコードのアプリ開発環境もフレームワークと行っていいでしょう。フレームワークを利用することで同じようなアプリを高品質で作成することができます。その中で作成する場合はフレームワークは便利なものですが、フレームワークの外側に出ようとすると独自の実装が必要になるので大変です。ツーバイフォーで大きなビルが作れないとの一緒です。
フレームワークはアプリを作るなどのゴールが明確であるのに対し、ある機能を提供するために存在するライブラリというものもあります。ライブラリを使うことで自分が実装(プログラミング)する量(工数)を減らすことができます。世の中にはたくさんのフレームワークやライブラリがあるため、プログラミング教室などで扱うフレームワークやライブラリは代表的なものだけになります。
多くのライブラリはオープンソースのライブラリとしてGitHubなどで入手可能です。これがプログラミングの外側にあるものの第4番目です。

命名規則と文法の問題

プログラミングは文法に則って記述しないとエラーになってしまいますが、エラーにならないんだけど、このように記述したほうがよい問題があります。これを命名規則やコーディング規約と言います。Javaなどは結構厳格に決めることが多いです。例えば

public class HelloWorld {
}

というプログラムがあったときに、HelloWorldの部分は自分が付ける名前で、実はhelloworldでもhelloでも構いません(publicな場合は、Javaはファイル名も合わせないといけませんが)。
HelloWorldなどをクラス名と言いますが、プログラミング教室では「クラスの名前は適切に付けましょう。クラスの命名は名詞の英単語の組み合わせで単語の先頭を大文字にします。」などと話すわけです。
ところが、この中に記述する変数を

int a = 1;

などと記述するわけです。aも自分で付ける名前で、なんでもいいのですが、文法を学ぶ段階ではこの1に意味がないため、aと名前をつけているだけになります。
このようにプログラムにはプログラマが変更可能な部分があり、これらの命名は論理的に結構難しくて何も考えないとaなどに崩れてくるのです。これがプログラミングの外側にあるものの5番目です。

ちなみに、このプログラムをChatGPTに次のうように依頼すると
「変数に1を入れてその変数を出力するJavaプログラムのコードをお願いします。」

public class Main {
    public static void main(String[] args) {
        // 変数を宣言し、1を代入します
        int myVariable = 1;
        
        // 変数の内容を出力します
        System.out.println(myVariable);
    }
}

となります。aの代わりに、myVariable(私の変数)、とい名前にしています。生成AIはこのように名前を適切につけようとする傾向があるため、プログラムの可読性が良くなっています。本人には英語アレルギーがあるのでaでも良いのかもしれませんが。そこで日本語にしてみましょう。これでも動きます。

public class メイン {
    public static void main(String[] args) {
        // 変数を宣言し、1を代入します
        int 数値 = 1;
        
        // 変数の内容を出力します
        System.out.println(数値);
    }
}

int  数値 = 1;
となりました。
int あ = 1;
よりかはわかりやすいのではないでしょうか。

だらだらと記述してきましたが、プログラミングの外側にあるものが少しでも伝わればと思います。

この記事が気に入ったらサポートをしてみませんか?