khurata’s blog

khurata’s blog

プログラミングを学ぶには

(もともと「Yahoo!知恵袋」の「知恵ノート」だったものを転載しています)
(最終更新日時:2017/1/27)投稿日:2013/2/19

はじめに

 プログラミングをこれから学ぼうとしていたり、あるいは今学んでいる方々を見ていますと、膨大な書籍や説明サイトの存在、大量に出現する横文字・カタカナ言葉に圧倒されてしまい、何をどう学ぶべきか、「学習の全体像」を掴めないでいる……という姿を、よく見かけます。
 一体、何をどう学んで行けば良いのか、どの道筋を、どのように歩けば良いのか、それが分からず迷っている方々を、ここ「知恵袋」以外にも、私は多々見てきました。

 色々なプログラミング言語の本、様々なコンピュータ関連の書籍、多彩な説明ウェブサイトが存在する中で、「学習全体の道筋」や心構えを示しているものは、なかなか見あたりません。

 この「知恵ノート」では、その「道筋」「心構え」について、私なりに思うところを書き記していきます。

 

おすすめの言語

 初学者がよく発する質問の1つに、「ある言語(たとえば C とか Java とか)が出来ると、どんなプログラムが作れるようになるのですか・何が出来るようになるのですか」、というものがあります。
 しかしこれは不毛な問いです。 なぜなら、この質問は、「英語が出来ると、どのような文章が書けるようになりますか」という質問に似ていて、答えが出せないからです。

 「英語が出来る」と言っても、その分野、程度は、様々です。 幼稚園児程度に出来れば簡単なあいさつ文くらいは作れるでしょうし、小学校卒業程度に出来れば日常の出来事を作文するくらいは出来るでしょう。
 しかし、動物実験の論文を書いたり、書籍の批評をしたり、小説を書いたり、契約を締結したり、法案を起草する、……という事になると、ただ「英語が出来る」だけでは、とても無理です。

 「プログラミング言語が出来る」というのも、それに似ていて、「ただ出来る」だけでは、簡単なプログラムは作れるでしょうけれども、やりたい事が出来るとは限りません。
 たとえば PHP が出来れば、簡単なチャットや掲示板も作れますし、大規模な EC サイトや SNS を作る事も出来ますが、両者の間には、「小学生の作文」と「ハリウッド映画の脚本」ほどの差があるのです。

 「この言語が出来ると、何が作れるようになるのだろうか」という問いに、答えはありません。 それを問う事は、時間の無駄です。

 

おすすめの教材

 「初心者にも分かりやすく、言語がマスター出来るおすすめの書籍やサイトを教えてください」というのも、非常によく見かける質問です。 しかしこれも、残念ながら答えの無い問いです。

 プログラミング言語は、「言語」ですから、それを学び覚えるのは、語学の一種です。

 たとえば英語は、プログラミング言語よりもはるかに昔から学ばれ続けてきた言語です。 英語には、数え切れないくらいの書籍や学び方があり、その中には、これまた無数の「初心者にもわかりやすい」と謳った教材が在りました。

 しかし、もし、本当にそのような教材が存在したなら、「皆、英語がペラペラになっているはず」ですし、「新しい教材は出てこないはず」です。 「幼児からの英語教育に関して議論される」事も無いでしょう。

 つまり、そんな教材は、過去百年の間、1つも存在しなかったのです。 英語だけではなく、フランス語、スペイン語ポルトガル語、ロシア語、中国語……あらゆる外国語について、同じ事が言えます。

 プログラミング言語についても同様で、C、C++JavaJavaScriptPHPPerlRubyPythonC#VB……あらゆるプログラミング言語において、事情は同じです。 毎年毎年、新しい書籍や、説明サイトが作られていますが、それは、「初心者にも分かりやすく書かれている」教材など、存在しないという証拠です。

 見方を変えると、「プログラミング言語を身につけられる人」というのは、「決して分かりやすくない教材」を見て、自分から食いついていける人だけです。 英語も同じです。

 従って、「初心者にも分かりやすい教材」を探し求める時間は、無駄です。 せめてもの出来る事は、身近な人に、何を使って学んだかを聞いて、それを借りたり、見たりする事くらいでしょう。

 

おすすめの学習経路

 人は、往々にして、自分が学んできた道筋を最良のものと信じ、それを「新人」にも押しつけようとしがちです。 また、新人さんは新人さんで、「達人」の学んできた道は、「達人への道」だと信じてしまいがちです。

 しかし、それは必ずしも正しい思い込みではありません。

 ヒット作家の真似をしてもヒット作品が書けるとは限りませんし、人気歌手の真似をしても人気が出るかどうかは分かりません。 達人の真似というのは、やれば同じようになれるというものでは無いのです。

 Aさんの「学びの道筋」は、Aさんだけのものであって、他人には真似が出来ません。 Aさんの人生が、他人に真似出来ないのと同じで、Aさんの出会った書籍、その時にAさんが持っていた知識、つまりAさんの人生における諸々の出会いのタイミングというのは、Aさんだけのものです。

 Aさんが「私はこうして成功した」と言っても、Bさんがそれを真似る事は、所詮、不可能なのです。

 Aさんが読んで理解出来た本を、Bさんが読んで理解出来る保証は、全くありません。 その本を読む時にAさんが持っていた前提知識と、Bさんの持つ前提知識は、全く違うからです。

 自分の「学びの道筋」というのは、自分が切り開いていくしか、他に道が無いのです。 誰の真似も出来ません。 人の学んだ道筋は、あくまで参考に出来るだけであって、真似しても無駄です。

 

最初の1冊を選び、学び尽くせ

 おすすめの言語を問う事は無駄であり、おすすめの教材は存在せず、おすすめの学び方は自分で見つけるしかない、……ここまでは、見ようによっては絶望的な話だったかも知れません。

 しかし、それを前提として、学び始める事は、決して不可能ではないのです。 何万人もの「同じ人間」が、すでにその状況から始めて、学んできたのです。 他人に出来た努力は、自分にだって出来るはずです。 誰でも英語がペラペラになれるわけではないですが、英語ペラペラの日本人は確かに存在するのです。 しかも、多くのプログラミング言語は、英語よりも、はるかに易しい言語です。 希望は決して小さくありません。

 私が提唱したい方法は、「まずは、最初の1冊を選び、学び尽くす」という事です。

 最初の最初は、適当な言語の書籍を1冊選んで、それを何度も読み込み、実践しましょう。 その1冊を、完全に理解し、自分の記憶だけで書き下せる、と思えるようになるまで。

 「最初の1冊」「最初の言語」を選ぶ基準は、「読みやすいと思う」、「なんとなく出来そうだと思う」、「自分に合っているっぽい」という感覚で構いません。 最初のうちは、何が良いか、判断出来ないからです。 直感に従いましょう。
 たとえ悪評のものでも、間違った内容のものでも構いません。 ただし、選ぶにあたって、最低限の条件が、2つあります。

 1つ目は、「1冊で完結している」事です。 つまり開発環境も何もかもが「全部入り」のものを選んでください。
(もちろん、その開発環境は、自分の PC で、実際に実行出来なければなりません)

 2つ目は、「あまり古くない」事です。 ここ2~3年以内に出た書籍であれば、おおよそ大丈夫でしょう。

 他の書籍やサイトで学ぶのは、「最初の1冊」をマスターしてからで良いです。 むしろ、他で学ぶべきではありません。

 なぜならば、「最初の1冊」で、「まずは首尾一貫した知識をアタマの中に作る事」が大切だからです。

 初学者が、「色々な書籍」や、「さまざまなサイト」を、つまみ食いするように見てしまうと、「バージョン違いの知識」や、「著者の主観の違い」、「翻訳の違い」など、それぞれの間の違いに惑わされてしまいます。

 また、開発環境の構築や、その意味を知る事は、初学者にとっては、かなり難しいものです。

 初学者が、そのような「バラバラの知識」「バラバラの主観」「開発環境作成の困難さ」に捕らわれてしまうと、肝心のプログラミング学習が進みません。

 ですので、最初は、「1冊で完結している書籍」を選んで、その内容がたとえ間違っていようとも、まずは、その1冊を「丸呑み」するのが大事なのです。

 たとえ間違った知識であろうとも、「いちおう首尾一貫した知識」がアタマの中にあれば、その後は、他の書籍や、サイトをあたって、「今アタマの中にある知識」と、「新しく仕入れた知識」の違いを知る事が出来ます。 つまり、「アタマの中の知識のアップデート」が出来るようになるのです。

 「アップデート」は、元々の知識を持っていればこそ出来るのであって、何もないところをアップデートする事は出来ません。 「最初の1冊」をマスターする目的は、その1冊を身に付ける事ではなく、知識の「バージョン1.0」をアタマの中に作る事なのです。

 「もし、最初に選んだ1冊が、何度やっても、どうしても解らなかったら、どうすれば良いのか?」……不幸にもそうなってしまった場合は、それを「無かった事」にしましょう。 その1冊については、全て忘れて結構です。 知識のバージョン0.いくつは、破棄しましょう
 そして、最初の1冊を、また選び直して、また最初から、始めましょう。 厳しい言い方ですが、このリスクが負えない人は、プログラミングを学ぶのに向いていません。 

「最初の1冊」を補助するのは良い

 「最初の1冊『だけ』を読んでいても、途中で分からない言葉がいくつも出てくる!他の書籍やサイトが見られなければ、そこでお手上げだ」……と、 お思いの方も多いかと思います。
 確かに、本当の初学者は、「最初の1冊」に出てくる、いくつかのカタカナ言葉で、早くも挫折してしまう事があります。  こういう時、最初の1冊「だけ」しか読めないのでは、そこから先に進めなくなってしまいます。

 大丈夫です。 他の書籍やサイトを「参考として見る」のは、構いません。 あくまで「最初の1冊」を理解するという目的さえ見失わなければ。

 プログラミング初学者の、最初の大きな目的は、「知識のバージョン1.0をアタマの中に作ること」です。  そのために、「最初の1冊をマスターする」のです。 その気持ちさえ強く持っていれば、別の書籍やサイトを見るのは、問題ありません。

 つまり、他の書籍やサイトを「つまみ食い」だけして腹を満たすのはダメだけれども、「参考として味見する」のは良いのです。 その気持ちをしっかり持つことです。  何を見ても、必ず、「最初の1冊」に帰ってくれば、それで良いのです。 「最初の1冊」をマスターするまでは。

 

常に疑え

 プログラミングの学習において、1つ、重要な「姿勢」があります。

 それは、どんな書籍やサイトやサンプル・プログラムを見ても、「これは間違っているのかも知れない……」と、常に思うことです。 そして、自分の知識もまた、「間違っているのかも知れない」と、常に思うことです。

 そう思えば、何を見ても、自然と「アップデートに努める」事が出来ます。 今見ている、この「知恵ノート」も、私が書いた知恵袋の回答も、盲信してはいけません

 書籍も、サイトも、プログラムも、人が書いたものです。 人は、間違うものです。 間違わない人はいません。

 著者の間違った知識、思い違い、打ち間違い、変換誤り、それらが詰め込まれた書籍やサイト、プログラム、それらを見た人が、また、その間違いを他人に伝えてゆき……伝言ゲームのように、間違いは伝わり、コピーされ、増えていきます。

 初学者の方々は、この先、色々な書籍やサイト、プログラムを見て学ぶ過程で、「書いてある事が違う」「言っている事が違う」「その通りにしても動かない」という事柄を、多々経験するでしょう(時には、規格書でさえも間違っています)。 どちらが正しいのか、あるいは両方とも間違っているのか、その判断は、最終的には、自分でしなくてはなりません。 この、「自分でした判断」が、知識のアップデートにつながるのです。

 

「自分の言葉」で作れ

 言葉というものは、読んでいるだけではうまく書けるようにはなりませんし、聞いているだけではうまく喋れるようにはなりません。 良い小説をたくさん読んでも、良い小説を書けるわけではないのと同様に、プログラミング言語も、自分の手で「書いて」いかなければ、決して上達しません

 うまく書ける・うまく喋れるようになるためには、どうしても、自分の言葉で書く・喋る、という経験を積まなければなりません。

 ですから、初学者を脱したいと本当に願うなら、「自分が作りたいもの」のテーマをたくさん見つけて、それを実際に自分の手で作ってみてください。

 プログラムを実際に作るには、そのプログラムがどういう動作をするのか(仕様)を、細かく決めてやらねばなりませんし、それをプログラミング言語でどう書き表すか、書き表し方が複数あれば、どれがより良いのか、そうした事柄全てを、自分で考える必要があります。 「自分の作りたいものを、自分の頭と手で作る」……これは、最上とは言わないまでも、とても優れた学習方法です。

 「作りたいもの」のテーマは、何でも良いのですが、あまり複雑で高度なテーマを選んではいけません。 仕様の検討からプログラム完成まで1~2日で終わりそうな、簡単なテーマを選んでください(1~2日で終わりそうかどうかは、感覚で構いません)。

 「テキストファイルや文字列をいろいろ処理するプログラム」が、個人的にはオススメです。 テキストファイルや文字列の操作は、大抵の言語において、プログラミングの「基礎体力」を養うのに向いているからです。 画像や音声を扱うのは(多くの初学者の予想よりはるかに)大変である、という理由もあります。

 テキストファイルの中の、特定の文字を、別の文字に置き換える、とか、削除する、とか、出来そうなものなら、何でも構いません。 「車輪の再発明」でも良いので、とにかく、自分でプログラムを新しく作りまくることが、プログラミング上達への道です。

 選んだテーマが2日で終わらなければ、さっさと次のテーマに移ってしまって構いませんし、後日あらためて取り組み直しても構いません。 全体として5割以上のテーマについて完成させる事を努力目標にすれば、充分だと思います。 飽きないようにするのも、長い目で見れば大切な事だからです。

 

早く、たくさん作れ

 数をこなす、という事は、何を習得するにせよ、重要な経験です。

 知識は、1回知れば充分ですけれども、「プログラミング」は、知識だけで出来るものではありません。 先ほど述べたように、「自分の言葉で書く」経験が、プログラミングの勉強には、是非とも必要な事なのですが、それをたくさん経験する、という事も、また同様に重要です。
 1~2日で終わるテーマなら、次々と新しいテーマに取り組む事が出来ます。 1つのテーマに1週間も1ヶ月もかかっていたら、経験を積む事はなかなか出来ません。
(参考:結果を出すためには「質」よりも「量」をこなして学習することが重要 https://gigazine.net/news/20130813-prioritize-quantity-than-quality/

 前項で「簡単なテーマを選べ」と言った理由は、たくさん作って多くの経験を積んでほしいからなのです。 簡単なテーマを選んで、たくさん書いてください。 英語を学ぶ時だって、最初は簡単な会話文をたくさん反復練習するでしょう。 それと同じです。 これこそが、「初学者が最初にするべき事」であると、私は確信します。

 

おわりに

 何を身に付けるにしてもそうだと思うのですが、プログラミングをモノにしたければ、「無駄足かも知れないリスク」を取る勇気と覚悟を持たねばなりません。 もっとも、それをリスクと感じるか、楽しみと感じるかは、人それぞれです。

 世の中には、学校での英語の勉強を嫌々やっていた人もいるでしょうし、英語圏の恋人と話すために嬉々として英語を身に付けた人もいるでしょう。 プログラミングを身に付ける王道とか素質というものがもし有るとするならば、それはプログラミングに「喜び」とか「面白さ」「楽しさ」を見出せるかどうか、なのかも知れません。
 人というものは、面白い事や楽しい事は、たとえ禁止されてもやってしまう動物です。 学者や研究者は、毎日勉強ばかりしていますが、彼らは、あれが楽しくて面白くてしょうがないから、やっているのです。 これで上達しないわけがありません。

 ちなみに、Google のトップ・プログラマの1人にして人工知能研究者であるピーター・ノルヴィグは、Teach Yourself Programming in Ten Years(10年がかりでプログラムを学ぼう) http://norvig.com/21-days.html というサイトで、「急がず、楽しみとしてやること」の大切さを説いています(日本語訳サイト https://www.yamdas.org/column/technique/21-daysj.html )。 重要な心構えをシンプルに説いたサイトですので、初学者にとって一読の価値が有ると思います。

 

付録

 「簡単な課題をたくさん、と言われても、そもそも課題が思いつかない……」という方もいるでしょう。 そんな方のために、私も時々覗きに行っている、各言語の学習サイトを1つ紹介します。
http://judge.u-aizu.ac.jp/onlinejudge/

 まず、右上の「日本語」を押して、「ログイン」から Sign in して自分のアカウントを作り、ログインしましょう(成績を残すために必要です)。
 次に、左上の「問題セット」から、「Volume 100」を選んでみてください。課題番号 10000 から、いくつかの設問が用意されています。

 表の各欄は、左から、旗、国旗、タイトル、時間(実行時の時間制限)、メモリ(実行時のメモリ制限)、成功率、状態、です。
 「旗」は、色によって、課題結果がどう判定されるかを示しています。 基本的には、水色(通常審判)の設問だけをやれば良いでしょう。
 「国旗」は、その国の言語で課題が用意されているかどうかを示しています。
 「時間」は、課題を解くプログラムの実行時間上限です。 実行してみてこれを越えたら、たとえ結果が正しくても不正解となります。
 「メモリ」は、同じくメモリ量上限です。
 「成功率」は、過去の挑戦者達の実績です。 課題の難易度とおおむね比例しています。
 「状態」は、自身の未挑戦課題が challenge であり、既に解き終わった課題が Solved になります。

 たとえば 10000: Hello World. を選ぶと、その問題が出題されます。 ソースプログラムを作成したら、課題画面右上の Submit アイコンから提出しましょう。 言語は、C、C++C++11、JavaC#、D、RubyPythonPHPJavaScript が選べます。 提出すると、このサイト内で、自動的に実行され、結果が合否判定されます。 簡単な課題であれば1秒くらいで結果が分かります。

 合否判定結果は、「問題セット」の Volume 100 から見ても分かりますし、直近 200 提出の結果については、画面上部「ステータス」の「最新の 200件」からも見る事が出来ます。 惜しくも不正解だったら、再挑戦するか、後回しにします。

 なお、ここの合否判定は、改行1つが過不足でも不合格という、厳しいものです。 「おかしい、絶対に合っているはずだ!」という場合は、改行や空白について疑ってみてください。

 「問題セット」の Volume 100 は、本当に基本の問題です。 これをスラスラ解けるならば、とりあえず「そのプログラミング言語が使える」と言って良いでしょう。 しかし「プログラミングが出来る」と言えるようになるには、より上の課題を消化しなければなりません。

 「問題セット」の Volume 0 以降は、高校生レベル以上のプログラミング・コンテスト課題です。 腕に覚えがあるなら、どんどん挑戦してみてください。
(転載以上)