見出し画像

プログラミングは「まずやってみる」

いつも適当にリクエストされた質問に回答しているサイトで「プログラミングを勉強しているが本やサイトでは説明が難しくて理解できない」という質問がありました。この手の質問は多いです。

で、回答ですが「とにかくやってみる」です。

全体を理解しなくて良い、やっていけば理解する

よく、本を一冊読まないととか、全貌を理解しないとならないと思い込んでいる方がいて、そういう人が途中で挫折するケースも多いです。別にあるプログラミング言語の全てを知らないとプログラミングしてはいけない、なんて規則はありません。まず動かしてみる。何かわからないことが出てきたら実際にやってみる。そして、ちょっと変えてみてとことん何が起きているのかを追求する。これが1番の早道です。

昔話

自分がプログラム、プログラミングに触れたのは40年くらい前です。その頃はインターネットなんて便利なものはないし、本や雑誌とたまたま近くにあったパソコンショップが全てでした。
その頃、テレビでパソコンを勉強する番組があり、その番組に出てきたのがドクターパソコンこと宮永好道さんでした。

パソコン、プログラミング、ドクターパソコンとの出会い

Wikipediaでは「パソコンは、ソフトが無ければただの箱」という名言を残したと解説されていますが、自分はそれよりも「パソコンは習うより慣れろ」かと思います。これはプログラミングに限ったことではなくて、パソコンを使ってみたいならあれこれ考える前にまずは使ってみなさい、ということです。が、プログラミングにも同じことが言えます。

近所のパソコンショップに入り浸って使わせてもらったり、デパートに展示されていたデモ機をいじってみたり、友達が買ったパソコンを使わせてもらったり。小中学生で小遣いも乏しくそうそうゲームなんて買えないので、雑誌とかに載っていたゲームのプログラムをパソコンに入れたりするのが主流だったりした時代なので、パソコンを使う=プログラムを入力する、というのが多かった時代です。まあ、単に入力しているだけで理解はしていないのですが、それでもそれをちょっと変えてみたりとか、本でどういうものか学んだりして、徐々に知識が増えていきました。
そういう点では、今のインターネット時代よりも豊富に実用的なサンプルが転がっていたというのは恵まれていたかもしれません。
何しろ、プログラムに間違いがあって、その訂正版が2〜3ヶ月後に出たりします。それまで待てないので、色々あーでもないこーでもないといじったりするので、実践的だったとも言えます。もっとも、プログラムのソースリストの一部が抜けていた、なんてこともあり、そればかりはどうにもなりませんけど。

そういう意味では、今はネット上に無料で触れる学習教材とかありますが、あまりに教材的なものが多くて、興味を引かないのは問題かもしれません。

マシン語も今より身近だった?

そういう意味ではマシン語(機械語)も今より身近だった時代です。当時のパソコン(と言うよりもマイコン)はBASICが標準でついていましたが、これでできるものはそれなりのスピードです。動作の速いゲームを作るにはマシン語が必要になります。
当時はパソコン自体が一般的でないので、プログラミング言語も高嶺の花です。今ならゲーム作るならC#とかとUnityといったゲームエンジンを使うでしょうが、当時はC言語のコンパイラとかも高かったので、マシン語をアセンブリ言語で書くのが普通だったりします。アセンブラもタダではないので、場合によってはハンドアセンブルと言って、アセンブリ言語で書いたものを人間が自分でマシン語に置き換えて、それをダンプリストとして入力したりします。
現在はマシン語とかアセンブリ言語とかを直接扱うプログラマは全体から見ればそう多くはないと思います(人口が違うので、人数的にはあまり変わってないかもしれませんが)。が、当時はそれが普通でした。
ですので、初めてC言語コンパイラに触れた時はすごい楽になったと感動しましたし、そんな単純なパソコンやプログラミング言語から段々と複雑なものにステップアップしていったので、逆に良かったのかもしれません。今の人は最初から高機能、多機能、高級な言語がほぼほぼタダで使えたりしますから。
それは良いことではありますが、逆に大変かもしれません。自分の世代のような年寄りはアセンブラがC言語になって感動したし、そのC言語で大変だったメモリ管理を自動でやってくれる言語が登場したのは画期的でした。大変だったメモリ管理を知っているので、それがどれだけありがたいか分かるし、なんでそういうことになっているかも知っています。そして、理想と現実のギャップがやはりあって、空そうだと思ったりもします。
でも、最初からそういう高級な言語をやってしまうといきなり「自動で管理してくれます」が普通で、それが何のためにあって、何が嬉しいのか、理屈では分かってももはや実感できないでしょう。

また、何かするにはとにかくマシン語(アセンブリ言語)でした。当然、実際のCPUの動きに密接したものですのでCPUの仕組みを知らないといけないし、レジスタとは何か、メモリとは何かを知らないといけません。
何をするにもマシン語の細かい命令に置き換えないといけないのですから、論理思考とかモジュール化とか、当たり前のように使えないとやっていけません。今ならprintとかconsole.logとかで1行書けば画面出力するのも簡単ですが、マシン語レベルで画面を出力するだけで何十行とか書く必要があります。おまけに間違うといわゆる「暴走」状態になり、リセットする必要があります。今時のパソコンには表立ってリセットボタンはないのですから、どれだけ安定していることか(もちろん、リセット操作は今でもあります。ただ、昔は何かの拍子で誤ってリセットボタンを押してしまう事故もよくありました。火災報知器のようにカバーをつけて間違って押さないようにしたり、とか)。
高級言語ならモジュールもクソもない1000行のダラダラコーディングしても問題ない(いや、大有りですけど)ですが、マシン語レベルでそんなことやってたらプログラムがいつまで経っても完成しません。さらには容量制限もキツかったので、今で言うリファクタリングみたいなことも当たり前です。

訓練は順を追って

そんなわけで、今時はいきなり先人が試行錯誤した結果のモダンな言語を使ってプログラミングをすることになります。が、それってどうなのでしょう。
例えば、航空自衛隊に戦闘機パイロットになるべく入隊した人がいたとして、いきなりジェット戦闘機で訓練するかといえばそんなことはありません。今時はパソコンのフライトシミュレータとかもかなりリアルで、それで練習していきなりジェット戦闘機を操縦できるかもしれませんが、まずはプロペラ機から訓練を始めます。
プログラミングで言えば、プロペラ訓練機がアセンブラ言語とか昔のC言語とかで、ジェット戦闘機が今時のモダンな言語でしょうか。
まあ、もしかしたら戦闘機もシミュレータとまずは教官が操縦する機体で操作しないでスピード感やGの感覚を覚えていって、それから実機操縦という形でジェット戦闘機だけで訓練ができるのかもしれません。
とは言え、いきなり全部の機能を覚えて実戦というのは無理だと思います。そんなのできるのはガンダムに乗ったアムロとか、バルキリーに乗った一条輝くらいです。
とにかく一度に全部覚えてやろうとせずに、実際に動かしてどうなるのかを確認しながら進めるのが、結果的に1番の早道だと思っています。コピペがダメというのも同じことです。コピペすること自体はまあ良いのですが、それがどんなふうに動くか理解しないで持ってきたって意味がありません。動かしてみて、どうなるのか確認しないと。

プログラミングは習うより慣れろ

最後に結論。まずはやってみる。全体を覚えることよりも、覚えながら実際に動かしてみる。
山本五十六は「やってみせ、言って聞かせて、させてみせ、ほめてやらねば、人は動かじ」という言葉を残しましたが、プログラミングは「やってみて、動作を理解し、変えてみて、確認せねば、プログラムは動かじ」です。

拙い記事でございますが、サポートしてもよいよという方はよろしくお願いします。著者のやる気アップにつながります。