プログラミング経験がないところからJavaScriptの勉強をスタートしておよそ八ヶ月になります。
まだわからないことはたくさんありますが、難題だったコールバックや非同期処理をある程度使えるようになったり、Node.jsを活用できるようになったり、他の言語(AutoHotkeyとか)を多少書けるようになったり、コマンドプロンプトでGitを利用できるようになったり、プログラミングやコマンド周りの壁をいくつか乗り越えたところで、ここまでの所感をまとめておきたいと思います。(経緯についてご質問のメッセージをいただいたこともあり)
これまでに他の記事に書いたことと重複する部分もありますが、あまりわかりやすく書いてこなかったと思うので、書き直すことにも意味があるだろうと思って改めて書くことにします。
プログラミングをほぼゼロから学ぶにあたり、障害になっていると感じたことが三つほどあります。
- 日本語じゃない
- 人間用の言語じゃない
- プログラミング的発想を普段そんなにしていない
この三点です。
まず一つ目、「日本語ではない」ということ。英語が得意な方にはあまり共感されないかもしれませんが、プログラムを書くために用いる言葉が母語ではないために、「言葉に慣れていない」ということを「プログラミングが難しい」と混同する可能性が結構あると思います。出てくる単語出てくる単語、いちいちイメージが浮かばなくて「調べないと動きが想像すらできない」ということになるわけです。それはプログラミングの難しさとは全然関係ないことですが、プログラミングに挑戦しようとして直面することなので、プログラミングの壁として立ちはだかるように感じてしまうところがあります。
二つ目の「人間用の言語でない」というのは、特に所謂文系人間にはつらいところかもしれません。自然言語を基準にして考えると、プログラミング用の表現というのは全然直感的ではありません。形式はもちろんのこと、括弧の種類やピリオド、カンマ、コロンなど、日常的に目にしていても用法について考える必要があまりない記号類にも、それぞれ固有の意味があり、それらを正しく使わなくてはなりません。更には、「等しい」「または」「かつ」などを示す際にも馴染みのない記法をあれこれ覚える必要があります。そのうち慣れますし慣れれば自然と使えるようにはなりますが、最初の最初は外国語をイチから勉強するがごとき苦労があるように思います。
これら二点については、私の場合はプログラミングの勉強を始める前に数カ月間CSSの習得に取り組んでいたことで、少しハードルが下がったように思います。CSSというのは指令を出して何かを動かすものではないので、プログラミング的発想の足掛かりになったわけではありませんが、コンピュータ的な記述方法で書いてコンピュータに解ってもらう、ということの訓練になりました。後から振り返ってそうだったのだと思ったことですが、人工言語に馴染む一歩として大きな役割を果たしていたと思います。
三つ目、「プログラミング的発想を普段していない」というのは、プログラミング教育を受けていないわれわれ世代には少々高い壁になっているかもしれません。「~~と書けば……という結果が得られる」ということをいくら覚えても、それをどう組み合わせて何をする必要があるのかがわからなければ(思いつかなければ)、ツールとして使えるものにはなっていかないのです。
この点について「こうすれば良いですよ」と語れることは私にはないのですが、私が心がけたことは、再現したいものについて「実際に何がどうなることになるのだろう」ということを熟考することです。人間の感覚で考えると自分にとっての「意味」に引きずられがちですが、「情報」がどう「動いていく」必要があるのか、どうすればコンピュータが解釈し得るのか、それを「こうすれば情報はきちんと然るべきところに辿り着くぞ」という確信を得るまで考える。
プログラミングをする人は当たり前にやっているであろうことですが、プログラミング未経験者としては少し負荷が高いことに思えます。でも、確信を得た時の「これでいけるはずだ!」という発見の喜びは他ではなかなか得難い知的感動だと思います。
私自身が具体的に勉強をどうしていったか、ということもまとめておこうと思います。完全に独学でやった場合のことであり、これが良いということではありません。
- 初心者向けの解説サイトで基礎を覚える
- その時点でできそうなことを色々やる
- おみくじとかじゃんけんとか、ごく単純なメモツールとか
- やりたいことを実現できるらしいメソッドを検索して試す
- ツールとして使えるものを色々作ってみる
- その後で本を読む
- メソッドを全部解説しているサイトを「読む」
勉強を始める前に解説本をちらっと見たのですが、手を動かしていない状態でいきなり読んでもわけがわからないという感じがしたので、初動で本を活用するのは諦めました。(読んでイメージできる人は本の方がサイトより体系的で俯瞰しやすいので役に立つと思います。)
ということで、Web上に情報を提供してくれていることに感謝しながら、Web上で見てWeb上のオンラインエディタで書いて試す、ということを繰り返して勉強しました。解説サイトとエディタが一体になっている学習サービスも色々あるかと思いますが、私は記事の連載の形で書かれたものを見ながらTypeScript: プレイグラウンド - TypeScriptとJavascriptを探求するためのオンラインエディタで試しました。(なおTypeScriptの記法に沿っていないJavaScriptのコードはエラーが表示されることがしばしばありますが、実行すれば動きます。私は最初の最初TypeScriptから始めたのでこちらをよく利用しました。)
六番目の「メソッドを全部解説しているサイトを『読む』」というのは、メソッドを調べる時に辿り着くサイト(特にJavaScript | MDN)を、検索して辿り着いた部分だけでなく、書かれているメソッド全部について一通り読んでいくということです。私もまだ途中ですが、だいぶ解るようになってから読むと「なんとそんな便利なメソッドが!」と感動できます。
勉強する中で、自分の中でポイントになったことが三点あります。
- 慣れないものは慣れるまで繰り返す
- よくわからないものはとりあえずスルーする
- 仕組み上難しいことは最初から諦める
声を大にして何度でも強調したいのが、「慣れるまで繰り返してから次に進むべし」ということです。初心者向け解説サイトはとてもわかりやすく書いてあるので、読むだけで「なるほど」と思うことができます。しかし、じゃあそのページを閉じて今見たものを再現できるかというと、これがなかなかそうはいきません。そうできないと実際にプログラムは書いていけないわけですが、「なるほど」感の割に全然そうできないのです。「alert("Hello World!");」に「この程度のこと理解できないはずがない」と思っても、最初の最初はそれだけのことが見ないでは再現できなかったりするわけです。
特に私が繰り返したのは「条件分岐」と「forループ」です。JavaScriptでツールを作る時、素人がやりたい範囲でツールらしさを構築する上で必要なことというのはほとんど「条件分岐」と「forループ」でまかなえるように思います。一方、素人目には一見して仕組みが分かりづらいものでもあります。If分岐は難しくないですが、do...whileやswitch文はちょっと考えないと捉えにくいように思いますし、forループに至ってはforに続く括弧の中に初期化式・条件式・加算式とあって一読で意味を理解するのは困難だと思います。とりあえず定型文として覚えて使えるようにすることが大事です。
次に「よくわからないものはスルーする」ということが私の中では重要でした。今しがた書いたforループの中身も、もちろん最初に理解してしまえればそれが一番良いのですが、とりあえずは「ループ処理ができる」ということさえ獲得できればそれ以上のことはよくわからなくていいとしました。
他にはアロー関数やコールバックがスルー対象でした。今はもうある程度わかるようになりましたが、最初はなんのこっちゃでしたし、まあ使わなくてもツールは作れるわけです。使えるようになってみると確かに劇的に軽やかにはなるのですが、それで「できること」が劇的に増えたのかというと、それはそうでもありません。
他にも、私がやりたいことをスパッとやってくれるメソッドが言語の中に既に存在しているのに、その存在に気づいていなかったり、説明を読んでも使い方が理解できなかったりして、わざわざ自分で関数を作っていたということがかなりたくさんあります。多分プログラミングの巧者にコードを見られたら馬鹿だなあと笑われるような記述が山程あったと思いますが、でもプログラムは動くのです。jsファイルの中身さえ見られなければそれっぽいツールができているわけです。
私の目的は綺麗なコードを書くことではなく、自分がほしいツールを自分で作って動かすことです。コードがどれだけダサくて汚くても、動けば私の勝ちなのです。そしてコーディングがわかってきたら、後から書き直して整えていけばいいことだと思います。いずれにせよ金をもらってやっている職業プログラマーじゃないのですから、そんなに構える必要はないと思っています。
最後の「仕組み上難しいことは最初から諦める」というのは、なぜ自分でツールを作るのかということに関わることでもあります。プロが作ったちゃんとしたツールを使えるなら、そっちの方が断然賢明な選択です。プログラミングは魔法のようですが、多少齧った程度では全てを解決してくれはしません。
難しいことは難しいがゆえに今ここで例示して説明することもできないのですが、例えば一つだけ挙げると、クラウド連携は早々に諦めました。Web技術(HTML、CSS、JavaScript)によってWebブラウザをツール化する時、セキュリティの都合上ローカルファイルにアクセスできないので代わりにDropboxやGoogleドライブと連携するという手があるのですが、初心者には些かハードルが高いと感じました(Dropbox連携はちょっとやりましたが、ログイン状態を維持する処理で挫折しました)。
ローカルファイルを扱えない=データをブラウザの中の保存領域に置くしかないというのはファイルの取り回しとして大きな制限なので、クラウド連携についてはこうできたらいいなと早いうちから夢想することになると思いますが、日頃種々のデジタルツールで当たり前にやれていることである一方自力で実現するのは容易ではありません。(なお、Electronというフレームワークを習得すればローカルファイルを扱えるようになるので、そこまでいければクラウドにファイルを置くということが自動的に可能になります。)
プログラミング言語を習得するにあたっての所感はこんなところですが、そもそもどうしてプログラミングをやりたいのかということはよく考える必要があるかもしれません。
私の動機は以前書いたので細かくは繰り返しませんが(JavaScript日誌:一歩進んだら十回足踏みせよ)、具体的にやりたいことがあったのと、「プログラミングができない」という劣等感を解消したかったというのが大きい理由です。記事を今読み返して「そうだったか」と思いましたが、ツールづくりをするということはそんなに考えていませんでしたね。まずどこまでできるものなのか全く想像がついていなかったので、何も思い描けていなかったのです。
具体的に作りたいものが先んじてあればモチベーションとして強力なのは確かです。しかし、漠然と「プログラミングができない自分」に不満があるというだけでもチャレンジする意味は大いにあると思います。ただ大事なのは、いつも楽しくやることだと思っています。
私はこの八ヶ月間ずっと楽しくJavaScriptのコードを書いていました。説明を読んでもちんぷんかんぷんなことはたくさんあって、「説明がわからない自分」に多少もやもやすることはありましたが、でもまあ、その記述がわからなくても、できるようになったことがたくさんある喜びと比べればそんなのは些末なことです。理解が及ばないがゆえにへんてこな自作関数山盛りでごちゃごちゃやっているダサさ極まるコードでも、自分でアウトライナーを作れたことの方が私にとっては重要です。
ちゃんとやろうと身構えて取り組んでしまったせいで変にコンプレックスを増加させてしまったら元も子もありませんから、気楽なゲーム感覚でやるのが良いと私は思います。(過去にそうして失敗したという経験談です。)
なお、いつも自分の挑戦について「自作ツールを作っている」というふうに表現してきましたが、「ツール」という言葉に含まれ得る範囲の中ではごくごく一部のことしかやっていないので、今度から「自作デジタルノート」と書くことにします。メモアプリやアウトライナー、付箋ツール、単語帳などのような、文字情報を自分が理解・操作・処理しやすいように加工したりピックアップしたりする種のツールということです。
「なぜ自分でツールを作るのか」という問いを先程ちらっと書きましたが、私にとっては「自分が求める形で情報を表示してくれるデジタルノートが世の中に存在しないから」ということがその理由です。デバイスを横断する連携の可否よりも、自分が見たい形で見たいものを表示してくれること、自分が書きたい形で書ける欄を生成してくれること、その二つが遥かに重要なのです。
デジタルノートツールを作るというのは、ノートの内容を格納したデータベースと、その内容をHTML要素に然るべき形で配置したりHTML要素からデータベースに内容を保存したりするスクリプトを用意することで成り立っています。逆に言うと「それだけのこと」なので、見た目の自由自在感の割に、必要な技術はそんなに多くはありません。プログラムの動きを確認しやすいこともあり、初心者でも気軽に挑戦できることだと私個人としては思っています。