独学でプログラミングを身につけようとしている方へ

独学でプログラミングを身につけようとしているものの…

- そもそも何から始めれば良いかすら分からない
- 始めたは良いが訳が分からず挫折しそう
- 頑張っているのに上達しそうにない

…といった方を対象に、少しでも前に進むキッカケになればいいな…と、現実逃避しながら書いた**ポエム**です。

--------------------------------------------------------------------------------

## 独学には向いてない人

経験談ですが…[^1]

[^1]: 記事の内容には、大昔に講師のアルバイトをやっていた上での経験談も多く含まれています。

- エクセルのセルを右クリック⇒コピーし、Web管理画面に右クリック⇒ペーストして入力していく。

…という作業があったとします。

これに対して「そういうものなのだ」と何の疑問も持たずに、ひたすら1時間でも2時間でも作業を続けられる方は、キツイ事を言うようですが、独学でプログラミングを身につけるのは難しいと思います。

逆に、どんな些細な事であっても「面倒だからもっと楽をしたい」「本当にそのやり方がベスト？」と思うタイプの人は、大丈夫だと思います。

これは頭の回転の良し悪し・記憶力・論理的思考力…というよりは性格の問題ですので、独学以外の別のアプローチをオススメします。

--------------------------------------------------------------------------------

## 作りたいものをハッキリと頭に描く

いきなり挫折する人は、まずこれができていない事が多いです。

1. スマホのアプリを作りたい
1. 人が集まるコミュニティサイトを作りたい

何でもいいんです。その代わり、**できる限り具体的に**イメージした方が良いです。

1. 写真にコメントを付けてアルバムにするアプリを作りたい
1. コピペで使える正規表現のスニペット共有コミュニティを作りたい

できれば頭の中だけではなく、チラシの裏に手書きで書いたラクガキでも良いので、文字や画像にしてみると良いです。Webアプリであれば、マネしたいWebサイトを探してみるのも良いと思います。

これができていない内にプログラミングを始めるのは、目的も何もないのに、いきなり飛行機に飛び乗るようなものだと思います。普通は、「美味しい海鮮丼を死ぬほど食べたい！」という目的があるからこそ、羽田発函館行きの飛行機に乗るものです。

--------------------------------------------------------------------------------

## 好きこそ物の上手なれ

「好きこそ物の上手なれ」という諺がありますが、嫌々やっていても上達は遅いです。「楽しい！面白い！」と感じることが、何よりの原動力となります。

基本から学ぶ事は非常に大切ではありますが、そこで挫折してしまったのでは意味が無いと思います。性格にもよるでしょうが、ひたすら訳の分からない文字列と格闘するよりは、**とりあえず目に見える結果**を出した方が、「楽しい！面白い！」と感じる人も多いのではないでしょうか。

そのための手っ取り早い手段として、他人が作ったものを自分流にカスタマイズ(改造)してみるという方法があります。

幸い、Googleで検索すれば大抵何かは見つかる時代です。「これは良いな！」と感じたものがあればソースをダウンロードして、「あいうえお」と書いてあるものを「アイウエオ」にしてみるだけでも良いので、適当に改造してその結果を見ながら楽しんでみてはどうでしょうか。

--------------------------------------------------------------------------------

## とりあえず適当でもOK

最初から完璧に書ける人はいません。

「木を見て森を見ず」という諺もありますが、細かい部分にずっとこだわっていても、なかなか先には進まない事もよくあります。

基本から学ぶ事は非常に大切ではありますが[^2]、とりあえず適当でも良いので、まずは目に見えるもの・動くものを作ってみるのも大事な事です。

[^2]: 大事なことなので二回目を書きました。

たとえ適当に作ったとしても、先述の「作りたいものをハッキリと頭に描く」事ができているのであれば、必ず「もっと良いものにしたい！」という欲が出てきます。その欲に応じて、より高みを目指し学習を続けていけば良いのではないかと思います。

--------------------------------------------------------------------------------

## プログラミング言語のちょっと変わった？選び方

独学するプログラミング言語の選び方として、「作りたいもの(目的)に応じて選ぶ」というのが一般的だと思いますが、異なるアプローチとして、「自分の性格に合わせて選ぶ」というのも**場合によっては**[^3]アリだと思います。

[^3]: あえて強調してますので、野暮なツッコミは無しの方向で。

例えば、Webアプリを作るスクリプト言語としては…

- PHP
- Perl
- Ruby
- サーバサイドJavaScript
- ASP.NET
- Python

…等たくさんの選択肢がありますが、PHPは私のような適当な性格の人向き[^4]、Pythonは優等生でキチンとした性格の人向き、Rubyはどちらかといえば前者だが "enjoy programming[^5]" するには他の言語の経験があった方が良い…等、言語にも様々な性格があります。

[^4]: その分、某巨大掲示板管理人の言葉ではないですが、「間違いは間違いであると見抜ける人でないと正しく書くのは難しい」言語でもあります。

[^5]: Ruby開発者まつもとゆきひろ氏の言葉で、それはそのままRubyの設計思想にも繋がっています。

言語にも性格がある ＝ 使う人との相性もあるという事です。

気の合わない友達より気の合う友達と遊んだ方が楽しいに決まっています。現在は1つの目的に対して手段が溢れているため、言語を選ぶだけでも色々と悩むでしょうが、このようなアプローチから選んでみるのも、先述の「楽しい！面白い！」に繋がってくるかもしれません。

--------------------------------------------------------------------------------

## エラーに怯む必要はない

特に英語への苦手意識がある人に多いのですが、エラーが出ると怯んでしまう人がいます。

大丈夫です。「◯行目のここがオカシイよ」と教えてくれていたりするだけで、そんなに難しいメッセージではない事が大半です。内容をGoogle翻訳に通しても良いですしGoogle検索しても良いです。

エラーを恐れず、たくさんのコードを書いてたくさんのエラーを経験した方が、上達は速いです。「エラーは友達[^6]」「エラーの数だけ強くなれる[^7]」です。

[^6]: 元ネタは某有名サッカー漫画。

[^7]: 元ネタは某有名曲の歌詞。

--------------------------------------------------------------------------------

## 検索上手・質問上手になる

上達が遅い人の特徴として、Google検索の仕方がヘタ・質問の仕方がヘタというのがあります。

Googleは、世界トップレベルの天才達が作った非常に優れた検索エンジンです。Google大先生に聞けば、大抵の事は解決します。

[Google検索には、様々な検索オプションや検索テクニックがあります](https://www.google.co.jp/search?q=Google+%E6%A4%9C%E7%B4%A2+%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF&ie=UTF-8&oe=UTF-8)ので、プログラミングの息抜きに確認してみてはどうでしょうか？

また、他人へ質問する際は、早く解決したいという気持ちは分かりますが、「もし自分が質問を受ける側だったら、どういう質問のされ方なら的確な答えを返せるか」を考えてみると良いです。

そこを考える内に、分からない事の本質が見えてくる事もよくあります。

質問をするまでに時間がかかってしまうかもしれませんが、そこまで考えた上で質問した方が、結局解決までにかかる時間は短くなる場合が多いです。

--------------------------------------------------------------------------------

## できない事はできる人に任せても良い

プログラミングを勉強している人なら、[車輪の再発明](https://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E)という言葉を1回ぐらいは聞いた事があるでしょうか。

「賢い人が作った素敵なコードがあるならそれを使えばいいじゃない」という感覚は、プログラミングにおいて非常に大切ですが、そこは理解した上で、学習のためにあえて車輪の再発明にチャレンジする事も同じぐらい大切です。

また、「手を抜く」事と「効率よく作る」事とは、全く意味が違います。

このあたりのバランス感覚は、経験を積まないと難しいところもありますので、分からない・できそうにない事は、とりあえずできる人(の書いたコード)に任せてしまっても良いです。

素敵なコードがないかGoogleで検索したり、[stack overflow](https://ja.stackoverflow.com/)や[teratail](https://teratail.com/)等の質問サイトを活用すると良いと思います。

--------------------------------------------------------------------------------

## 思考の伴わないコード丸写しは時間の無駄

黒板をそのままノートに写したり教科書をノートに丸写したり…綺麗なノートを作っている割にテストの成績はイマイチの人、学生時代に1人は居たと思います。

ノートを作る事が、ただの作業 かつ ゴールになってしまっている人ですね。

本やWebページに書いてあるコードを見よう見まねでキーボードで打ち込んでいると、何だか頑張っている気にはなります[^8]が、思考が伴わない(伴いそうにない)状態で一字一字打ち込む行為は、ただの作業であり時間の無駄です。

[^8]: その事がモチベーションを維持する原動力になっているのであれば、否定はしません。

その時間は、より多くのコードに触れる時間に費やした方が有意義だと思います。

--------------------------------------------------------------------------------

## 理解の確認は何も知らなかった過去の自分に教えるつもりでまとめてみる

プログラミングに限った話ではないですが、第三者に物事を分かりやすく説明するためには、その物事を深く深～く理解している必要があります。

自分がどの程度理解できているかを確認する際は、何も知らなかった過去の自分に教えるつもりで、[Boostnote](https://boostnote.io/)のようなアプリ[^9]やQiita等を活用して、資料としてまとめてみると良いと思います。

[^9]: 「そこは[Kobito](https://kobito.qiita.com/)だろ！」というツッコミはスルー。Boostnoteの必要最小限かつ十分という絶妙なバランスが気に入っています。

その過程で、どこまでが理解できていてどこが理解不足なのかが、自ずと明らかになってくる事も多いです。

--------------------------------------------------------------------------------

## ソースコードはコメントを付けて全て残しておく

自分の書いたソースコードは、どんな些細なものであっても全てが**財産**になります。

できる限り詳細なコメントを付けて[^10]、全て保存しておく事を強くオススメします。

[^10]: コードの説明ではなく、「何をどう考えてそのように書いたか」というコメントでも良いです。

1年2年…数年経った後に見返すと、自分がどれだけ成長できたかという自信にも繋がってくると思います。

--------------------------------------------------------------------------------

## クールダウンも大切

プログラミングの学習は、頂上の無い山を登るようなものだと思います。

行き詰った時は、休んだり気分転換をしましょう。個人的には、ジッと休むよりは少し体を動かした方が調子が良くなるので、机周りや部屋の片付けをよくやります。綺麗になって一石二鳥です。

そうやってリラックスしていると、ある時突然、それまで全く分からなかった事が、一皮むけたように急に分かり始める事もしばしばあります。

--------------------------------------------------------------------------------

## すぐに実行して結果を確認できる環境を

先述のとおり、何かの拍子に急に稲妻のようにコードを閃く事があります。それはご飯を食べている時かもしれませんし、お風呂に入っている時かもしれません。

しかし、特に私のような鳥頭だと、それこそ三歩歩いたら忘れてしまう事もあります(汗)

「プログラミングはまずは環境構築から」とよく言われますが、いきなりそこで挫折する人も少なからずいます。完璧な環境構築は後回しでも良いので、まずは書いた**コードをすぐに実行して結果を確認できる環境を構築する事を最優先**にすると良いと思います。

閃いたコードが意図した通りに動くと、それは先述の「楽しい！面白い！」にも繋がってきます。

- 例：[PHP・Ruby・Perl等のスクリプト言語をサクっと書いてサクっと実行(EmEditor編)](https://qiita.com/fallout/items/0d4f221e176d6521091f)

--------------------------------------------------------------------------------

## 自信を持つ

精神論かもしれませんが、プログラミングに限らずスポーツでも何でも、自信なくやっていると本来持っている能力は発揮できないものです。

大した根拠は要らないので、「こんな難しい事を独学している自分はできる子だ！」と自信を持っていた方が、自分の持つ能力を発揮できる筈です。

「もう駄目だ」と自信を失うぐらいなら、先述の通り休んだり気分転換しても良いのではないでしょうか。

何をするにしても、否定から入らず、ポジティブ思考で**まずはやってみる**という姿勢は、非常に大切だと思います。

プログラミングを独学で身につけたい！ 素晴らしい姿勢だと思います。自信を持ちましょう。

--------------------------------------------------------------------------------

## 「就活に活かしたい」は危険かも？

プログラミングの独学を始めるキッカケとして、「就活に活かすため」を理由に挙げる人は多いです。それがモチベーションに繋がっているのであれば、ここは読み飛ばしてください。

逆に、もしそれがプレッシャーになっているのであれば、気負いする必要はないです。実務経験のないエンジニアが会社の役に立てる事は、ほとんどありません。それは当たり前の事です。

良い大学に入学し就職間際で少しプログラミングを独学してみた人よりも、専門学校で経験を積んできた人の方がバリバリと仕事をこなし、前者の人は挫折してしまいやがて退職…という光景は珍しくありません。

気負いせずに、もっと気持ちに余裕を持った方が良いと思います。

なお、経験談ですが、**「就活に活かすため」を理由に挙げる人の特徴として、先述の「作りたいものをハッキリと頭に描く」ができていない事が非常に多い**ですので、その点は特に注意しましょう。

--------------------------------------------------------------------------------

## プログラミング経験はプログラマにならなくても必ず活きる

たとえプログラミングに関する業務に就かなくても、プログラミング経験は必ず役に立ちます。断言します。絶対に役に立ちます。

世の中には、「いかに楽をして・ミスなく・速やかに結果を出すか」という合理的な考え方ができる人と、それができない人とがいます。後者はしばしば、生産性の低い人とも言い換えられます。

プログラミング経験は、前者のような考え方を強力に後押ししてくれます。

--------------------------------------------------------------------------------

## 最後に

以上、長々と書いてしまいましたが、何か1つでも心に響き前進の糧となりそうなものがあれば幸いです。
<sub style="font-size:50%">何も無かったらゴメンナサイ。</sub>