プログラミング/学習方法

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動
※ 初心者向けの基礎IT知識についてなら、既に『プログラミング/プログラミング初心者むけの共通知識』があります。
この学習方法のページでは、学習のノウハウについての説明だけにしてください。
また、初心者むけという事を意識してください。

動くコードを書く人を信用しよう[編集]

たとえば、イラストレーターの界隈では、絵をかかないで作品を発表しない人が、どんなにイラストの技術論をかたっても、まったく実際の絵描き職の界隈からは信用されない。

仮にその、絵を描かないでイラストの技術論をかたってる人の主張のなかに、部分的に正しい点もあったとしても、そんな一部の長所を何ヶ月もの時間を使って探すよりも、実際に絵をかける絵描きに金を払って技術論の著作でも執筆してもらったほうが安上がりで早い。

なんで、わざわざこんな比喩を言うかというと、実は日本のネット上の電子掲示板などのアマチュアのIT評論家のなかには、実装の確認をあまりしてない人が、そこそこ多くいる。 たとえば、新しいプログラム言語が出てくると、その言語の情報をネットで勉強するのだが、 しかし、まったく、実際にコンパイルして実行ファイルを作って確認したりはしないで、ただネット上の文字のみの情報を追いかけているような人。(単に不勉強な人なのか、それとも掲示板会社に雇われた書き込み業者か、あるいは情報商材屋による誘導記事か・・・。掲示板などには、各種の業者などの入り浸っている可能性もあるので、実際に動くコードを書ける人を信用しよう。)

新しい規格やIT情報などが出現すると、それを勉強するが、しかし肝心のプログラミングで実験しない人は、けっこう多いのである。


(絵を描かないで技術論をかたる)人の技術論が正しい保証すら、無い。しかし、実際に絵をかける人の技術論なら、すくなくとも、その人の絵をマネするくらいには、役立つ。

プログラミングの世界でも同様である。

誰かプログラマーを先人として信用するなら、つたないアプリでもよいので、実際に動作するプログラムのコードを書ける人、 もしくは、実際に動作するアプリの製作者を、信用しよう。

そして、そういう人を見分けられるようになるには、ためしに自分でも実際になんらかのアプリケーションを制作してみるのがよい。

というのも、IT技術では、実装のさいの制約がいろいろとあるのだ。 特定のミドルウェアをいくつもインストールしないといけないとか、それらミドルウェア郡の文法にしたがわないといけないとか。


また、日本では、そういう動くコードの書けない人でも、「基本情報技術者」みたいな名前の資格を取れてしまう。

資格試験は、必ずしも特定のプログラム言語を目的にしたものではないので、試験でもプログラム技能は問われないが、しかし消費者のなかには、それに胡坐(アグラ)をかいて、いつまで経っても資格試験だけの肩書きのための机上の知識を求めていて、肝心のアプリ製作を始めようとしない人が残念ながら、けっこういるようだ。


IT技術は膨大にあるので、すべてを実験するのは困難だが、しかし、せめて、本人の一番得意とする分野のIT技術くらいは、 実際にコンパイル、ビルド、実行などの実験くらい、しておいてほしいものである。


自動車の開発では、最終的には実際にその自動車を組み立てて、走行試験などの実験をする。

ITでも同様、最終的には、そのソフトを実際にビルドして実験する必要がある。


現在では、製品レベルの高度なアプリは、ミドルウェアを使って集団作業で分業で設計するのが主流なので、そのミドルウェアの機能に制約される。ミドルウェアを使わないで開発することは、開発費や検証作業が膨大になり、非現実的である。

こういう、ミドルウェア郡の対応状況などは、たいてい、ぜんぜんISO規格などに規格化はされてない。なので、対応状況を調べるには、実際に実験をして調べるのが確実である。

教育の充実の必要性[編集]

さて、実際の企業などでのIT業務は集団作業であるので、開発に採用するプログラム言語などの技術は、教育をしやすい技術であることも重要である。

そのプログラム言語の、初心者むけの解説書や解説サイトや電子掲示板などが、(すくなくとも日本では)充実していることも、重要である。そのコミュニティが、情報のやりとりをしやすいコミュニティであることも、重要である。

もし仮に、ある新プログラム言語で、公式サイトで「Hello World」としか書けないサンプルコードしか公式サイトで紹介されない言語があったとしても、社会ではその言語はいらない。


このため、初心者は、市販の教材の充実している標準C言語や、あるいは JavaScript など90年代~2001年ごろからある言語や、流行して市販本も充実している Python などを学ぶのが良いだろう。

ネットでは、2010年以降の新らし目のプログラム言語が取り沙汰される事も多いが、しかし、そういう新言語は大抵、市販の解説書も少ないので、初心者は避けるべきであろう。

それでも、どうしても新言語を初心者が学ぶなら、せめて公式サイトのチュートリアルで、条件分岐や繰り返しなど、最低限の制御構造くらいは、初心者むけの噛み砕いた説明が、公式サイトなどに完備している言語を学ぶべきだろう。


もし、ロクにチュートリアルも無く、単にABC順に関数などを紹介しているだけのような新言語なら、そういう言語は避けるべきであろう。


なぜなら、もし単に画面を文字を表示するだけなら、わざわざプログラムをする必要は無く、Windows「ペイント」や「メモ帳」のようなアプリでも充分だからだ。

ホームセンターでドリルを買っていく人の欲しい結果は、穴である。ドリルは手段でしかない。プログラム言語も、手段でしかない。

ユーザー視点の必要性[編集]

ユーザー側からの視点でも、使用するOSの普及状況による制約、ネット環境の回線速度などの限界による制約、いろんな制約がある。


極端な例をあげると、たとえばゲーム開発で、 もしWindowsでない新規のOSをあなたがアセンブラなどを活用して設計して、 その新OS上で動くゲームソフトを設計しても、

世間のほとんどのPCゲーマーはWindowsユーザーなので、独自OS上のゲームなんて、ユーザーにはメリットが無い。

なので、現実的な実装の確認できない技術には、あまり価値が無い。


極端な例をいうと、ポインタだの新しい最新言語の文法を勉強しているだけで、なんのアプリも作らない人よりかは、なんでもいいので、何か自分でよく使うアプリを作る人のほうが、プログラミング技術としては優秀である。(ただし、就職活動での企業側からのウケはどうか知らないが・・・)

Wikipediaの限界[編集]

さて、wikipediaおよびwikibooksの仕組みでは、アプリケーションをアップロードするようには、できてない。

また、原則的にwikipediaは、GitHubのようなコード公開サイトではない。


なので、ウィキペディアでは、プログラミング技術は あまり細かく教えられない。

なので、プログラミング勉強でのウィキペディアの利用は、 あくまで初心者段階での、少しのあいだだけ、書籍購入費などの費用を節約するための手段として割り切って、

実際の勉強は、無料の勉強なら外部サイトや外部ブログなどで行おう。あるいは書店で有料の本を購入しよう。


言語の理念が変わる事を意識する[編集]

プログラミング言語の文法は、数年ごとに改訂されます。

この際、初心者にとって混乱の原因になったり、不規則な文法などは、廃止されたりしていきます。

また、言語の理念自体、年月が経つと次第に変化していきます。

そのため、古い理念に基づく機能や文法などは廃止されていきます。

なので、文法の細部を暗記しても無駄です。


また、見落としがちですが、理念を暗記しても無駄です。なぜなら理念ごと、変わるからです。

たとえば Java の理念は、1990年代と2020年代の今とでは、確実に違います。(たとえば、90年代頃のかつて「Javaアプレット」などの技術があったが、IT業界の流行と理念が代わり、「Javaアプレット」は廃止・衰退した。)


さて、不規則な文法を認める事は、入力はラクになりますが、しかしバグなどの原因にもなります。また、第三者がコードを読みづらくなる場合があります。このため、古いバージョンで認められていた不規則な文法が廃止される事も、いろいろな言語でよくあります。

たとえば、変数aの内容の画面出力の際、

print(a)

print a

とカッコ抜きで書くのを認めるべきかどうか、というような問題です。(古いPythonでは「print a 」みたいなカッコ抜きの書式が認められていたが、Python 3以降の現在では禁止されている。)


諺(ことわざ)で「あちらを立てれば、こちらが立たず」と言いますように、イイとこ取りは出来ないのです。

なので、プログラム言語そのものの開発では、理念の取捨選択が定期的に行われ、理念が変化します。

その理念が、「今後いつまで、その理念が続きそうか?」という予想も含めて、理念を分析するようにしましょう。


PythonにしろPHPにしろGo言語にしろ、登場したばかりの時や普及前のときは、文法が比較的に自由だったり不規則な記法が多くても、普及とともに、文法が厳格化していく事がよくあります。

なので、誕生時や普及前の理念を、いまだに鵜吞みにしつづけないように気をつけましょう。

分野別の学習方法[編集]

C言語の学習[編集]

C言語の学習は、やはり、条件分岐や繰り返しなどの、基本的な文法事項を習得する事です。

コマンドラインだけのアプリケーションでもいいので、実際にコードを書いて実行してみましょう。


なお、「ポインタ」は、余裕があれば学ぶに越した事はありませんが、実は現代では、他の言語では、あまり使いません。

まして、malloc だのメモリ操作の関数は、まず初心者には不要です。

ただし現在では、C言語を直接イジる機会は減っています。なぜなら、たとえば web系の用途なら、JavaScript や PHP など、より特化した言語を使う機会のほうが増えているからです。


web系の学習[編集]

インターネットのプログラミングの学習では、まず、(プログラム言語ではないですが)HTMLの知識が必要です。

とりあえずHTMLで、文字の色を変えたりとか、表を作ったりとか、画像を表示したりできるレベルになるまでは、先にHTMLを学びましょう。

なお、HTMLで作成した入力フォームを機能させるには、JavaScriptまたはPHPなどの知識が必要ですので、入力フォームの動作の学習は後回しにしても構いません。


さて、HTMLで作ったwebページに、ユーザーからの入力に反応するなどの動作をつけるには、JavaScriptなど他のプログラム言語が必要です。

web系のプログラミングでは、webに特化したプログラム言語(JavaScriptまたはPHPやGo言語)を使うほうが効率的です。


一応、CGIなどを仕組みを使うと、C言語でも、他のどの言語でもサーバーアプリを動かせるのですが、しかし、CGI利用は、だいぶ学習が非効率です。

なので、JavaScriptPHPなど、web専用的な言語を使うほうが効率的です。

サーバ側を学ぶなら、PHPです(なぜなら大手サーバソフト Apache が標準スクリプトとしてPHPに対応しているので)。

クライアント側(サーバ側でない一般利用者のこと)を学ぶなら、JavaScriptです。

初心者は、まずクライアント側のjavaScriptを学ぶほうが効率的です。

サーバ側だと、Apacheなどのサーバソフトの使い方も習得する必要があり、やや学習の敷居が高くなります。


なお、サーバ側もクライアント側も前提の知識として、HTMLの知識が両方とも必要です。

なお、Go言語は、サーバ系への特化を謳っていますが、現状(2020年に記述)では市販の解説本が不足しているのが難点です。


なお、web系の学習では、必ずwebブラウザ(FirefoxやGoogle Chrome や Microsoft Edge など)で実行結果を確認しましょう。


近年のJavaScriptには、難しい機能もありますので、それらを初心者は学ぶ必要はありません。


webフレームワークは後回し

なお、近年、web系では「webフレームワーク」というライブラリ集みたいなのを使ってプログラミングするのがビジネス用途では流行していますが、しかし初心者にとっては、webフレームワークはパソコン内部の仕組みが理解しづらくなるので、後回しにしたほうが効率的です。

また、現状(2020年)の出版事情ではwebフレームワークについての市販の書籍が不足しています。そもそも、フレームワーク開発元によるチュートリアルの拡充などの教育も追いついていませんので、初心者には非効率です。

さらに、ひとつの言語につきフレームワークが数種類もあり、仕様のすり合わせなども全く行われてないので、もし将来的に普及しないフレームワークを学習してしまうと、将来的に学びなおしの手間が発生してしまいます。

なお、そもそもJavaScript や PHP などの言語側は、フレームワークを動作保証はしていません。フレームワークは、もとの言語(JavaScript や PHP)にとって、数ある対応アプリの一つに過ぎません。

なので、当面はwebフレームワークは後回しにしましょう。

Linuxの必要性

サーバー業界の実務では、サーバのOSは Linux が業界の標準です。

市販のプログラミング入門書だと、PHP などの操作説明で、Windows や mac OS などのOSで説明していたりする場合も多くありますが(出版社にとっての動作確認がWindowsやmacだとラクなのだろう)、しかし実務では、サーバOSはほぼ全てが Linux または BSD というオープンソースOSです。

極端な話、もしサーバ業界の実務につく気があるなら、PHPのマニアックな関数などの細かい仕様を学ぶよりも、まずLinuxの操作を習得するほうが先です。

やや高度な分野[編集]

Linux 関係[編集]

まず、書店にある、Linuxの勉強法は、方向性が かなり間違っている。

なぜ、 Linux の用途がサーバーだけなのか? (おそらく、資格試験の内容をパクっただけの内容かと・・・)

まあ、「デスクトップ用途が知りたければ、雑誌(『日経リナックス』とか)を読め」ってことかもしれんが。

でも、そういう事だって、ちゃんと初心者に紹介する必要あるでしょ。技術書の出版社は仕事をサボっちゃアカンよ。


あと、サーバー用途で使うにしろコマンドが微妙に古い。資格書に「yum」とかあったけど、yumは廃止される予定じゃん。

まあ、これも雑誌で最新情勢の確認できるのかもしれんけど、だったら、やっぱ「雑誌で確認しろ」という事も教える必要があるよなあ。


機械語やアセンブラ[編集]

機械語の勉強で、最初にインテル記法とかAT&T記法とかを覚えさせるのはマチガイ。

まず、実際に流通しているOS(Windowsなど)で、実際のアセンブリコードがどうなってるかとか、じっさいの機械語がどうなるかを確認すべきだ。


小学校や中学校で習うITの授業だって、マズは実社会で流通しているソフトの動作から習う。

そうしないと、二度手間の確認作業になってしまう。

英語と同じで、英語では、細かい文法を習うよりも前に例文を英語では習うが、機械語の周辺の学習もそれと同様。

あと、日本規格のCASLを覚えるのは、あまり得策ではない。日本では教育用にCASLが提案されていて工業高校でも教えているが、しかしCASL学習は実務とのギャップで二度手間になる。


どうしてもCASLを学ぶなら、あらかじめ、X86系とかWindows周辺での機械語の実例をある程度は身につけてから、CASLを学習するほうが良いだろう。(資格試験ではダメかもしれんが。つまり、資格試験が、なんか実務からズレている。)


関連リンク[編集]